我利用 Spark 的 JDBC 功能如下:
Spark
JDBC
MySQL
DataFrame
HDFS
在的整个生命周期内 数据帧 ,则, 不 action 已执行 在上面。它过去工作正常,但最近我遇到了一些问题。幸亏 火花 的 惰性评估 这个 coalesce 导致 相似 的读取操作。
数据帧
action
火花
coalesce
所以如果我阅读 数据帧 使用 DataFrameReader.jdbc(..numPartitions..) 具有 numPartitions=42 ,然后 合并 it至6 partition 在写入之前,它会读取 数据帧 使用 并发性 共6个(仅激发6个查询到 MySQL ).我想重复一下,之前它使用read with 相似 第42页并执行 合并 之后
DataFrameReader.jdbc(..numPartitions..)
numPartitions=42
合并
partition
我最近迁移到 Spark 2.3.0 在…上 EMR 5.13 ,这可能与此有关吗?是否有解决方法?
Spark 2.3.0
EMR 5.13
由于Spark的延迟计算,合并导致读取操作的并行性降低。
这与懒惰无关。 coalesce 故意不创造 analysis barrier :
但是,如果要进行剧烈合并,例如,将numPartitions=1,这可能会导致计算在比您喜欢的节点更少的节点上进行(例如,在numPartitions=1的情况下为一个节点)。为了避免这种情况,可以调用重新分区。这将添加一个洗牌步骤,但意味着当前上游分区将并行执行(无论当前分区是什么)。
因此,只需遵循文档并使用 repartition 而不是 合并 。
repartition