AWS EMR 上的 Spark:使用更多执行器

Posted

技术标签:

【中文标题】AWS EMR 上的 Spark:使用更多执行器【英文标题】:Spark on AWS EMR: use more executors 【发布时间】:2021-07-20 10:28:21 【问题描述】:

长话短说:如何在 EMR 上的 Spark 中增加执行者的数量?

长篇大论:

我正在 EMR 6.3 (Spark 3.1.1) 上运行纯计算 scala spark 作业(估计 Pi 的蒙特卡洛方法)。纯计算的目标是不依赖 S3/parquet,并且能够毫无问题地进行扩展以进行测试。

val count = spark.sparkContext.parallelize(1 to 2147483647).filter  _ =>
    val x = math.random
    val y = math.random
    x*x + y*y < 1
.count()
println(s"Pi is roughly $4.0 * count / 2147483647")

没有为 spark-submit 提供设置,但在集群创建时提供了这些全局设置:

maximizeResourceAllocation: true(这是一个 EMR 特异性) spark.dynamicAllocation.shuffleTracking.enabled: true spark.default.parallelism: 128 spark.executor.instances: 0 spark.dynamicAllocation.enabled: true

我可以通过 spark UI 确认这些设置已经生效。

我也可以确认 maximizeResourceAllocation 似乎可以完成它的工作:spark.executor.corespark.executor.memory 的值与它们的实例匹配。

我的集群有 1 个主节点、4 个内核和 4 个任务,全部为 m6g.xlarge(4 个 vCore,15.3 GiB 内存)。

因此,我希望看到 8 个执行程序,最大限度地利用每个核心和任务实例(当然,+ 1 个驱动程序,但这与这里无关)。

即使我手动添加 --conf spark.dynamicAllocation.minExecutors=5,我也只有 2 个执行者。

如何增加我的工作的执行者数量?

【问题讨论】:

【参考方案1】:

如果您知道 FIXED 集群的最佳配置,最好不要使用动态分配。

--conf spark.dynamicAllocation.enabled=false \
--num-executors 8 \
--executor-cores 3 \
--executor-memory 13G

【讨论】:

有趣的是,使用这种配置,我最终只有 1 个执行器而不是 2 个。我很困惑。 你能检查纱线属性yarn.nodemanager.resource.memory-mb 吗?此外,只需尝试使用 --executor-memory 8G 来快速测试是否获取了配置 yarn.nodemanager.resource.memory-mb of 12288 for executor-memory of 8960M(由 EMR 自行选择)。如果我明确给出你的设置,我对 NM 内存有相同的设置,对执行程序内存有预期的 8G。 你看到只有 1 个执行器,上面配置为 8gb 吗?? 我也看到了 2。

以上是关于AWS EMR 上的 Spark:使用更多执行器的主要内容,如果未能解决你的问题,请参考以下文章

我的 spark 代码没有使用 Yarn aws EMR 中可用的所有执行器

为啥 AWS EMR 上的 Spark 不从应用程序 fat jar 加载类?

AWS EMR 中的 Spark 物理内存问题

EMR 上的 spark-redshift 连接超时异常

在没有 spark UI 的情况下在 AWS EMR 中监控 spark 集群

使用 AWS EMR 的 ETL