Spark中Task,Partition,RDD、節點數、Executor數、core數目的關係和Application,Driver,Job,Task,Stage理解...

 

 

 

 

輸入可能以多個文件的形式存儲在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
 
 

轉載於:https://www.cnblogs.com/liuys635/p/11083338.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章