很多教程都提到RDD
的pre-partition会优化spark jobs的data shuffling。令我困惑的是,据我了解,预分区也会导致洗牌,为什么在这里提前洗牌会有利于某些操作?特别是 spark it self 会针对一组转换做优化。
例如:
如果我想加入两个数据集国家(id,国家)和收入(id,(收入,月,年)),这两种操作有什么区别? (我使用 PySpark 架构)
按id预分区
country = country.partitionBy(10).persist() income = income.partitionBy(10).persist() income.join(country)
不预分区直接加入:
income.join(country)
如果我只需要计算一次这个join,在join之前使用pre-partition还有用吗?我认为 partitionBy
也需要改组,对吗?如果我在 join 之后的进一步计算都是基于国家/地区作为键(之前用于 join 的键 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 路径时,抢占式分区才有意义。如果您只加入
一次,它就会在不同的地方洗牌。
关于hadoop - 为什么预分区会因为减少洗牌而有利于 Spark 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45604297/