Spark 将数据写回 HDFS

Spark writing data back to HDFS

我有一个关于 spark 在计算后写入结果的问题。我知道每个执行器在其分区上完成工作后将其结果写回 HDFS/local-filesystem(基于使用的集群管理器)。

这是有道理的,因为如果您不需要任何结果聚合,则不需要等待所有执行程序完成并将结果写回。

但是当数据需要在特定列(例如 ID)上按升序或降序排序时,写入操作如何工作?

spark 的逻辑计划是否会在计算开始之前首先根据每个执行程序的 ID 对分区进行排序?在这种情况下,任何执行程序都可以先完成并开始将其结果写入 HDFS 那么整个框架如何确保最终结果已排序?

提前致谢

根据我从这个答案中的理解: 排序是一个使用 RangePartitioner 将所有数据集项目洗牌到“已排序”分区的过程:分区之间的“边界”是 selected 作为数据集样本的百分位项。

所以像这样:

  • 收集样本集
  • 排序项目
  • select 第 k*i 个项目,其中 i 是样本大小除以输出分区数
  • 广播那些边界
  • 在所有输入分区上,对于所有项目,通过与广播边界进行比较,找到项目应该去哪个输出分区
  • send/shuffle 那些输出分区中的数据
  • 对每个分区内的项目进行排序

如果我们有数据集 [1,5,6,8, 10, 20, 100](分布式且以任何顺序)并将其分为 3 个分区,则将给出:

  • 分区 1 = [1,5,6] (sorted within partition)
  • 分区 2 = [8,10] ( " )
  • 分区 3 = [20,100] ( " )

因此,任何后续操作都可以在每个分区上独立完成,包括写入。

请记住:

  • spark 在内存中管理数据,并根据配置在本地写入分区数据。
  • 写入是按分区完成的,但输出文件(在像 hdfs 这样的分布式文件系统中)是隐藏的,直到所有数据都被写入。好吧,至少对于 parquet writer 而言,对于其他 writer 则不确定。
  • 如您所料,排序是一项开销很大的操作