【问题标题】:Spark: Difference between numPartitions in read.jdbc(..numPartitions..) and repartition(..numPartitions..)Spark:read.jdbc(..numPartitions..) 和 repartition(..numPartitions..) 中的 numPartitions 之间的区别
【发布时间】:2018-06-24 20:47:17
【问题描述】:

我对以下方法中numPartitions 参数的行为感到困惑:

  1. DataFrameReader.jdbc
  2. Dataset.repartition

DataFrameReader.jdbcofficial docs关于numPartitions参数表示如下

numPartitions: 分区数。这与 lowerBound(包括)、upperBound(不包括)一起形成了用于生成的 WHERE 子句表达式的分区步幅,用于均匀地拆分列 columnName。

official docs 中的Dataset.repartition

返回一个完全具有numPartitions 分区的新数据集。


我目前的理解:

  1. DataFrameReader.jdbc 方法中的numPartition 参数控制从数据库读取数据时的并行度
  2. Dataset.repartition 中的numPartition 参数控制输出文件的数量,当此DataFrame 写入磁盘时将生成

我的问题:

  1. 如果我通过DataFrameReader.jdbc 读取DataFrame,然后将其写入磁盘(不调用repartition 方法),那么输出中的文件是否仍与我写出@ 时一样多调用repartition 后将 987654338@ 写入磁盘?
  2. 如果上述问题的答案是:
    • 是的:那么在使用DataFrameReader.jdbc 方法(带有numPartitions 参数)读取的DataFrame 上调用repartition 方法是否多余?
    • 否:那么请更正我理解的错误。同样在这种情况下,DataFrameReader.jdbc 方法的 numPartitions 参数是否应该被称为 'parallelism'

【问题讨论】:

    标签: apache-spark dataframe spark-dataframe spark-jdbc


    【解决方案1】:

    简答:两种方法中numPartitions 参数的行为(几乎)没有区别


    read.jdbc(..numPartitions..)

    这里,numPartitions 参数控制:

    1. 并行连接数,将与MySQL(或任何其他RDBM将数据读取DataFrame
    2. 并行度关于读取DataFrame 的所有后续操作,包括写入磁盘,直到在其上调用repartition 方法

    repartition(..numPartitions..)

    这里的numPartitions 参数控制并行度,这将在执行DataFrame 的任何操作 中表现出来,包括写入磁盘强>。


    所以基本上使用spark.read.jdbc(..numPartitions..) 方法读取MySQL 表获得的DataFrame 行为相同(在对其执行的操作中表现出相同的并行度),就好像它是read 没有 parallelism 并且之后在其上调用了 repartition(..numPartitions..) 方法(显然具有相同的 numPartitions 值)


    要回答确切的问题:

    如果我通过 DataFrameReader.jdbc 读取 DataFrame 然后将其写入磁盘 (不调用重新分区方法),那么还会有 as 输出中的许多文件,如果我写出一个 调用重新分区后 DataFrame 到磁盘?

    是的

    假设 read 任务已通过提供适当的参数(columnNamelowerBoundupperBoundnumPartitions并行对生成的DataFrame包括写入的所有操作将并行执行。在这里引用official docs

    numPartitions:表读写中可用于并行的最大分区数。这也决定了并发 JDBC 连接的最大数量。如果要写入的分区数超过此限制,我们会在写入前通过调用 coalesce(numPartitions) 将其减少到此限制。


    是的:那么在使用 DataFrameReader.jdbc 方法(带有 numPartitions 参数)读取的 DataFrame 上调用 repartition 方法是否多余?

    是的

    除非您调用repartition 方法的其他变体(采用columnExprs 参数的方法),否则在这样的DataFrame(具有相同的numPartitions)参数上调用repartition 是多余的。但是,我不确定在 已经并行化 DataFrame 上强制相同的 并行度 是否也会在 @987654350 中调用 shuffle 数据@不必要的。一旦我遇到它会更新答案。

    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多