簡體   English   中英

Spark YARN群集仍未充分利用

[英]Spark YARN cluster remains underutilized

使用Microsoft Azure,我有一個包含2個主節點和50個工作節點的群集。 所有節點均具有8個內核和64 GB RAM。

我正在使用pyspark運行火花提交作業。 我的Python代碼中最相關的部分是在其中創建一個長度為72的元組的Python列表arg_list 。(每個元組有大約6個元素,沒有兩個元組相同。)然后,我創建了一個具有72個分區的RDD,如下所示:

sc = spark.sparkContext
rdd = sc.parallelize(arg_list, len(arg_list))

我的目標是同時處理所有72個分區。 處理分區涉及以下內容:

  1. 根據收到的元組元素的值,從Blob(HDFS)存儲中讀取兩個文件。
  2. 運行一個名為gensim的Python包,以使用讀取的兩個文件的內容執行NLP任務。

為此,我按如下方式提交我的火花提交作業,

spark-submit --master yarn --num-executors 100 --executor-cores 3 --executor-memory 19G /path/to/my/file.py

思路如下。 將每個工作程序節點用於2個執行程序。 每個執行程序有3個內核,因此每個節點還有8-2 * 3 = 2個內核可用於節點管理器和任何其他開銷任務。 由於每個節點可以有2個執行器,而我有50個節點,所以我可以有100個執行器。 (我承認在這種情況下群集比所需的要大一些。)

運行此代碼時,我可以使用Ambari監視輔助節點的活動。 我曾期望72/2 = 36個工作節點處於繁忙狀態(由平均負載證明),而50-36 = 14個節點處於空閑狀態。 相反,我看到只有12個節點處於繁忙狀態,並且似乎每個節點都在運行6個進程。

6 * 12 = 72(任務數)可能不是巧合。 好像Spark / YARN決定忽略我的參數,並將分區的處理填充到盡可能少的節點中。

我還注意到,完成72項任務中的任何一項似乎都需要很長時間。 我說這是基於看到一個典型的任務在串行模式下運行需要3個小時,並且看到我的Spark作業運行了6個小時卻完全沒有輸出。

問題

  1. 為什么我只使用50個工作節點中的12個?
  2. 為什么我的代碼運行這么慢?

我已經閱讀了有關spark-submit / Yarn參數的准則,並認為我寫的是有意義的。 我還缺少其他一些參數設置嗎?

Spark將根據您正在運行的作業可用的內核總數來處理每個分區。

假設您的Spark作業有100個執行者,每個執行者都有3個核心。 這意味着,假設spark.task.cpus設置為1,您將能夠同時處理100 x 3 = 300個分區。

spark.task.cpus是為每個任務分配--executor-cores數,而--executor-cores指定每個執行者的核心數。

具有2個執行程序的工作程序節點,處理2 x 3 = 6個分區。 並且默認spark.default.parallelism =12。因此6x12 = 72。

Spark中用於在運行時調整分區數量的兩個配置屬性如下:

在此處輸入圖片說明

將默認並行度提高

--conf spark.default.parallelism=36 --conf spark.default.parallelism=36

設置spark.task.cpus=2spark.task.cpus=2 --executor-cores 4 (在spark spark.task.cpus=2命令中)。 因此,每個節點將僅處理(4/2 =)2個分區。 在這種情況下,將使用36個節點並行處理數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM