【问题标题】:Coalesce reducing JDBC read parallelism合并减少 JDBC 读取并行度
【发布时间】:2018-04-18 05:37:09
【问题描述】:

我利用SparkJDBC 功能如下:

  • MySQL 表读入DataFrame
  • 改造他们
  • 合并他们
  • 写信给HDFS

DataFrame 的整个生命周期内,不会对其执行actions。它曾经按预期工作,但最近我遇到了问题。感谢Spark惰性评估coalesce 导致读取操作的并行度降低。


因此,如果我使用DataFrameReader.jdbc(..numPartitions..)numPartitions=42 读取DataFrame,然后在写入之前将coalesce 读取到6 个partitions,那么它会以并发读取DataFrame > 仅 6 个(仅向 MySQL 发送 6 个查询)。我想重复一遍,它之前使用了 parallelism 为 42 的读取,然后执行 coalesce

我最近在EMR 5.13 上迁移到Spark 2.3.0,这可能与此有关吗?有解决办法吗?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    由于 Spark 的惰性评估,合并导致读取操作的并行度降低。

    这与懒惰无关。 coalesce 故意不创建 analysis barrier

    但是,如果您要进行剧烈的合并,例如对于 numPartitions = 1,这可能会导致您在比您喜欢的更少的节点上进行计算(例如,在 numPartitions = 1 的情况下为一个节点)。为避免这种情况,您可以调用 repartition。这将添加一个 shuffle 步骤,但意味着当前的上游分区将并行执行(无论当前分区是什么)。

    所以只需按照文档操作并使用repartition 而不是coalesce

    【讨论】:

    • 如果我正确理解了给定的语句,那么我必须使用repartition 而不是coalesce(使用相同的numPartitions)来解决我面临的问题。尽管这会导致完全洗牌,但它仍然会摆脱这种所谓的减少并行度。对吗?
    • 它不是所谓的 - 它实际上是并发的上限。
    • 确实如此。这意味着并发性较低是您尝试使用coalesce而不是repartition避免完全随机播放时所付出的代价跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 2019-04-21
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2016-06-11
    • 2012-09-24
    相关资源
    最近更新 更多