为什么预分区会因为减少洗牌而有利于spark作业?

eit6fx6z  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(343)

许多教程提到 RDD 将优化spark作业的数据洗牌。我困惑的是,对于我的理解,预分区也会导致洗牌,为什么在这里提前洗牌会有利于一些操作?特别是spark-it-self将对一组变换进行优化。
例如:
如果我想加入两个数据集country(id,country)和income(id,(income,month,year)),这两种操作有什么区别(我使用pyspark模式)
按id预分区

country = country.partitionBy(10).persist()
income = income.partitionBy(10).persist()
income.join(country)

无需预分区直接连接:

income.join(country)

如果我只需要计算这个连接一次,那么在连接之前使用预分区是否仍然有用?我想 partitionBy 也需要洗牌对吗?如果我在join之后的进一步计算都是基于使用country作为键(以前用于join的键id将是无用的,并且将从 RDD ),如何优化计算?

xmjla07d

xmjla07d1#

parititionBy 如果这是您要问的问题,则不洗牌数据。
通过应用 partitionBy 你不能先发制人地避开洗牌。你只要把它推到另一个地方。如果分区rdd被多次重用,这是一个好主意,但是一次性的连接没有任何好处。

bxpogfeg

bxpogfeg2#

如果我只需要计算这个连接一次,那么在连接之前使用预分区是否仍然有用?我认为分区也需要洗牌,对吗?
你完全正确。只有在分区数据将被多个dag路径重用时,抢占式分区才有意义。如果你 join 只有一次它只是在另一个地方移动。

相关问题