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

时间:2017-08-10 04:07:39

标签: hadoop apache-spark pyspark rdd partition

许多教程都提到RDD的预分区将优化火花作业的数据重组。我感到困惑的是,对于我的理解,预分区也会导致洗牌,为什么提前洗牌会对某些操作有所帮助?特别是火花它自我将为一组变换做优化。

例如:

如果我想加入两个数据集国家(id,国家)和收入(id,(收入,月份,年份)),这两种操作之间的区别是什么? (我使用PySpark架构)

  1. 按ID

    进行预分区
    country = country.partitionBy(10).persist()
    income = income.partitionBy(10).persist()
    income.join(country)
    
  2. 直接加入,无需预分区:

    income.join(country)
    
  3. 如果我只需要计算一次这个连接,在加入之前使用预分区是否仍然有用?我认为partitionBy也需要洗牌吗?如果我在加入后的进一步计算都是基于使用country作为键(用于连接的前一个键id将无用并从RDD中删除),我该怎么做才能优化计算?

2 个答案:

答案 0 :(得分:1)

  

如果我只需要计算一次这个连接,在加入之前使用预分区是否仍然有用?我认为partitionBy还需要改组吗?

你是对的。仅当分区数据将被重用于多个DAG路径时,抢占式分区才有意义。如果你join只是一次它只是在另一个地方洗牌。

答案 1 :(得分:0)

parititionBy 对数据进行随机播放,如果这就是您的要求。

通过先发制人partitionBy,你不要避免洗牌。你只需将它推到另一个地方。如果分区RDD多次重复使用,这可能是一个好主意,但是对于一次性连接你没有任何好处。