我杠杆Spark
's JDBC
能力如下:
- Read
MySQL
表成DataFrame
-
转换 them
-
Coalesce them
- 将它们写给
HDFS
在整个生命周期中DataFrame
, no action
执行在上面。它曾经按预期工作,但最近我遇到了问题。谢谢Spark
's 惰性评估, the coalesce
导致减少并行性的读操作。
所以如果我读DataFrame
using DataFrameReader.jdbc(..numPartitions..)
with numPartitions=42
, 进而coalesce
到 6partition
s 在写入之前,然后读取DataFrame
with a 并发性仅 6 个(仅触发 6 个查询MySQL
)。我想重复一下之前它使用的 read with并行性42 并执行coalesce
然后。
我最近迁移到Spark 2.3.0
on EMR 5.13
,这可能与此有关吗?有解决方法吗?
由于 Spark 的惰性求值,合并导致读取操作的并行性降低。
这与懒惰无关。coalesce
故意不创造分析障碍 https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.Dataset@coalesce(numPartitions:Int):org.apache.spark.sql.Dataset%5BT%5D:
然而,如果你正在进行剧烈的合并,例如numPartitions = 1,这可能会导致您的计算发生在比您想要的更少的节点上(例如,在 numPartitions = 1 的情况下只有一个节点)。为了避免这种情况,您可以调用repartition。这将添加一个洗牌步骤,但意味着当前的上游分区将并行执行(无论当前分区是什么)。
所以只需遵循文档并使用repartition
代替coalesce
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)