为啥 Spark(在 Google Dataproc 上)不使用所有 vcore?

Posted

技术标签:

【中文标题】为啥 Spark(在 Google Dataproc 上)不使用所有 vcore?【英文标题】:Why does Spark (on Google Dataproc) not use all vcores?为什么 Spark(在 Google Dataproc 上)不使用所有 vcore? 【发布时间】:2017-11-15 16:38:55 【问题描述】:

我正在 Google DataProc 集群上运行 Spark 作业。但看起来 Spark 没有使用集群中所有可用的 vcores,如下所示

基于 this 和 this 等其他一些问题,我已将集群设置为使用 DominantResourceCalculator 来考虑 vcpus 和内存进行资源分配

gcloud dataproc clusters create cluster_name --bucket="profiling-
job-default" \
--zone=europe-west1-c \
--master-boot-disk-size=500GB \
--worker-boot-disk-size=500GB \
--master-machine-type=n1-standard-16 \
--num-workers=10 \
--worker-machine-type=n1-standard-16 \
--initialization-actions gs://custom_init_gcp.sh \
--metadata MINICONDA_VARIANT=2 \
--properties=^--^yarn:yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DominantResourceCalculator

但是当我使用自定义火花标志提交我的工作时,看起来 YARN 不尊重这些自定义参数并且默认使用内存作为资源计算的标准

gcloud dataproc jobs submit pyspark --cluster cluster_name \
--properties spark.sql.broadcastTimeout=900,spark.network.timeout=800\
,yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DominantResourceCalculator\
,spark.dynamicAllocation.enabled=true\
,spark.executor.instances=10\
,spark.executor.cores=14\
,spark.executor.memory=15g\
,spark.driver.memory=50g \
src/my_python_file.py 

可以帮助某人弄清楚这里发生了什么吗?

【问题讨论】:

【参考方案1】:

我做错的是在创建集群时将配置 yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DominantResourceCalculator 添加到 YARN 而不是 capacity-scheduler.xml(应该是正确的)

其次,我将yarn:yarn.scheduler.minimum-allocation-vcores 更改为最初设置为1

我不确定这些更改中的一个或两个是否导致了解决方案(我将很快更新)。我的新集群创建如下所示:

gcloud dataproc clusters create cluster_name --bucket="profiling-
job-default" \
--zone=europe-west1-c \
--master-boot-disk-size=500GB \
--worker-boot-disk-size=500GB \
--master-machine-type=n1-standard-16 \
--num-workers=10 \
--worker-machine-type=n1-standard-16 \
--initialization-actions gs://custom_init_gcp.sh \
--metadata MINICONDA_VARIANT=2 \
--properties=^--^yarn:yarn.scheduler.minimum-allocation-vcores=4--capacity-scheduler:yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DominantResourceCalculator

【讨论】:

【参考方案2】:

首先,由于您启用了动态分配,您应该设置属性spark.dynamicAllocation.maxExecutorsspark.dynamicAllocation.minExecutors(参见https://spark.apache.org/docs/latest/configuration.html#dynamic-allocation)

其次,确保 Spark 作业中有足够的分区。当您使用动态分配时,yarn 只分配足够的执行器来匹配任务(分区)的数量。因此,请检查 SparkUI,您的作业(更具体:阶段)是否比可用的 vCore 多于任务

【讨论】:

感谢您的回答。该链接说spark.dynamicAllocation.minExecutors相关,但并没有说它们会影响资源分配。你能对此发表更多评论吗?其次,我的工作有足够多的分区(~3K),增加它们只会减慢速度,减少会导致内存问题。我发布了一个对我有用的答案。

以上是关于为啥 Spark(在 Google Dataproc 上)不使用所有 vcore?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Apache-Spark - Python 在本地比 pandas 慢?

为啥在 Spark 中重新分区比 partitionBy 快?

为啥 Spark2 只在一个节点上运行?

如何在本地使用 java 连接到带有 spark 的 Google 大查询?

为啥 org.apache.spark.sql.types.DecimalType 在 Spark SQL 中的最大精度值为 38?

为啥我的 Spark 运行速度比纯 Python 慢?性能比较