Spark emr repartition-compute-coalesce

时间:2016-01-17 16:59:05

标签: scala apache-spark

我有一个菜鸟火花问题。这是我正在尝试执行的程序:

dataset
 .join(anotherDataset)
 .repartition(7000)
 .flatmap(doComputation)
 .persist(StorageLevel.MEMORY_AND_DISK)
 .saveToS3()

我正在尝试的计算(doComputation)很昂贵,并且由于内存限制,我决定将数据集重新分区为7000个分区(即使我有1200个执行程序,因此一次只执行1200个)。然而,在进行计算之后,我尝试写入s3,其工作正常,但很少有任务最终超时并且重试作业。

1)为什么在执行昂贵的计算后我坚持生成的RDD会重试整个作业?

2)我在persist之后尝试合并,但是然后spark忽略了重新分区并仅执行了500个任务:

dataset
 .join(anotherDataset)
 .repartition(7000)
 .flatmap(doComputation)
 .persist(StorageLevel.MEMORY_AND_DISK)
 .coalesce(500)
 .saveToS3()

有什么方法可以重新分区(7000) - 计算(在这7000个分区上)-coalesce(500)然后写入s3?

1 个答案:

答案 0 :(得分:0)

  1. 分享作业的DAG可视化?您应该在stderr中看到一些异常(丢失的执行程序)等。
  2. Coalesc应该在重新分区时最小化数据移动。它忽略了重新分配,因为coalesc正在重新分配最小化混乱。