繁体   English   中英

spark shuffle 分区与合并

[英]spark shuffle partitions with coalesce

假设当我要读取一些数据时,我有一个包含 20 个分区的数据集。 然后我对该数据集进行聚合操作,这将使分区数为 200(因为默认的随机分区大小)。 现在,到目前为止没有对该数据集调用任何操作,我在同一数据集上应用合并,在合并操作中给出 30 个分区,然后对该数据集调用一些火花操作。

所以我的问题是,当该数据集进行聚合操作时,将有多少分区在起作用? 它是 30 个分区(因为这是给定的合并分区)还是 200 个随机分区?

编辑以提供更多关于我的问题的说明:我知道除非我们彻底改变分区数,否则合并操作本身不会进行洗牌。 我也知道最终数据集将只有 numPartitions 大小,但我的问题是,如果我在对该数据帧调用任何操作之前更改分区数,结果操作是否会在我们给出的最终分区数上运行(在我的情况下为 30 ) 或者它也将遵守我们在聚合操作中给出的中间分区大小。 因此,总而言之,我主要看是先用 200 个分区完成聚合,然后应用合并,还是也将仅用 30 个(在我的情况下)分区执行聚合。

合并

返回一个新的 SparkDataFrame,它正好有 numPartitions 个分区。 此操作会导致窄依赖关系,例如,如果您从 1000 个分区变为 100 个分区,则不会进行 shuffle,而是 100 个新分区中的每一个都将占用 10 个当前分区。 如果请求更多的分区,它将保持当前的分区数。

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

合并:将数据混洗到现有数量的分区中。

是的,您的最终操作将对由合并生成的分区进行操作,例如在您的情况下是 30。正如我们所知,有两种类型的转换窄和宽。 窄变换不进行混洗,也不进行重新分区,而宽混洗在节点之间混洗数据并生成新分区。 因此,如果您检查合并是一个广泛的转换,它将在继续进行下一个转换或操作之前创建一个新阶段,并且下一阶段将处理由合并生成的随机分区。 所以是的,您的操作将适用于 30 个分区。

https://www.google.com/amp/s/data-flair.training/blogs/spark-rdd-operations-transformations-actions/amp/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM