Spark JDBC中batch size参数对插入操作的影响咨询
Spark JDBC
batchsize 参数作用说明 核心定义
Spark JDBC提供的batchsize参数默认值为1000,作用是控制单个JDBC批量请求中包含的数据行数量,底层基于JDBC标准的addBatch()、executeBatch()接口实现。
针对两个疑问的明确解答
- 不是「单条bulk insert命令完成批量写入」:默认情况下,Spark是把多条单条
INSERT语句打包到同一个网络请求中发送给数据库,不会自动合并为INSERT INTO table VALUES (v1), (v2), ... (vn)这类单条多行插入语法。如果要实现语法级的bulk insert效果,需要在JDBC连接参数中额外开启对应数据库驱动的批量重写配置,比如MySQL的rewriteBatchedStatements=true,开启后驱动会自动把批量单条插入请求重写为单条多行插入语句,大幅提升写入性能。 - 也不是「一批插入命令执行完就统一提交」:事务提交逻辑和
batchsize没有关联,Spark JDBC默认以单个Task分区为单位做事务提交,也就是单个分区内的所有数据全部写完之后才会触发一次提交,单个分区可能会执行多次executeBatch()(每攒够batchsize行就执行一次),但不会每执行完一个批次就提交一次。
实际使用注意事项
- 不要盲目调大
batchsize,过大会导致单次网络请求包超过数据库的最大包限制、或者触发写入超时,建议根据单行数据大小调整到1000~10000的区间即可。 - 对于支持批量语句重写的数据库,建议配合驱动参数使用,性能提升幅度可达数倍到数十倍。
内容的提问来源于stack exchange,提问作者justlikethat
相关产品推荐
相关产品推荐

