我利用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
,这可能与此有关吗?有解决方法吗?
答案 0 :(得分:1)
由于Spark的懒惰评估,合并导致读取操作的并行性降低。
与懒惰无关。 coalesce
故意不会创建analysis barrier:
然而,如果你正在进行激烈的合并,例如对于numPartitions = 1,这可能导致您的计算发生在比您喜欢的节点更少的节点上(例如,在numPartitions = 1的情况下,一个节点)。为避免这种情况,您可以调用重新分区。这将添加一个shuffle步骤,但意味着当前的上游分区将并行执行(无论当前分区是什么)。
因此,请按照文档操作,使用repartition
代替coalesce
。
答案 1 :(得分:-1)
Coalesce操作实质上在数据帧中创建了更少数量的分区,从而降低了并行性。因此,如果您希望在读取JDBC时保持高并行性,则在DAG仍未实现时无法进行合并。
你能做的是
在这里,您在阅读JDBC时保留了并行性。但是,最终数据集在磁盘中合并。