合并减少JDBC读取并行性

时间:2018-04-18 05:37:09

标签: apache-spark

我利用Spark的{​​{1}}功能,如下所示:

  • JDBC表读入MySQL
  • 转换他们
  • 合并他们
  • 将它们写入DataFrame

HDFS的整个生命周期内,没有执行DataFrame 。它曾经按预期工作,但最近我遇到了问题。感谢action延迟评估Spark导致读取操作的并行减少。

因此,如果我使用coalesce使用DataFrame阅读DataFrameReader.jdbc(..numPartitions..),然后numPartitions=42将其写入6 coalesce s,那么它会读取{{ 1}} 并发仅为6(仅向partition发出6次查询)。我想重复一遍,之前它使用了42的 parallelism 读取,然后执行DataFrame

我最近在MySQL上迁移到了coalesce,这可能与此有关吗?有解决方法吗?

2 个答案:

答案 0 :(得分:1)

  

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

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

  

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

因此,请按照文档操作,使用repartition代替coalesce

答案 1 :(得分:-1)

Coalesce操作实质上在数据帧中创建了更少数量的分区,从而降低了并行性。因此,如果您希望在读取JDBC时保持高并行性,则在DAG仍未实现时无法进行合并。

你能做的是

  1. 阅读Mysql
  2. 写入具有大量分区的磁盘。
  3. 从磁盘读取
  4. 合并并重写到磁盘
  5. 删除旧的写入磁盘
  6. 在这里,您在阅读JDBC时保留了并行性。但是,最终数据集在磁盘中合并。