Scala Spark:即使输出数据非常小,合并速度也非常慢

Scala Spark:即使输出数据非常小,合并速度也非常慢,scala,apache-spark,coalesce,Scala,Apache Spark,Coalesce,我在Spark中有以下代码: myData.filter(t => t.getMyEnum() == null) .map(t => t.toString) .saveAsTextFile("myOutput") myOutput文件夹中有2000多个文件,但只有少数t.getMyEnum()==null,因此只有很少的输出记录。因为我不想在2000+输出文件中只搜索几个输出,所以我尝试使用coalesce组合输出,如下所示: myData.filter(

我在Spark中有以下代码:

myData.filter(t => t.getMyEnum() == null)
      .map(t => t.toString)
      .saveAsTextFile("myOutput")

myOutput文件夹中有2000多个文件,但只有少数t.getMyEnum()==null,因此只有很少的输出记录。因为我不想在2000+输出文件中只搜索几个输出,所以我尝试使用coalesce组合输出,如下所示:

myData.filter(t => t.getMyEnum() == null)
      .map(t => t.toString)
      .coalesce(1, false)
      .saveAsTextFile("myOutput")
然后工作变得非常慢!我想知道为什么它这么慢?只有几个输出记录分散在2000多个分区中?有没有更好的办法来解决这个问题

如果您正在进行剧烈合并,例如to numPartitions=1,则这可能会导致您的计算发生在比您希望的更少的节点上(例如,numPartitions=1的情况下为一个节点)。要避免这种情况,可以传递shuffle=true。这将添加一个洗牌步骤,但意味着当前上游分区将并行执行(无论当前分区是什么)

注意:使用shuffle=true,您实际上可以合并到更大的 分区数。如果您有少量的分区(例如100个),并且可能有一些分区异常大,那么这将非常有用。调用coalesce(1000,shuffle=true)将产生1000个分区,其中数据使用散列分区器分发

因此,尝试将true传递给
coalesce
函数。i、 e

myData.filter(_.getMyEnum == null)
      .map(_.toString)
      .coalesce(1, shuffle = true)
      .saveAsTextFile("myOutput")

coalesce(1,shuffle=true)
是否等同于
repartition(1)
?是的,它是相同的:如果您查看源代码,repartition(1)在默认情况下已将shuffle设置为true。谢谢。它将我10分钟的任务优化为1.8分钟