Google Cloud Dataproc上的Pyspark作业失败

时间:2018-06-04 20:44:37

标签: apache-spark pyspark google-cloud-dataproc

我创建了一个包含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内存的集群已经非常强大。

希望得到高级用户和专家的帮助。提前谢谢!

1 个答案:

答案 0 :(得分:1)

失败的根本原因与自交叉联接引起的内存相关。即使我一直在增加CPU能力和内存,它仍然失败。因此,解决方案是以下各项的组合。

  1. 使用repartition()函数在联接之后,下一个转换之前重新分区。这将解决数据偏斜问题。例如:df_joined = df_joined.repartition(partitions)
  2. 广播右表。
  3. 将其拆分为10个迭代。在每次迭代中,我只处理左表的1/10和右表的完整数据。

请参见示例代码:

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)。