Spark中Task,Partition,RDD、節點數、Executor數、core數目的關系和Application,Driver,Job,Task,Stage理解
有部分圖和語句摘抄別的博客,有些理解是自己的
梳理一下Spark中關於並發度涉及的幾個概念File,Block,Split,Task,Partition,RDD以及節點數、Executor數、core數目的關系。
輸入可能以多個文件的形式存儲在HDFS上,每個File都包含了很多塊,稱為Block。
當Spark讀取這些文件作為輸入時,會根據具體數據格式對應的InputFormat進行解析,一般是將若干個Block合並成一個輸入分片,稱為InputSplit,注意InputSplit不能跨越文件。
隨后將為這些輸入分片生成具體的Task。InputSplit與Task是一一對應的關系。
隨后這些具體的Task每個都會被分配到集群上的某個節點的某個Executor去執行。
- 每個節點可以起一個或多個Executor。
- 每個Executor由若干core組成,每個Executor的每個core一次只能執行一個Task。
- 每個Task執行的結果就是生成了目標RDD的一個partiton。
注意: 這里的core是虛擬的core而不是機器的物理CPU核,可以理解為就是Executor的一個工作線程。
而 Task被執行的並發度 = Executor數目 * 每個Executor核數。
至於partition的數目:
- 對於數據讀入階段,例如sc.textFile,輸入文件被划分為多少InputSplit就會需要多少初始Task。
- 在Map階段partition數目保持不變。
- 在Reduce階段,RDD的聚合會觸發shuffle操作,聚合后的RDD的partition數目跟具體操作有關,例如repartition操作會聚合成指定分區數,還有一些算子是可配置的。
1,Application
application(應用)其實就是用spark-submit提交的程序。比方說spark examples中的計算pi的SparkPi。一個application通常包含三部分:從數據源(比方說HDFS)取數據形成RDD,通過RDD的transformation和action進行計算,將結果輸出到console或者外部存儲(比方說collect收集輸出到console)。
2,Driver
Spark中的driver感覺其實和yarn中Application Master的功能相類似。主要完成任務的調度以及和executor和cluster manager進行協調。有client和cluster聯眾模式。client模式driver在任務提交的機器上運行,而cluster模式會隨機選擇機器中的一台機器啟動driver。從spark官網截圖的一張圖可以大致了解driver的功能。
3,Job
Spark中的Job和MR中Job不一樣不一樣。MR中Job主要是Map或者Reduce Job。而Spark的Job其實很好區別,一個action算子就算一個Job,比方說count,first等。
4, Task
Task是Spark中最新的執行單元。RDD一般是帶有partitions的,每個partition的在一個executor上的執行可以任務是一個Task。
5, Stage
Stage概念是spark中獨有的。一般而言一個Job會切換成一定數量的stage。各個stage之間按照順序執行。至於stage是怎么切分的,首選得知道spark論文中提到的narrow dependency(窄依賴)和wide dependency( 寬依賴)的概念。其實很好區分,看一下父RDD中的數據是否進入不同的子RDD,如果只進入到一個子RDD則是窄依賴,否則就是寬依賴。寬依賴和窄依賴的邊界就是stage的划分點
--class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client --driver-memory 4g --num-executors 2 --executor-memory 2g --executor-cores 2 /opt/apps/spark-1.6.0-bin-hadoop2.6/lib/spark-examples*.jar 10
參數說明如下所示:
參數 | 參考值 | 說明 |
---|---|---|
class | org.apache.spark.examples.SparkPi | 作業的主類。 |
master | yarn | 因為 E-MapReduce 使用 yarn 的模式,所以這里只能是 yarn 模式。 |
yarn-client | 等同於 –-master yarn —deploy-mode client, 此時不需要指定deploy-mode。 | |
yarn-cluster | 等同於 –-master yarn —deploy-mode cluster, 此時不需要指定deploy-mode。 | |
deploy-mode | client | client 模式表示作業的 AM 會放在 Master 節點上運行。要注意的是,如果設置這個參數,那么需要同時指定上面 master 為 yarn。 |
cluster | cluster 模式表示 AM 會隨機的在 worker 節點中的任意一台上啟動運行。要注意的是,如果設置這個參數,那么需要同時指定上面 master 為yarn。 | |
driver-memory | 4g | driver 使用的內存,不可超過單機的 core 總數。 |
num-executors | 2 | 創建多少個 executor。 |
executor-memory | 2g | 各個 executor 使用的最大內存,不可超過單機的最大可使用內存。 |
executor-cores | 2 | 各個 executor 使用的並發線程數目,也即每個 executor 最大可並發執行的 Task 數目。 |
資源計算
- yarn-client 模式的資源計算
節點 資源類型 資源量(結果使用上面的例子計算得到) master core 1 mem driver-memroy = 4G worker core num-executors * executor-cores = 4 mem num-executors * executor-memory = 4G - 作業主程序(Driver 程序)會在 master 節點上執行。按照作業配置將分配 4G(由 —driver-memroy 指定)的內存給它(當然實際上可能沒有用到)。
- 會在 worker 節點上起 2 個(由 —num-executors 指定)executor,每一個 executor 最大能分配 2G(由 —executor-memory 指定)的內存,並最大支持 2 個(由—executor-cores 指定)task 的並發執行。
- yarn-cluster 模式的資源計算
節點 資源類型 資源量(結果使用上面的例子計算得到) master 一個很小的 client 程序,負責同步 job 信息,占用很小。 worker core num-executors * executor-cores+spark.driver.cores = 5 mem num-executors * executor-memory + driver-memroy = 8g 說明 這里的 spark.driver.cores 默認是 1,也可以設置為更多。
資源使用的優化
- yarn-client 模式
若您有了一個大作業,使用 yarn-client 模式,想要多用一些這個集群的資源,請參見如下配置:
--master yarn-client --driver-memory 5g –-num-executors 20 --executor-memory 4g --executor-cores 4
注意- Spark 在分配內存時,會在用戶設定的內存值上溢出 375M 或 7%(取大值)。
- Yarn 分配 container 內存時,遵循向上取整的原則,這里也就是需要滿足 1G 的整數倍。
按照上述的資源計算公式,
-
master 的資源量為:
- core:1
- mem:6G (5G + 375M 向上取整為 6G)
-
workers 的資源量為:
- core: 20*4 = 80
- mem: 20*5G (4G + 375M 向上取整為 5G) = 100G
可以看到總的資源沒有超過集群的總資源,那么遵循這個原則,您還可以有很多種配置,例如:--master yarn-client --driver-memory 5g --num-executors 40 --executor-memory 1g --executor-cores 2
--master yarn-client --driver-memory 5g --num-executors 15 --executor-memory 4g --executor-cores 4
--master yarn-client --driver-memory 5g --num-executors 10 --executor-memory 9g --executor-cores 6
原則上,按照上述的公式計算出來的需要資源不超過集群的最大資源量就可以。但在實際場景中,因為系統,hdfs 以及 E-MapReduce 的服務會需要使用 core 和 mem 資源,如果把 core 和 mem 都占用完了,反而會導致性能的下降,甚至無法運行。
executor-cores 數一般也都會被設置成和集群的可使用核一致,因為如果設置的太多,CPU 會頻繁切換,性能並不會提高。
- yarn-cluster 模式
當使用 yarn-cluster 模式后,Driver 程序會被放到 worker 節點上。資源會占用到 worker 的資源池里面,這時若想要多用一些這個集群的資源,請參加如下配置:
--master yarn-cluster --driver-memory 5g --num-executors 15 --executor-memory 4g --executor-cores 4