我在Google DataProc群集上运行了一个火花工作。但看起来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
可以帮助有人弄清楚这里发生了什么吗?
答案 0 :(得分:7)
我做错了是在创建群集时将配置catch (Exception e) {
System.out.println(e.getMessage());
e=new AnotherException();
throw e;
}
添加到yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DominantResourceCalculator
而不是YARN
(因为它应该是正确的)
其次,我更改了capacity-scheduler.xml
,最初设置为yarn:yarn.scheduler.minimum-allocation-vcores
。
我不确定这些或两者中的任何一个是否导致解决方案(我将很快更新)。我的新集群创建如下所示:
1
答案 1 :(得分:0)
首先,在启用动态分配时,您应该设置属性spark.dynamicAllocation.maxExecutors
和spark.dynamicAllocation.minExecutors
(请参阅https://spark.apache.org/docs/latest/configuration.html#dynamic-allocation)
其次,确保您的spark作业中有足够的分区。当您使用动态分配时,yarn仅分配足够的执行程序来匹配任务(分区)的数量。因此,请检查SparkUI您的作业(更具体:阶段)是否具有多于您拥有的vCores的任务