tispark插入数据超大事务卡住

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:3.0.5
  • 【问题描述】: 1.使用mysql客户端执行insert into select ,很快报错事务太大(30w)
    2.使用tispark向tidb写入数据(30w),运行一个小时没有结束

如何诊断?

spark写入代码“

dataset.write()
                .mode(saveMode)
                .format("jdbc")
                .option("driver", tidbDatabaseBean.getDriver())
                .option("url", tidbDatabaseBean.getUrl())
                .option("useSSL", tidbDatabaseBean.getUseSSL())
                .option("dbtable", table)
                .option("isolationLevel", tidbDatabaseBean.getIsolationLevel())
                .option("user", tidbDatabaseBean.getUser())
                .option("password", tidbDatabaseBean.getPassword())
                .save();

首先用spark jdbc写入的话,是没有原子性保证的,然后如果非要用jdbc来写的话,可以把batch insert打开,否则spark jdbc 插入的话应该是一条一条插入的,那样的话30w条写入是会很慢的。

2赞

batch insert 如何开启?是这种?

另外,因为一个客户端 bug,批量更新时如果要配置 rewriteBatchedStatements = true 和 useServerPrepStmts = true,推荐同时配置 allowMultiQueries = true 参数来避免这个 bug。

找到了:

.option(JDBCOptions.JDBC_BATCH_INSERT_SIZE, 150)

嗯,在jdbc的url上带上rewriteBatchedStatement然后设置JDBC_BATCH_INSERT_SIZE来控制batch size。你可以参照这个来写url: jdbc:mysql://ip:4000/dbname?useSSL=false&useServerPrepStmts=true&useConfigs=maxPerformance&sessionVariables=tidb_batch_commit=1