Apache spark 联合降低JDBC读取并行性

Apache spark 联合降低JDBC读取并行性,apache-spark,Apache Spark,我利用Spark的JDBC功能如下: 将MySQL表读入DataFrame 改造他们 合并它们 将它们写入HDFS 在数据帧的整个生命周期内,不会对其执行任何操作。它过去工作正常,但最近我遇到了一些问题。由于Spark的延迟计算,合并导致读取操作的并行性降低 因此,如果我使用DataFrameReader.jdbc..numPartitions.读取DataFrame。。当numPartitions=42时,然后在写入之前将其合并为6个分区,然后以6的并发性读取数据帧,并向MySQL发出6次查询

我利用Spark的JDBC功能如下:

将MySQL表读入DataFrame 改造他们 合并它们 将它们写入HDFS 在数据帧的整个生命周期内,不会对其执行任何操作。它过去工作正常,但最近我遇到了一些问题。由于Spark的延迟计算,合并导致读取操作的并行性降低

因此,如果我使用DataFrameReader.jdbc..numPartitions.读取DataFrame。。当numPartitions=42时,然后在写入之前将其合并为6个分区,然后以6的并发性读取数据帧,并向MySQL发出6次查询。我想重复一下,前面它使用了read,并行度为42,然后执行coalesce

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

由于Spark的延迟计算,合并导致读取操作的并行性降低

这与懒惰无关。有意合并不会创建:

但是,如果您正在进行剧烈合并,例如,到numPartitions=1,这可能会导致您的计算发生在比您希望的更少的节点上,例如,在numPartitions=1的情况下发生一个节点。为了避免这种情况,可以调用重新分区。这将添加一个洗牌步骤,但意味着当前的上游分区将根据当前分区并行执行


因此,只需遵循文档,使用重新分区而不是合并。

如果我正确理解了给定的语句,那么我必须使用重新分区而不是使用相同的numpartition来克服我面临的问题。虽然这会导致完全的洗牌,但它仍然会消除所谓的降低并行性。这是正确的吗?它不是所谓的-它实际上是并发的上限。事实确实如此。这意味着,当您试图通过使用合并而不是重新分区来避免完全洗牌时,您将付出更低的并发性代价