[英]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個分區。 處理分區涉及以下內容:
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個小時卻完全沒有輸出。
問題 :
我已經閱讀了有關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=2
和spark.task.cpus=2
--executor-cores 4
(在spark spark.task.cpus=2
命令中)。 因此,每個節點將僅處理(4/2 =)2個分區。 在這種情況下,將使用36個節點並行處理數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.