记录datax限速问题一次持久的排查及最终解决

原创
2021/08/12 16:15
阅读数 3.6K

问题: 

datax同步数据, 传输一定量数据后, 速度变为0

 

排查:

尝试过更改job的json配置无数种, 都没有效果.

通过改datax源码加log, 发现卡的位置在ResultSet.next()的地方:com/alibaba/datax/plugin/rdbms/reader/CommonRdbmsReader.java:207

                ......
                ...... 

                rs = DBUtil.query(conn, querySql, fetchSize);
                queryPerfRecord.end();

                ResultSetMetaData metaData = rs.getMetaData();
                columnNumber = metaData.getColumnCount();

                //这个统计干净的result_Next时间
                PerfRecord allResultPerfRecord = new PerfRecord(taskGroupId, taskId, PerfRecord.PHASE.RESULT_NEXT_ALL);
                allResultPerfRecord.start();

                long rsNextUsedTime = 0;
                long lastTime = System.nanoTime();
                while (rs.next()) {  // <- 卡在这
                    rsNextUsedTime += (System.nanoTime() - lastTime);
                    this.transportOneRecord(recordSender, rs,
                            metaData, columnNumber, mandatoryEncoding, taskPluginCollector);
                    lastTime = System.nanoTime();
                }

                allResultPerfRecord.end(rsNextUsedTime);
                ......

于是想到驱动可能有问题,  升级了驱动, 并且改了一下这里的代码形式, 让异常更详细一些:

                rs.next();
                while (!rs.isAfterLast()) {
                    rsNextUsedTime += (System.nanoTime() - lastTime);
                    this.transportOneRecord(recordSender, rs,
                            metaData, columnNumber, mandatoryEncoding, taskPluginCollector);
                    lastTime = System.nanoTime();
                    try {
                        rs.next();
                    } catch (SQLException e) {
                        LOG.error("result set read exception: {}", e.getMessage(), e);
                        throw e;
                    }
                }

 

驱动是mysql-connector-java-5.1.34.jar的时候, datax的log里一直打印一个不变的速度, 没有抛异常.

将驱动更换为mysql-connector-java-5.1.49.jar后( 路径在datax/plugin/reader/mysqlreader/libs/) , 抛出异常:

java.sql.SQLException: Query execution was interrupted, maximum statement execution time exceeded

这个错误的原因是超出了语句最长执行时间.

 

解决:

jdbcUrl里设置 max_execution_time, 单位是毫秒, 如下

jdbc:mysql://localhost:3306/db_name?sessionVariables=MAX_EXECUTION_TIME=68400000

或者修改datax源码 com/alibaba/datax/plugin/rdbms/util/DataBaseType.java:45, 将sessionVariables=MAX_EXECUTION_TIME=68400000添加到默认的后缀.

然后替换datax部署位置中的jar包, 一般位置是:datax/plugin/reader/mysqlreader/libs/

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部