【问题标题】: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,如下所示

基于 thisthis 等其他一些问题,我已将集群设置为使用 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 

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

【问题讨论】:

    标签: apache-spark pyspark hadoop-yarn google-cloud-dataproc


    【解决方案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),增加它们只会减慢速度,减少会导致内存问题。我发布了一个对我有用的答案。
      猜你喜欢
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 2016-11-17
      • 2022-10-03
      • 2017-07-08
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多