hadoop - 为什么预分区会因为减少洗牌而有利于 Spark 工作?

标签 hadoop apache-spark pyspark rdd partition

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

例如:

如果我想加入两个数据集国家(id,国家)和收入(id,(收入,月,年)),这两种操作有什么区别? (我使用 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 之后的进一步计算都是基于国家/地区作为键(之前用于 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/

相关文章:

hadoop - 什么会导致 hadoop 在第一次尝试仍在运行时开始第二次任务尝试?

performance - Spark中有什么方法可以保持每个阶段的运行时间?

apache-spark - Spark 作业终止,java.io.EOFException : Unexpected EOF while trying to read response from server

hadoop - WordCount版本的执行时间不同

scala - 用不同的顺序对两列的Spark Dataframe进行排序

java - 如何比较两对rdd

apache-spark - 'replaceWhere'会导致删除吗?

apache-spark - 为什么驱动程序内存不在我的 Spark 上下文配置中?

apache-spark - 有没有办法在运行 master 的不同服务器上提交 spark 作业

Hadoop 名称节点格式 默认是