YepTen

Results 22 comments of YepTen

因为你配置的splitPk字段是字符串类型,这是正常现象,代码逻辑就这样的. 修改建议: 1. splitPk字段是数字类型[**PS:强烈建议设置splitPk为数字类型**]. 2. splitPk字段是字符串类型,但**需保证该字段的字符集是大小写敏感**的,不然会出问题,会导致你同步的数据不对,比如你原表只有100条数据,但最终却有120条入库. 3. 不使用splitPk字段,此时任务不会切分,可能运行时间长. 该现象是这个类导致的 common/src/main/java/com/alibaba/datax/common/util/RangeSplitUtil.java 问题出在stringToBigInteger()和bigIntegerToString()这两个方法上.

你看下这个文档的说明 postgresqlreader/doc/postgresqlreader.md splitPk仅支持整型(bigint, bigserial, integer, smallint, serial),不支持浮点类型,字符串,日期等类型.

这里统计的是单个Task的读取数量,确切的说是参数querySql查询出来的数量,不是Job的. 当你的Job只有1个Task的时候,才会一致. 读取的总量在任务执行结束后不是有统计吗,用那个就行.

你的整个job配置发来看看.querySql也贴下. 如果配置了splitPk,检查下你的splitPk对应的类型是否为数字类型.

jdbcurl虽然是个数组,但他只能配置一个. PS:之所以使用JSON数组描述连接信息,是因为阿里集团内部支持多个IP探测,如果配置了多个,MysqlReader可以依次探测ip的可连接性,直到选择一个合法的IP。如果全部连接失败,MysqlReader报错。 注意,jdbcUrl必须包含在connection配置单元中。对于阿里集团外部使用情况,JSON数组填写一个JDBC连接即可。 不同的Mysql实例只能配置多个任务,不能在一个任务中配置. mysqlreader/doc/mysqlreader.md 这个文档说得很清楚.

应该不行,username和password这两个参数是和connection这个参数一级的,而jdbcurl是参数connection的子级. 对子任务的配置处理,在代码里是JobContainer.split()这个方法,然后调用doReaderSplit()方法,在MysqlReader中,最终是调用ReaderSplitUtil.整个链路看下来,所有的子任务都是用的同一个username和password.

嗯,要这个功能的话,只能自己在源码的基础上改改了. 不想改源码的话,也就多配置几个任务的事,也不是太麻烦.

DataX项目里没看到有hologreswriter这个组件啊,到是有个hologresjdbcwriter. 我没用过hologresjdbcwriter这个组件, 我看了下hologresjdbcwriter.post的代码猜测问题可能出在DataBaseType这个类或jdbcUrl.replace("postgresql", "hologres")这个逻辑. 日志中报java.lang.ClassNotFoundException: org.postgresql.Driver. 代码中有这样的逻辑String tempJdbcUrl = jdbcUrl.replace("postgresql", "hologres"); 而DataBaseType中 PostgreSQL("postgresql", "org.postgresql.Driver")是这个. BaseWriter.post()方法中获取数据库链接connection不要使用DBUtil,DBUtil获取链接connection使用DataBaseType获取jdbcUrl,参照prepare()方法中的实现,使用DriverManager.getConnection()的方式.

你把splitPk参数去掉在跑一把看看. 还有你原表的id是自增主键或者数字类型吗,不能是字符串.