为什么 Spark(在 Google Dataproc 上)不使用所有 vcores?
Why does Spark (on Google Dataproc) not use all vcores?
我是 运行 Google DataProc 集群上的 spark 作业。但是看起来 Spark 没有使用集群中所有可用的 vcores
,如下所示
基于 and 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
但是当我使用自定义 spark 标志提交我的作业时,看起来 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
可以帮助别人弄清楚这是怎么回事吗?
首先,由于您启用了动态分配,因此您应该设置属性 spark.dynamicAllocation.maxExecutors
和 spark.dynamicAllocation.minExecutors
(参见 https://spark.apache.org/docs/latest/configuration.html#dynamic-allocation)
其次,确保您的 spark 作业中有足够的分区。当您使用动态分配时,yarn 只会分配足够的执行程序来匹配任务(分区)的数量。因此,请检查 SparkUI 您的作业(更具体:阶段)是否有比可用 vCore 多的任务
我做错的是在创建集群时将配置 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
我是 运行 Google DataProc 集群上的 spark 作业。但是看起来 Spark 没有使用集群中所有可用的 vcores
,如下所示
基于 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
但是当我使用自定义 spark 标志提交我的作业时,看起来 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
可以帮助别人弄清楚这是怎么回事吗?
首先,由于您启用了动态分配,因此您应该设置属性 spark.dynamicAllocation.maxExecutors
和 spark.dynamicAllocation.minExecutors
(参见 https://spark.apache.org/docs/latest/configuration.html#dynamic-allocation)
其次,确保您的 spark 作业中有足够的分区。当您使用动态分配时,yarn 只会分配足够的执行程序来匹配任务(分区)的数量。因此,请检查 SparkUI 您的作业(更具体:阶段)是否有比可用 vCore 多的任务
我做错的是在创建集群时将配置 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