詳細解析SparkStreaming和Kafka集成的兩種方式的區別和優劣

spark streaming是基于微批處理的流式計算引擎,通常是利用spark core或者spark core與spark sql一起來處理數據。在企業實時處理架構中,通常將spark streaming和kafka集成作為整個大數據處理架構的核心環節之一。

針對不同的spark、kafka版本,集成處理數據的方式分為兩種:Receiver based Approach和Direct Approach,不同集成版本處理方式的支持,可參考下圖:
在這里插入圖片描述

Receiver based Approach

基于receiver的方式是使用kafka消費者高階API實現的。

對于所有的receiver,它通過kafka接收的數據會被存儲于spark的executors上,底層是寫入BlockManager中,默認200ms生成一個block(通過配置參數spark.streaming.blockInterval決定)。然后由spark streaming提交的job構建BlockRdd,最終以spark core任務的形式運行。

關于receiver方式,有以下幾點需要注意:

  1. receiver作為一個常駐線程調度到executor上運行,占用一個cpu

  2. receiver個數由KafkaUtils.createStream調用次數決定,一次一個receiver

  3. kafka中的topic分區并不能關聯產生在spark streaming中的rdd分區
    增加在KafkaUtils.createStream()中的指定的topic分區數,僅僅增加了單個receiver消費的topic的線程數,它不會增加處理數據中的并行的spark的數量
    【topicMap[topic,num_threads]map的value對應的數值是每個topic對應的消費線程數】

  4. receiver默認200ms生成一個block,建議根據數據量大小調整block生成周期

  5. receiver接收的數據會放入到BlockManager,每個executor都會有一個BlockManager實例,由于數據本地性,那些存在receiver的executor會被調度執行更多的task,就會導致某些executor比較空閑

建議通過參數spark.locality.wait調整數據本地性。該參數設置的不合理,比如設置為10而任務2s就處理結束,就會導致越來越多的任務調度到數據存在的executor上執行,導致任務執行緩慢甚至失敗(要和數據傾斜區分開)

  1. 多個kafka輸入的DStreams可以使用不同的groups、topics創建,使用多個receivers接收處理數據

  2. 兩種receiver

可靠的receiver:可靠的receiver在接收到數據并通過復制機制存儲在spark中時準確的向可靠的數據源發送ack確認

不可靠的receiver:不可靠的receiver不會向數據源發送數據已接收確認。這適用于用于不支持ack的數據源。
當然,我們也可以自定義receiver。

  1. receiver處理數據可靠性默認情況下,receiver是可能丟失數據的
    可以通過設置spark.streaming.receiver.writeAheadLog.enable為true開啟預寫日志機制,將數據先寫入一個可靠地分布式文件系統如hdfs,確保數據不丟失,但會失去一定性能

  2. 限制消費者消費的最大速率

涉及三個參數:

spark.streaming.backpressure.enabled:默認是false,設置為true,就開啟了背壓機制

spark.streaming.backpressure.initialRate:默認沒設置初始消費速率,第一次啟動時每個receiver接收數據的最大值

spark.streaming.receiver.maxRate:默認值沒設置,每個receiver接收數據的最大速率(每秒記錄數)。每個流每秒最多將消費此數量的記錄,將此配置設置為0或負數將不會對最大速率進行限制

  1. 在產生job時,會將當前job有效范圍內的所有block組成一個BlockRDD,一個block對應一個分區

  2. kafka082版本消費者高階API中,有分組的概念,建議使消費者組內的線程數(消費者個數)和kafka分區數保持一致。如果多于分區數,會有部分消費者處于空閑狀態

Direct Approach

direct approach是spark streaming不使用receiver集成kafka的方式,一般在企業生產環境中使用較多。相較于receiver,有以下特點:

  1. 不使用receiver

a. 不需要創建多個kafka streams并聚合它們

b. 減少不必要的CPU占用

c. 減少了receiver接收數據寫入BlockManager,然后運行時再通過blockId、網絡傳輸、磁盤讀取等來獲取數據的整個過程,提升了效率

d. 無需wal,進一步減少磁盤IO操作

  1. direct方式生的rdd是KafkaRDD,它的分區數與kafka分區數保持一致一樣多的rdd分區來消費,更方便我們對并行度進行控制

注意:在shuffle或者repartition操作后生成的rdd,這種對應關系會失效

  1. 可以手動維護offset,實現exactly once語義

  2. 數據本地性問題。在KafkaRDD在compute函數中,使用SimpleConsumer根據指定的topic、分區、offset去讀取kafka數據。

但在010版本后,又存在假如kafka和spark處于同一集群存在數據本地性的問題

  1. 限制消費者消費的最大速率

spark.streaming.kafka.maxRatePerPartition:從每個kafka分區讀取數據的最大速率(每秒記錄數)。這是針對每個分區進行限速,需要事先知道kafka分區數,來評估系統的吞吐量。

更多干貨搶先看: 大數據技術干貨匯總 —— 助力迎接復雜多變且充滿機遇的2025

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98821.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98821.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98821.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kite Compositor for Mac v2.1.2 安裝教程|DMG文件安裝步驟(Mac用戶必看)

Kite Compositor? 是一款專為 ?macOS? 設計的 ?輕量級界面設計 & 動畫制作工具,它可以讓你像拼圖一樣直觀地 ?創建、編輯和預覽用戶界面(UI)以及動畫效果。 一、下載文件 首先,你得先把這個 ?Kite Compositor for Mac …

【逆向】Android程序靜態+動態分析——去殼

對提供的 CrackmeTest.apk 進行逆向分析,程序含有反調試機制(加殼),通過靜態補丁反反調試(去殼),再動態調試獲取其中密碼。 目錄 環境 基礎 實驗內容 靜態分析 動態分析 反反調試 再動態…

Rust 開發環境安裝與 crates.io 國內源配置(Windows / macOS / Linux 全流程)

Rust 這幾年在系統編程、WebAssembly、區塊鏈、后端服務領域越來越火,很多開發者都在嘗試用它做一些新項目。 但是國內安裝 Rust 開發環境時,經常遇到 安裝慢、依賴拉不下來、crates.io 超時 等問題。本文結合個人踩坑經驗,整理了一份 跨平臺…

Nginx SSL/TLS 配置

Nginx SSL/TLS 配置指南:從入門到安全強化前言一、環境準備:Nginx安裝配置1.1. **EPEL倉庫配置**:1.2. **Nginx安裝**:1.3. **服務啟停管理**:1.4. **服務狀態驗證**:二、SSL/TLS證書獲取方案方案A&#xf…

Java ReentrantLock和synchronized的相同點與區別

1. 核心概念與定位synchronized:Java 內置的關鍵字,屬于 JVM 層面的隱式鎖。通過在方法或代碼塊上聲明,自動實現鎖的獲取與釋放,無需手動操作。設計目標是提供簡單易用的基礎同步能力,適合大多數常規同步場景。Reentra…

【npm】npm 包更新工具 npm-check-updates (ncu)

npm 包太多了,一個項目有那么多依賴包,它們的升級管理需要一個工具:npm-check-updates: 安裝: npm install -g npm-check-updates安裝之后,就可以使用它的命令:ncu 查看哪些包可以升級&#xff…

go資深之路筆記(一) Context

一、 Context 的正確使用與底層原理 1.結構體 type Context interface {// Deadline 返回此 Context 被取消的時間點。// 如果未設置截止時間,ok 為 false。Deadline() (deadline time.Time, ok bool)// Done 返回一個 channel。當 Context 被取消或超時后&#xff…

VS2022 + Qt5.9 中文亂碼/項目設置utf-8編碼

🛠? 解決QT5.9 VS2022中文亂碼的全面方案 📁 1. 檢查文件編碼與編譯器設置 確保源文件是 帶BOM的UTF-8 編碼對MSVC編譯器很重要。VS2022默認可能使用本地編碼(如GB2312)解析源文件,即使文件以UTF-8保存。 查看和設置…

數據庫--MySQL數據管理

數據庫–MySQL數據管理 文章目錄數據庫--MySQL數據管理1.外鍵管理2.數據庫數據管理3.DML語言3.1添加數據3.2修改數據3.3刪除數據4.練習1.外鍵管理 外鍵概念 如果公共關鍵字在一個關系中是主關鍵字,那么這個公共關鍵字被稱為另一個關系的外鍵。由此可見,…

【C++練習】13.C++輸出九九乘法表的方法詳解

目錄 C++輸出九九乘法表的方法詳解 方法1:雙重for循環(最基礎) 思考: 代碼分析: 特點: 方法2:使用while循環 思考: 代碼分析: 特點: 方法3:使用遞歸實現 思考: 代碼分析: 特點: 方法4:格式化輸出(對齊美觀) 思考: 代碼分析: 特點: 方法5:使用函數封裝 思考…

MVC及其衍生

MVC 把軟件分成模型(Model)、視圖(View)、控制器(Controller)三個基本部分。 事實上對應著 Controller——輸入 用戶交互,將輸入處理成Controller能處理的形式 Model——處理 描述狀態、邏輯規律…

微碩WINSOK MOS管WSF3089,賦能汽車轉向系統安全升級

隨著汽車電子化程度不斷提高,轉向系統對高效功率器件的需求日益增長。微碩WINSOK推出的N溝道Trench MOS管WSF3089,以30 V/72 A大電流、4.5 mΩ超低導通電阻和TO-252-2L緊湊封裝,為EPS(電動助力轉向)電機驅動、電源管理…

淘寶拍立淘接口的接入與應用||item_search_img-按圖搜索淘寶商品(拍立淘)

淘寶拍立淘接口的接入與應用如下:接入流程注冊與認證:開發者賬號注冊:訪問淘寶開放平臺,進行開發者賬號注冊。創建應用:在控制臺創建新應用,獲取 App Key 和 App Secret,這是接口調用的憑證。申…

Python學習-day8 元組tuple

元組(Tuple)是Python中一種不可變的序列類型,用于存儲多個有序元素。與列表(List)類似,但元組一旦創建后不能修改(不可添加、刪除或修改元素),這使得它在安全性、性能優化…

大數據畢業設計選題推薦-基于大數據的國家醫用消耗選品采集數據可視化分析系統-Hadoop-Spark-數據可視化-BigData

?作者主頁:IT畢設夢工廠? 個人簡介:曾從事計算機專業培訓教學,擅長Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等項目實戰。接項目定制開發、代碼講解、答辯教學、文檔編寫、降重等。 ?文末獲取源碼? 精彩專欄推薦?…

二次學習C語言補充2

文章目錄表棧、隊列、二叉樹一、二叉樹二、表棧三、隊列鏈表一、單向鏈表二、循環鏈表、雙向鏈表和雙向循環鏈表預處理一、預處理二、宏定義文件文件操作補充本篇文章是對二次學習C語言12——文件操作 二次學習C語言14——預處理及模塊化 二次學習C語言15——鏈表 二次學習C語言…

2.9Vue創建項目(組件)的補充

1.再創建和引入vue的選擇2.VsCode插件 安裝Vue自己搜索最新的3.style自己的作用域在一個組件中引入另一個文件的子組件,給當前組件設置樣式,那么子組件的樣式也會改變的。為了解決這個問題 我們在自己的style中設置一個屬性4.另一種創建vue 的方式(主流…

算法高頻題

刷題:LeetCode(Top 100-150題,至少刷兩遍)。重點:鏈表、樹、二分查找、動態規劃、回溯、棧/隊列。 每一個題型,前10個高頻題 算法思考框架參考:算法題思維框架-CSDN博客 高頻順序參考網站&…

服務器安裝 LDOPE(MODIS 數據處理工具)

目錄下載方式1-(簡單快捷)根據WRF-VPRM 需要打補丁下載方式2:(手動安裝依賴)一、安裝所需依賴庫(4 個主庫 2 個基礎庫)另- HDF-EOS 手動編譯二、解壓并安裝 LDOPE參考下載方式1-(簡…

克隆代幣 + 捆綁開盤:多鏈環境下的低成本發幣玩法

在加密世界,發幣已經不再是“少數開發者的專利”。隨著工具的普及,任何人都可以快速發行一個在加密世界,發幣已經不再是“少數開發者的專利”。隨著工具的普及,任何人都可以快速發行一個代幣。但問題是:如何在保證低成…