Google Cloud Dataproc 上的 Pyspark 作业失败

Posted

技术标签:

【中文标题】Google Cloud Dataproc 上的 Pyspark 作业失败【英文标题】:Pyspark Job Failure on Google Cloud Dataproc 【发布时间】:2018-06-04 20:44:37 【问题描述】:

我创建了一个包含 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 警告 org.apache.spark.storage.BlockManagerMasterEndpoint:没有更多副本可用于 rdd_43_155!

我将尝试创建一个更高级别的集群,看看它是否有效。但我怀疑它是否能解决问题,因为具有 1 个主节点和 10 个节点的集群具有 32 个 vCPU、120 GB 内存已经非常强大了。

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

【问题讨论】:

我没有使用 google dataproc 的经验。但如果您可以访问 spark web ui,请参阅。并试图找出您的查询发生的 spark web ui 中的数据倾斜可能会有所帮助。如果存在数据倾斜,重新分区以获得更多分区会有所帮助。如果您包含有问题的查询,您可能更有可能获得帮助。 @ruseel 我能够解决问题。这部分与数据倾斜有关。感谢您的建议,我查看了 UI 以查看 CPU 和内存。 【参考方案1】:

失败的根本原因与自交叉连接引起的内存有关。即使我不断增加 CPU 功率和内存,它仍然失败。所以这个问题的解决方案是以下的组合。

    使用 repartition() 函数在连接之后、下一次转换之前重新分区。这将解决数据倾斜问题。例如:df_joined = df_joined.repartition(partitions) 广播右表。 将其分解为 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 个工作节点(每个虚拟机使用 8 个 CPU 和 30 GB)。

【讨论】:

以上是关于Google Cloud Dataproc 上的 Pyspark 作业失败的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Dataproc 删除 BigQuery 表不起作用

使用 google-cloud-python API 访问 Dataproc 时出现无效区域错误

来自 DataProc 集群的 Google Cloud Sdk

如何在 Google Cloud Platform 上查看 Dataproc 作业的输出文件

在 Google Cloud DataProc 上安排 cron 作业

Google Cloud Dataproc 无法使用初始化脚本创建新集群