Spark?Streaming?內(nèi)部運(yùn)行機(jī)制示例詳解
核心思想:將實(shí)時(shí)數(shù)據(jù)流切割為“微批次”,利用 Spark Core 的批處理能力進(jìn)行準(zhǔn)實(shí)時(shí)計(jì)算。
1. 核心流程拆解
數(shù)據(jù)接收(Input Data Stream)
- 輸入源:Kafka、Flume、Socket 等實(shí)時(shí)數(shù)據(jù)流。
- 接收器(Receiver):Spark Streaming 啟動(dòng)接收器線程,持續(xù)監(jiān)聽數(shù)據(jù)流并緩存到內(nèi)存(或磁盤)。
批次劃分(Micro-Batching)
- 時(shí)間窗口:按固定時(shí)間間隔(如 1秒、5秒)將數(shù)據(jù)流切割為多個(gè)小批次(DStream)。
- 示例:若間隔為 2秒,則每 2秒的數(shù)據(jù)組成一個(gè)批次,形成
Batch 1
,Batch 2
...
Spark Core 處理
- RDD 轉(zhuǎn)換:每個(gè)批次的數(shù)據(jù)轉(zhuǎn)換為一個(gè) RDD,調(diào)用 Spark Core 的算子(如
map
、reduce
)處理。 - 并行計(jì)算:Driver 將任務(wù)分發(fā)給 Executor,各節(jié)點(diǎn)并行處理對(duì)應(yīng)分區(qū)的數(shù)據(jù)。
結(jié)果輸出
- 輸出操作:處理完一個(gè)批次后,結(jié)果寫入外部系統(tǒng)(如 HDFS、數(shù)據(jù)庫)或展示在實(shí)時(shí)儀表盤。
2. 核心概念:DStream(離散化流)
- 本質(zhì):DStream 是 Spark Streaming 的核心抽象,表示按時(shí)間切分的 RDD 序列。
- 特性:
- 每個(gè)時(shí)間間隔生成一個(gè) RDD(如
DStream = [RDD1, RDD2, ...]
)。 - 支持與 RDD 類似的轉(zhuǎn)換操作(如
map
、filter
、reduceByKey
)。
- 每個(gè)時(shí)間間隔生成一個(gè) RDD(如
示例代碼:
// 創(chuàng)建 DStream(從 Socket 接收數(shù)據(jù),批次間隔 1秒) val ssc = new StreamingContext(sparkConf, Seconds(1)) val lines = ssc.socketTextStream("localhost", 9999) // 處理數(shù)據(jù):按單詞拆分并計(jì)數(shù) val words = lines.flatMap(_.split(" ")) val wordCounts = words.map(word => (word, 1)).reduceByKey(_ + _) // 輸出結(jié)果 wordCounts.print() ssc.start() // 啟動(dòng)計(jì)算 ssc.awaitTermination() // 等待終止
3. 為何稱為“準(zhǔn)實(shí)時(shí)”?
- 微批處理(Micro-Batching):
- 數(shù)據(jù)按固定時(shí)間窗口(如 1秒)分批處理,延遲 = 窗口間隔 + 處理時(shí)間(通常秒級(jí))。
- 對(duì)比真正的實(shí)時(shí)處理(如 Flink 的逐事件處理),延遲稍高但吞吐量更大。
- 適用場(chǎng)景:
- 日志分析、實(shí)時(shí)儀表盤、異常檢測(cè)等允許秒級(jí)延遲的場(chǎng)景。
- 不適用于毫秒級(jí)延遲需求(如高頻交易)。
4. 容錯(cuò)與可靠性
- 數(shù)據(jù)恢復(fù):
- Checkpoint 機(jī)制:定期保存 DStream 的血緣(Lineage)和元數(shù)據(jù),故障時(shí)從檢查點(diǎn)恢復(fù)。
- WAL(Write-Ahead Log):接收器將數(shù)據(jù)寫入預(yù)寫日志,確保數(shù)據(jù)不丟失。
- Exactly-Once 語義:
- 結(jié)合事務(wù)性寫入(如數(shù)據(jù)庫事務(wù)),保證每個(gè)批次的數(shù)據(jù)處理且僅處理一次。
5. 性能優(yōu)化要點(diǎn)
優(yōu)化方向 | 方法 |
---|---|
減少批次間隔 | 縮小窗口間隔(如從 2秒 → 1秒),但需平衡吞吐量和延遲。 |
并行度調(diào)整 | 增加接收器和 Executor 的數(shù)量,提升數(shù)據(jù)接收與處理并行度。 |
內(nèi)存管理 | 控制接收器緩存大小(spark.streaming.receiver.maxRate ),避免 OOM。 |
背壓機(jī)制 | 啟用 spark.streaming.backpressure.enabled ,動(dòng)態(tài)調(diào)整接收速率。 |
總結(jié)
Spark Streaming = 微批處理 + Spark Core 批處理引擎
- 優(yōu)勢(shì):繼承 Spark 的易用性、容錯(cuò)性和高吞吐量。
- 局限:秒級(jí)延遲,不適合超低延遲場(chǎng)景(此類需求可轉(zhuǎn)向 Structured Streaming 或 Flink)。
- 核心公式:
- 實(shí)時(shí)數(shù)據(jù)流 → 按時(shí)間切分為 DStream → 轉(zhuǎn)換為 RDD 批次處理 → 輸出結(jié)果
到此這篇關(guān)于Spark Streaming 內(nèi)部運(yùn)行機(jī)制示例詳解的文章就介紹到這了,更多相關(guān)Spark Streaming 內(nèi)部運(yùn)行機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Spring掃描Mybatis的mapper接口的三種配置
這篇文章主要介紹了使用Spring掃描Mybatis的mapper接口的三種配置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java實(shí)時(shí)獲取基金收益項(xiàng)目源碼分享
這篇文章主要介紹了Java實(shí)時(shí)獲取基金收益項(xiàng)目源碼分享,主要包括JAVA爬取天天基金網(wǎng)數(shù)據(jù)使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),需要的朋友可以參考下2021-03-03java實(shí)現(xiàn)手寫一個(gè)簡(jiǎn)單版的線程池
有些人可能對(duì)線程池比較陌生,并且更不熟悉線程池的工作原理。本文就來手寫一個(gè)簡(jiǎn)單版的線程池,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08Struts中使用validate()輸入校驗(yàn)方法詳解
這篇文章主要介紹了Struts中使用validate()輸入校驗(yàn)方法,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-09-09