Spark JDBC读写数据库numPartitions默认值及并行写入问题
Spark JDBC 读取与写入时 numPartitions 相关疑问解答
我来帮你拆解这三个实际开发中常遇到的Spark JDBC参数问题:
问题1:读取时未在DbProperties中指定numPartitions,Spark使用的默认值是多少?
当你通过spark.read.jdbc()读取数据且未指定numPartitions时,Spark的默认值是1。这意味着整个读取过程会用单线程、单连接来拉取数据,如果目标表数据量很大,这种单分区读取的速度会非常慢,很容易成为性能瓶颈。
问题2:写入时仍未指定numPartitions,是否会创建并行连接?
写入时的并行连接数,本质上是由你要写入的DataFrame的当前分区数决定的,而不是单独依赖numPartitions参数(当然你也可以显式指定该参数来覆盖默认行为):
- 如果你的DataFrame是单分区(比如用默认值1读取后的状态),那写入时只会建立1个数据库连接,串行写入;
- 如果DataFrame有多个分区(比如读取时指定了numPartitions,或者后续做了
repartition操作),Spark会为每个分区创建一个独立的数据库连接,并行执行写入操作。
另外补充一点:写入时还有batchSize参数控制每个连接单次写入的数据量,但这和并行连接数是两个不同的概念。
问题3:读取时指定numPartitions=8,写入时未显式指定,该值是否依然有效?
读取时设置numPartitions=8会把读取到的DataFrame分成8个分区,但这个参数本身不会直接“继承”到写入阶段。写入时的并行度取决于DataFrame此时的分区数:
- 如果在读取后你没有对DataFrame做任何修改分区的操作(比如
repartition、coalesce),那么写入时会沿用这8个分区,也就是会创建8个并行连接来写入数据; - 但如果中间对DataFrame做了重分区操作(比如合并成2个分区,或者重分成10个分区),那写入时就会按照修改后的分区数来创建并行连接。
如果你想强制写入时的并行度,完全可以在df.write.jdbc()中单独指定numPartitions参数,不受读取阶段的设置影响。
内容的提问来源于stack exchange,提问作者Sparker0i
相关产品推荐
相关产品推荐

