背景知識:
1. 明確 Spark中Job 與 Streaming中 Job 的區別
1.1 Spark Core
一個 RDD DAG Graph 可以生成一個或多個 Job(Action操作)
一個Job可以認爲就是會最終輸出一個結果RDD的一條由RDD組織而成的計算
Job在spark裏應用裏是一個被調度的單位
1.2 Streaming
一個 batch 的數據對應一個 DStreamGraph
而一個 DStreamGraph 包含一或多個關於 DStream 的輸出操作
每一個輸出對應於一個Job,一個 DStreamGraph 對應一個JobSet,裏面包含一個或多個Job
2. Streaming Job的並行度
Job的並行度由兩個配置決定:
- spark.scheduler.mode(FIFO/FAIR)
- spark.streaming.concurrentJobs
一個 Batch 可能會有多個 Action 執行,比如註冊了多個 Kafka 數據流,每個Action都會產生一個Job
所以一個 Batch 有可能是一批 Job,也就是 JobSet 的概念
這些 Job 由 jobExecutor 依次提交執行
而 JobExecutor 是一個默認池子大小爲1的線程池,所以只能執行完一個Job再執行另外一個Job
這裏說的池子,大小就是由spark.streaming.concurrentJobs 控制的
concurrentJobs 決定了向 Spark Core 提交Job的並行度
提交一個Job,必須等這個執行完了,纔會提交第二個
假設我們把它設置爲2,則會併發的把 Job 提交給 Spark Core
Spark 有自己的機制決定如何運行這兩個Job,這個機制其實就是FIFO或者FAIR(決定了資源的分配規則)
默認是 FIFO,也就是先進先出,把 concurrentJobs 設置爲2,但是如果底層是FIFO,那麼會優先執行先提交的Job
雖然如此,如果資源夠兩個job運行,還是會並行運行兩個Job
3. spark.streaming.concurrentJobs 可讓不同Batch的job同時在運行
Streaming 不僅僅能同時運行 同一個batch 的job,甚至還能同時運行不同 Batch的 Job