当您需要进行非常大的洗牌时,Spark 会中断

Spark breaks when you need to make a very large shuffle

我正在处理 1 TB 的数据,此刻我需要加入两个较小的数据帧,我不知道大小,但它有超过 200 GB,我收到以下错误。

中断发生在运行 2 小时后的中间。

在我看来是记忆棒,但这没有意义,因为查看 UI Spark Ganglia,RAM 内存未达到极限,如下图所示.

有谁知道如何在不减少分析数据量的情况下解决这个问题。

我的集群有: 1 x 主节点 n1-highmem-32 4 x 从节点 n1-highmem-32

 [org.apache.spark.SparkException: Job aborted due to stage failure: Task 3 in stage 482.1 failed 4 times, most recent failure: Lost task 3.3 in stage 482.1 (TID 119785, 10.0.101.141, executor 1): java.io.FileNotFoundException: /tmp/spark-83927f3e-4511-1b/3d/shuffle_248_72_0.data.f3838fbc-3d38-4889-b1e9-298f743800d0 (No such file or directory)
    at java.io.FileOutputStream.open0(Native Method)

        Caused by: java.io.FileNotFoundException: /tmp/spark-83927f3e-4511-1b/3d/shuffle_248_72_0.data.f3838fbc-3d38-4889-b1e9-298f743800d0 (No such file or directory)
      at java.io.FileOutputStream.open0(Native Method)
      at java.io.FileOutputStream.open(FileOutputStream.java:270)][1]

此类错误通常发生在某些任务存在更深层次的问题时,例如严重的数据倾斜。由于您没有提供足够的详细信息(请务必阅读如何提问和如何创建最小、完整和可验证的示例)和作业统计信息,我能想到的唯一方法是显着增加洗牌分区的数量:

´´´ sqlContext.setConf("spark.sql.shuffle.partitions", 2048)

´´´