我创建了一个包含1个主节点和10个节点的Dataproc集群。所有都具有相同的CPU和内存配置:32个vCPU,120 GB内存。当我提交处理大量数据和计算的工作时。工作失败了。
从日志记录来看,我不确定导致失败的原因。但是我从tJob#:job-c46fc848-6看到了与内存相关的错误消息: 由于超过内存限制而被YARN杀死的容器。使用24.1 GB的24 GB物理内存。考虑提升spark.yarn.executor.memoryOverhead。
所以我尝试了一些我从其他帖子中找到的解决方案。例如,当我从“作业”控制台提交作业时,我尝试在“属性”部分中增加spark.executor.memoryOverhead和spark.driver.maxResultSize。作业#find-duplicate-job-c46fc848-7仍然失败。
我也看到了警告信息,并不确定它意味着什么: 18/06/04 17:13:25 WARN org.apache.spark.storage.BlockManagerMasterEndpoint:没有更多可用于rdd_43_155的副本!
我将尝试创建一个更高级别的集群,看它是否有效。但我怀疑它会解决这个问题,因为具有1个主节点和10个节点以及32个vCPU,120 GB内存的集群已经非常强大。
希望得到高级用户和专家的帮助。提前谢谢!
答案 0 :(得分:1)
失败的根本原因与自交叉联接引起的内存相关。即使我一直在增加CPU能力和内存,它仍然失败。因此,解决方案是以下各项的组合。
请参见示例代码:
groups = 10 <br/>
for x in range(0, groups):
df_joined = df1.join(broadcast(df2), (df1.authors == df2.authors)).where((col("df1.content_id") % groups == x))
结合以上3种方法,我能够在1.5小时内完成工作,并且仅使用了1个主节点和4个工作节点(每个vm 8个CPU和30 GB)。