AWS Glue执行器内存限制

22

我发现AWS Glue将执行器实例的内存限制设置为5 Gb --conf spark.executor.memory=5g,在处理大数据集时,有时会出现java.lang.OutOfMemoryError错误。驱动程序实例也是如此 --spark.driver.memory=5g。 有没有选项可以增加这个值?


我尝试使用参数 --driver-memory 8g--executor-memory 8g 运行 Glue 作业,但没有看到任何变化。作业仍然失败,并显示 java.lang.OutOfMemoryError,尝试加载超过5GB的数据。 - Alexey Bakulin
你确认你的更改已被采取(在日志中)了吗?就像这样 = --conf spark.executor.memory=8g - Ajith Kumara
是的,在日志中我看到参数 --executor-memory 8g 被传递给了运行参数。但是,由于我只能传递 脚本 参数,所以我看到了两个 --executor-memory:第一个是由 Glue 传递的 Spark 作业运行参数的一部分,第二个是我的。就像这样:/usr/lib/spark/bin/spark-submit --master yarn --executor-memory 5g ... /tmp/runscript.py script_2018-03-16-11-09-28.py --JOB_NAME XXX --executor-memory 8g之后,会出现类似于 18/03/16 11:09:31 INFO Client: Will allocate AM container, with 5632 MB memory including 512 MB overhead 的日志消息。 - Alexey Bakulin
你解决了吗? - Tofig Hasanov
@TofigHasanov 还没有。请尝试 Kris Bravo 的解决方案 https://dev59.com/5FUM5IYBdhLWcg3wUexR#50122948 并让我知道。现在我没有测试的能力。希望它能起作用。 - Alexey Bakulin
显示剩余2条评论
6个回答

16

尽管 AWS 文档声明不应传递 --conf 参数,但我们的 AWS 支持团队告诉我们传递 --conf spark.driver.memory=10g 可以解决我们遇到的问题。


11

您可以通过编辑作业并添加作业参数来覆盖参数。我使用的键和值在这里:

: --conf

: spark.yarn.executor.memoryOverhead=7g

这似乎有些违反直觉,因为设置键实际上在值中,但它被认可了。因此,如果您要尝试设置spark.yarn.executor.memory,以下参数将是适当的:

: --conf

: spark.yarn.executor.memory=7g


谢谢Kris。我会尽快测试你的解决方案。 - Alexey Bakulin
1
我在我的CloudFormation模板的工作部分中添加了以下内容,位于“DefaultArguments”部分:"--conf": "spark.yarn.executor.memory=8g",但是没有成功。作业失败并显示消息:“由于超出内存限制,YARN终止容器。已使用5.5 GB物理内存的5.7 GB。” 我实际上可以在作业参数中看到该参数。 - Xavi
1
我尝试使用关键字--conf和值sparl.driver.extraClassPath=s3://temp/jsch-0.1.55.jar来设置优先级,以便使用最新版本的jsch而不是Glue选择的版本,但是它没有起作用。我有什么遗漏的吗?此外,正如@rileyss提到的,Glue文档声明无法设置conf。那么,我们该如何解决这个问题呢? - Dwarrior
1
@Xavi 可能需要修改驱动程序的配置。例如:"spark.driver.memory=8g"。 - selle

10
  1. 打开 Glue > 工作 > 编辑你的工作 > 脚本库和作业参数 (可选) > 在底部附近找到作业参数
  2. 设置以下内容: 键: --conf 值: spark.yarn.executor.memoryOverhead=1024 spark.driver.memory=10g

5

官方胶水文档建议,胶水不支持自定义Spark配置。

AWS Glue内部还使用了几个参数名称,您永远不应该设置:

--conf — AWS Glue内部。请勿设置!

--debug — AWS Glue内部。请勿设置!

--mode — AWS Glue内部。请勿设置!

--JOB_NAME — AWS Glue内部。请勿设置!

有没有更好的解决方法?


你已经解决了这个问题吗?我尝试使用键为--conf,值为spark.driver.extraClassPath=s3://temp/jsch-0.1.55.jar的设置,以便优先使用最新版本的jsch而不是Glue选择的版本,但它没有起作用。我有什么遗漏的吗?那么,我们应该如何解决这个问题呢? - Dwarrior
1
@Dwarrior 我不确定你是否可以在Glue上自定义Spark的任何内容。看起来Glue运行在预设环境中,这也是它便宜的原因。我的解决方案是将输入数据分成较小的块并运行多个Glue作业。如果你真的需要使用自定义的Spark设置,可以尝试AWS EMR,它可以让你更自由地调整Spark参数。 - cozyss
谢谢!我会探索其他选项。我从其他答案中领悟到一些设置确实有效。 :) - Dwarrior
请注意!cozyss的回答是不正确的!您可以根据此处所述为Glue作业设置自定义Spark参数-> https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html例如,您可以将"spark.sql.autoBroadcastJoinThreshold"设置如下:作业参数键:--conf 作业参数值:spark.sql.autoBroadcastJoinThreshold=-1 - sromano

1
我在处理高度倾斜的数据集时遇到了像这样的内存不足错误。在我的情况下,我有一个包含动态负载的json文件桶,这些负载基于json中指示的事件类型而异。无论我是否使用此处指示的配置标志并增加DPUs,我都会不断遇到内存不足错误。事实证明,我的事件高度倾斜,其中几个事件类型占总数据集的90%以上。一旦我为事件类型添加了“盐”,并分解了高度倾斜的数据,我就没有遇到任何内存不足错误。
这是一篇关于AWS EMR的博客文章,讨论了与高度倾斜的数据相同的内存不足错误。 https://medium.com/thron-tech/optimising-spark-rdd-pipelines-679b41362a8a

0

您可以使用 Glue G.1X 和 G.2X 工作类型,这些类型提供更多的内存和磁盘空间,以扩展需要高内存和吞吐量的 Glue 作业。 此外,您还可以编辑 Glue 作业并设置 --confspark.yarn.executor.memoryOverhead=10242048spark.driver.memory=10g


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接