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 则不确定。
- 如您所料,排序是一项开销很大的操作
我有一个关于 spark 在计算后写入结果的问题。我知道每个执行器在其分区上完成工作后将其结果写回 HDFS/local-filesystem(基于使用的集群管理器)。
这是有道理的,因为如果您不需要任何结果聚合,则不需要等待所有执行程序完成并将结果写回。
但是当数据需要在特定列(例如 ID)上按升序或降序排序时,写入操作如何工作?
spark 的逻辑计划是否会在计算开始之前首先根据每个执行程序的 ID 对分区进行排序?在这种情况下,任何执行程序都可以先完成并开始将其结果写入 HDFS 那么整个框架如何确保最终结果已排序?
提前致谢
根据我从这个答案中的理解:
所以像这样:
- 收集样本集
- 排序项目
- 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 则不确定。
- 如您所料,排序是一项开销很大的操作