当前位置: 首页 > 知识库问答 >
问题:

为什么Spark(在Google Dataproc上)不使用所有vCore?

弘浩瀚
2023-03-14

我在Google DataProc集群上运行spark作业。但Spark似乎没有使用集群中所有可用的vCore,如下所示

基于这样和这样的其他一些问题,我已经设置了集群以使用DominantResource计算器来考虑资源分配的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 

能帮助某人弄清楚这里发生了什么?

共有2个答案

景宏朗
2023-03-14

首先,由于启用了动态分配,因此应该设置属性spark。动态定位。maxExecutors和spark。动态定位。地雷执行器(参见https://spark.apache.org/docs/latest/configuration.html#dynamic-分配)

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

段干开宇
2023-03-14

我做错的是添加了配置。调度程序。容量资源计算器=组织。阿帕奇。hadoop。纱线util。资源主导资源计算器(DominantResourceCalculator)到纱线(YARN),而不是容量调度器(capacity scheduler)。创建集群时使用xml

其次,我改变了纱线:纱线。调度程序。初始设置为1的最小分配vcores。

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

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
 类似资料:
  • 我使用Python 3.7、JRE 8、JDK 1.8在Eclipse(Eclipse plugins:PyDev)上安装了带有Hadoop2.6的Pysark2.1。 在scala.collection.maplike$class.default(maplike.scala:228) 在scala.collection.abstractmap.default(map.scala:59) 在sca

  • null 只使用数据类型有什么特别的缺点吗? 使用数据类型代替数据类型有意义吗?

  • 问题内容: 在阅读有关同步的内容时,我遇到了“监视器模式”以封装可变状态。 以下是示例代码 } 用私有锁代替固有锁更好吗? 问题答案: 是的-这意味着您可以看到 所有可能获得该锁的代码 (不考虑反射的可能性)。 如果您锁定(这是我假设您通过“固有锁定”所指的),那么其他代码可以做到: 该代码可能与自己的代码相距很远,并且可能调用其他方法,这些方法又将监视器带走。在这里很容易陷入死锁领域,因为您不容

  • output指示在1s暂停之前执行16个流元素,然后再执行16个元素,依此类推。因此,即使forkjoinpool是用100个线程创建的,也只有16个线程被使用。 当我使用超过23个线程时,就会出现这种模式:

  • 问题内容: 例如,Meyer重置包含一长串元素1,我相信可以将其替换为?。 我已经看到了一些用法: 但是,更多的“高级”重置似乎与明确说明标签有关。 我没有看到覆盖在标签列表中唯一的元素 被 覆盖(我相信)用的,和-the埃里克迈耶复位,其实并没有出现真正处理所有这些元素。如果要避免重置这些元素,那就是问题……您为什么不呢?浏览器显然 并不 都显示相同的表单元素。 1 如果您好奇。 问题答案: 您

  • 当我运行以下代码时,8个可用线程中只有2个运行,有人能解释为什么会这样吗?我如何以这样一种方式更改代码,它将利用所有8个线程? 处理器:8 [main]向1 [main]树发送命令,其中数据1为真 [main]向6 [forkjoinpool.commonpool-worker-2]发送命令到5 [main]树,其中数据6为真 [forkjoinpool.commonpool-worker-2]树