【问题标题】:Google Cloud Dataproc configuration issuesGoogle Cloud Dataproc 配置问题
【发布时间】:2015-12-07 18:32:50
【问题描述】:

我在运行的一些 Spark LDA 主题建模中遇到了各种问题(主要是看似随机间隔的解关联错误),我认为这主要与我的执行程序上的内存分配不足有关。这似乎与有问题的自动集群配置有关。我最近的尝试使用 n1-standard-8 机器(8 个内核,30GB RAM)作为主节点和工作节点(6 个工作节点,因此总共 48 个内核)。

但是当我查看/etc/spark/conf/spark-defaults.conf 时,我看到了:

spark.master yarn-client
spark.eventLog.enabled true
spark.eventLog.dir hdfs://cluster-3-m/user/spark/eventlog

# Dynamic allocation on YARN
spark.dynamicAllocation.enabled true
spark.dynamicAllocation.minExecutors 1
spark.dynamicAllocation.initialExecutors 100000
spark.dynamicAllocation.maxExecutors 100000
spark.shuffle.service.enabled true
spark.scheduler.minRegisteredResourcesRatio 0.0

spark.yarn.historyServer.address cluster-3-m:18080
spark.history.fs.logDirectory hdfs://cluster-3-m/user/spark/eventlog

spark.executor.cores 4
spark.executor.memory 9310m
spark.yarn.executor.memoryOverhead 930

# Overkill
spark.yarn.am.memory 9310m
spark.yarn.am.memoryOverhead 930

spark.driver.memory 7556m
spark.driver.maxResultSize 3778m
spark.akka.frameSize 512

# Add ALPN for Bigtable
spark.driver.extraJavaOptions -Xbootclasspath/p:/usr/local/share/google/alpn/alpn-boot-8.1.3.v20150130.jar
spark.executor.extraJavaOptions -Xbootclasspath/p:/usr/local/share/google/alpn/alpn-boot-8.1.3.v20150130.jar

但是这些值没有多大意义。为什么只使用 4/8 执行器核心?只有 9.3 / 30GB RAM?我的印象是,所有这些配置都应该自动处理,但即使我尝试手动调整也无济于事。

例如,我尝试使用以下命令启动 shell:

spark-shell --conf spark.executor.cores=8 --conf spark.executor.memory=24g

但是这失败了

java.lang.IllegalArgumentException: Required executor memory (24576+930 MB) is above the max threshold (22528 MB) of this cluster! Please increase the value of 'yarn.scheduler.maximum-allocation-mb'.

我尝试更改/etc/hadoop/conf/yarn-site.xml 中的关联值,但没有效果。即使我尝试不同的集群设置(例如使用具有 60+ GB RAM 的执行程序),我最终也会遇到同样的问题。由于某种原因,最大阈值保持在 22528MB。

我在这里做错了什么,还是谷歌的自动配置有问题?

【问题讨论】:

    标签: apache-spark google-cloud-platform lda google-cloud-dataproc


    【解决方案1】:

    在主机器类型与工作机器类型不同的集群中,默认内存配置存在一些已知问题,但在您的情况下,这似乎不是主要问题。

    当您看到以下内容时:

    spark.executor.cores 4
    spark.executor.memory 9310m
    

    这实际上意味着每个工作节点将运行 2 个执行程序,每个执行程序将使用 4 个核心,这样所有 8 个核心确实在每个工作人员上都用完了。这样一来,如果我们给 AppMaster 一半的机器,AppMaster 就可以成功打包到一个 executor 旁边。

    分配给 NodeManager 的内存量需要为 NodeManager 守护进程本身和其他一些开销留出一些开销。其他守护进程服务,例如 DataNode,所以大约 80% 留给 NodeManagers。此外,分配必须是最小 YARN 分配的倍数,因此在地板到最近的分配倍数之后,这就是 n1-standard-8 的 22528MB 的来源。

    如果您添加具有 60+ GB RAM 的工作人员,那么只要您使用相同内存大小的主节点,那么您应该看到更高的最大阈值数。

    无论哪种方式,如果您遇到 OOM 问题,那么最重要的不是每个执行程序的内存,而是每个任务的内存。如果你在增加spark.executor.coresspark.executor.memory 的同时增加了spark.executor.memory,那么每个任务的内存实际上并没有增加,所以在这种情况下你不会真正为你的应用程序逻辑提供更多的空间; Spark 将使用spark.executor.cores 来确定在同一内存空间中运行的并发任务数。

    要真正为每个任务获得更多内存,您应该主要尝试:

    1. 使用 n1-highmem-* 机器类型
    2. 尝试减少 spark.executor.cores,同时保持 spark.executor.memory 不变
    3. 尝试增加 spark.executor.memory 而使 spark.executor.cores 保持不变

    如果您执行上述 (2) 或 (3),那么与尝试占用所有内核的默认配置相比,您确实会让内核处于空闲状态,但这确实是为每个任务获得更多内存的唯一方法转到highmem 实例。

    【讨论】:

    • 啊,这真的很有帮助。需要做一些确认这确实是问题所在,如果是这样,将接受答案。没有意识到你可以在同一个节点上有多个执行器,所以现在这更有意义了。
    • 我相当肯定内存问题是这里的问题,但 Spark 错误堆栈通常不太清楚。我基本上一直在运行一系列 LDA 主题模型,主题数量越来越多(更多主题 -> 更多失败),因此内存似乎可能是罪魁祸首。
    • 是的,executor sizing 是 Spark 已知的令人困惑的地方之一,不幸的是,很难有一个好的一刀切配置; this Cloudera blog post 有更多关于执行器大小影响的详细信息。
    • 在使用具有更多内存但也有更多内核的大型执行程序的情况下,如果任务打包很幸运,它有时可以隐藏内存限制问题,以便将许多小任务打包在单个任务旁边memory-hog 任务,但是当并发任务的总数足够高以至于您更频繁地触发在同一个执行程序上打包多个 memory-hog 任务的情况时,它会遇到扩展问题。所以一般来说,最好让每个执行程序 1 个核心的内存/任务比率工作,然后尝试更大的执行程序以减少开销
    • 好的,长话短说,我应该增加内存与内核的比例,而不是同时扩展两者。假设我的主机和工人机器类型相同,我不应该做任何手动配置吗?这有点离题了,但是重新分区 RDD 以最大化性能的经验法则是每个核心大约 4 个分区,对吗?
    猜你喜欢
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    相关资源
    最近更新 更多