如何在Spark中并行处理数据,但将结果写入单个文件



我有一个Spark作业:

  • 从hdfs读取数据
  • 在没有混洗和聚合(仅映射操作(的情况下执行一些密集的转换
  • 将结果写回hdfs

假设我有10GB的原始数据(40个块=40个输入分区(,这将产生100MB的处理数据。为了避免在hdfs中生成许多小文件,我使用"coalize(1("语句来编写带有结果的单个文件。这样一来,我只运行了一个任务(因为"联合(1("和没有混洗(,它在一个线程中处理所有10GB。

是否有一种方法可以在40个并行任务中进行实际的密集处理,并在写入磁盘之前减少分区数量,避免数据混乱

我有一个可能可行的想法——在所有处理之后将数据帧缓存在内存中(进行计数以强制Spark缓存数据(,然后放入"合并(1("并将数据帧写入磁盘

文档清楚地警告了这种行为,并提供了解决方案:

然而,如果您正在进行剧烈的合并,例如对numPartitions=1进行合并,这可能会导致您的计算在比您喜欢的更少的节点上进行(例如,在numPartitions=1的情况下为一个节点(。为了避免这种情况,可以调用重新分区。这将添加一个shuffle步骤,但意味着当前上游分区将并行执行(无论当前分区是什么(。

所以改为

coalesce(1)

你可以试试

repartition(1)

最新更新