为什么预分区会因为减少洗牌而有利于火花工作?

Why pre-partition will benefit spark job because of reducing shuffling?

很多教程提到RDD的pre-partition会优化spark jobs的data shuffling。令我困惑的是,据我了解,预分区也会导致洗牌,为什么在这里提前洗牌会有利于某些操作?特别是 spark it self 会针对一组转换做优化。

例如:

如果我想加入两个数据集country(id,country)和income(id,(income,month,year)),这两种操作有什么区别? (我使用 PySpark 架构)

  1. 按id预分区

    country = country.partitionBy(10).persist()
    income = income.partitionBy(10).persist()
    income.join(country)
    
  2. 不预分区直接加入:

    income.join(country)
    

如果我只需要计算一次这个join,在join之前使用pre-partition还有用吗?我想 partitionBy 也需要洗牌吧?而如果我在join之后的进一步计算都是以country为key(之前join的key id将无用,从RDD中剔除),我应该如何优化计算?

If I only need to calculate this join once, is it still useful to use pre-partition before join? I think partitionBy also requires shuffling right?

你完全正确。仅当分区数据将重新用于多个 DAG 路径时,抢占式分区才有意义。如果你只 join 一次,它就会在不同的地方洗牌。

parititionBy 不会 打乱数据,如果这就是你要问的。

通过先发制人地应用 partitionBy,您无法避免随机播放。你只要把它推到另一个地方。如果分区的 RDD 被多次重用,这可能是个好主意,但对于一次性连接你什么也得不到。