👊上次的百度面試遇到了關于spark的并發數的問題,今天我們就來將這些問題都一并解決一下,圖畫的的有點丑,還行大家見諒,百度實習的問題我放在了下面的鏈接👇:
- 鏈接: 2022百度大資料開發工程師實習面試經歷.
🍀我將先對并行和并發的基本定義開始講起,然后介紹spark中是如何控制并行和并發的,以及這些和cpu核數、磁區數有何關系,
目錄
- 1. 并行和并發
- 2. Executor和core
- 3. Spark的task
- 4. Spark如何提高并行度?
- 5. 總結
- 6. 參考資料
1. 并行和并發
- 并行:指多個處理器或者是多核的處理器同時處理多個不同的任務(并行是物理上的同時發生)

- 并發:指一個處理器同時處理多個任務,指在同一時刻只能有一條指令執行,但多個行程指令被快速的輪換執行,使得在宏觀上具有多個行程同時執行的效果,但在微觀上并不是同時執行的,只是把時間分成若干段,使多個行程快速交替的執行(并發是邏輯上的同時發生)

2. Executor和core
Spark Executor 是集群中運行在作業節點(Worker)中的一個JVM行程,是整個集群中的專門用于計算的的節點,在提交應用中,可以提供制定計算節點的個數,以及對應的資源,這里的資源一般是指作業節點Executor的記憶體大小和使用的虛擬CPU核(core)數量,
配置Executor的相關啟動引數:
| 配置 | 說明 |
|---|---|
| – nums-executors | 配置Executor的數量 |
| – nums-memory | 配置每個Executor的記憶體大小 |
| – nums-cores | 配置每個Executor的虛擬CPU core |
演示一下Executor的并行與并發:
- 藍色的圓圈是真實的core
- 綠色的圓圈是虛擬的core
- 在下圖中,Executor的真實核數為3,虛擬核數為3,每一個虛擬核搶占了一個真實的核,所以實作的是并行計算

- 在下圖中,Executor的真實核數為1,虛擬核數為3,3哥虛擬核去搶占1個真實的核的資源,所以實作的是并發計算

并行度(paralleism):在分布式計算框架中,一般都是多個任務同時執行,由于任務分布在不同的計算節點進行計算,所以能夠真正實作多個任務并行執行,記住,這里是并行,而不是并發,這里我們將整個集群并行執行任務的數量,成為并行度,
spark中的并行度和磁區之間是有關系的,rdd的每一個磁區都是一個task,然后傳送到對應的executor中進行計算,如果資源充足(executor core數=task數)并行度就等于磁區數,如果(executor core數<task數)就是并發執行,
3. Spark的task
眾所周知,rdd是spark中最基本資料處理模型,里面包含了磁區的概念,
在下圖的例子中,我們發現rdd讀取的資料,需要轉化為task才能傳輸給executor節點進行計算,那么task是如何進行劃分的呢,劃分的規則就是我們所謂的磁區,不同的磁區被劃為不同的task,

RDD的磁區是可變的,你可以根據資源的需要去改變磁區,使資源利用率最大化,rdd默認的磁區是可以進行配置的,如果不配置采用的就是totalcores,即當前環境的最大可用核數,
4. Spark如何提高并行度?
- 設定合理的task數量,至少設定成與spark Application (executor)的總cpu core 數量相同,比如:150個磁區,150個task,150個core,差不多每個task同時運行完畢,(官方推薦,task數量,設定成spark Application 總cpu core數量的2~3倍 ,比如150個cpu core ,基本設定 task數量為 300~ 500)
- 重新設定RDD的磁區數,常見的方法有repartitions 、 coalesce、join、以及一些會產生寬依賴的算子,
5. 總結
spark根據磁區數來決定task的個數,而task的個數和executor所擁有的core數來決定著spark的并行度,當task數多余core數時,就會產生并發操作,
6. 參考資料
- 鏈接: spark性能調優.
- 《尚硅谷spark3.0教程》
- 《spark權威指南》
- 以及私信幫助我解答問題的大佬們
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/437059.html
標籤:其他
上一篇:kafka初學(自己覺得好難)
下一篇:四種常用的微服務架構拆分方式
