自动设置 Dataproc 集群后 Yarn/Spark 的内存分配不正确

Posted

技术标签:

【中文标题】自动设置 Dataproc 集群后 Yarn/Spark 的内存分配不正确【英文标题】:Incorrect memory allocation for Yarn/Spark after automatic setup of Dataproc Cluster 【发布时间】:2016-02-09 12:27:59 【问题描述】:

我正在尝试在 Dataproc 集群上运行 Spark 作业,但由于 Yarn 配置错误,Spark 无法启动。

从 shell(本地主机上)运行“spark-shell”时,以及从本地计算机通过 web-GUI 和 gcloud 命令行实用程序上传作业时,我收到以下错误:

15/11/08 21:27:16 ERROR org.apache.spark.SparkContext: Error initializing     SparkContext.
java.lang.IllegalArgumentException: Required executor memory (38281+2679 MB) is above the max threshold (20480 MB) of this cluster! Please increase the value of 'yarn.s
cheduler.maximum-allocation-mb'.

我尝试修改/etc/hadoop/conf/yarn-site.xml 中的值,但没有任何改变。我认为它不会从该文件中提取配置。

我已经在多个站点(主要是欧洲)尝试了多个集群组合,但我只让它与低内存版本(4 核,15 GB 内存)一起使用。

即这只是配置为内存高于 yarn 默认允许的节点上的问题。

【问题讨论】:

【参考方案1】:

对于您遇到的这些问题,我们深表歉意!看起来这是一个已知问题的一部分,其中某些内存设置最终是根据主计算机的大小而不是工作计算机的大小计算的,我们希望很快在即将发布的版本中解决这个问题。

目前有两种解决方法:

    使用内存等于或小于内存的主机类型 比工作机器类型。

    如果从 SSH 连接运行,则使用 --conf 标志显式设置 spark.executor.memory 和 spark.executor.cores,例如:

    spark-shell --conf spark.executor.memory=4g --conf spark.executor.cores=2
    

    或者如果运行gcloud beta dataproc,使用--properties

    gcloud beta dataproc jobs submit spark --properties spark.executor.memory=4g,spark.executor.cores=2
    

您可以根据需要调整每个执行程序的核心/内存数量;在较小的执行程序方面犯错并让 YARN 将大量执行程序打包到每个工作程序上是可以的,尽管您可以通过将 spark.executor.memory 设置为每个 YARN 容器和 spark.executor 中可用的完整大小来节省每个执行程序的开销.cores 到每个工人的所有核心。

编辑:从 1 月 27 日起,新的 Dataproc 集群现在将针对任何主/从机器类型组合正确配置,如 release notes 中所述。

【讨论】:

天哪!小于 worker 的主内存大小可能是我尚未尝试过的唯一组合。非常感谢!它就像一个魅力:) 看来这个改动引入了一个新问题。在这个新配置上运行时,我得到the following error:。低内存集群使用相同的 .jar 文件作业没有问题。 我应该把它作为一个新问题发布吗? 是的,可能最好作为一个新问题发布,更多人会这样看。 很抱歉提出一个老问题,但 Google Cloud Dataproc 的 newest release 已解决此问题并提出了此问题。干杯!

以上是关于自动设置 Dataproc 集群后 Yarn/Spark 的内存分配不正确的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Dataproc 集群启动时自动安装 Python 库?

DataProc Presto 会自动拾取新节点吗?

设置fs.defaultFS属性时无法创建Dataproc集群?

错误:启动 Dataproc 集群时资源项目的权限被拒绝

如何在自动扩缩 GCP Dataproc 时了解初级工作者?

如何在 dataproc 集群上重新启动 hadoop 服务