alibaba / DataX

DataX是阿里云DataWorks数据集成的开源版本。
Other
15.55k stars 5.35k forks source link

mongo的表数量大于2^31-1时入仓异常 #2140

Open HanTianPeng opened 1 month ago

HanTianPeng commented 1 month ago

integer conv to double err when mongo one collection data count max 2^31-1。

image

当mongo数据小于等于2^31-1时,mongo-client返回的为integer类型 当mongo数据大于2^31-1时,超过integer最大上限,mongo-client返回的为double类型。 所以需要判断类型,再做转换。不能统一用integer进行转换。

FuYouJ commented 1 month ago

这儿尝试改过,但是驱动的底层就是int类型,分片分不了。但是如果你的账号权限特别高就不会走这段代码了,会走 SplitVector

FuYouJ commented 1 month ago

因为就算这里转换为了double,后面的分片原作者用的是 skip size 分片,skip size 必须是int类型。 解决办法有 1:随机抽样(datax 暂时没哟) 2:使用支持 SplitVector 权限的账号 (datax 有)

HanTianPeng commented 1 month ago

这儿尝试改过,但是驱动的底层就是int类型,分片分不了。但是如果你的账号权限特别高就不会走这段代码了,会走 SplitVector

不是的,超过int的最大数量,int承接不了。所以底层返回的是double类型。你看后面代码查size的时候就是进行了类型校验。而且我这边已经落地了,没有问题。

HanTianPeng commented 1 month ago

因为就算这里转换为了double,后面的分片原作者用的是 skip size 分片,skip size 必须是int类型。 解决办法有 1:随机抽样(datax 暂时没哟) 2:使用支持 SplitVector 权限的账号 (datax 有)

有没有考虑过这个原因: 设计的时候是期望通过count和channel个数进行split;count为double问题解决后,split完一定是int类型,如果不是int类型,说明channel配置的不合理。性能和耗时都是巨大的。所以只需要解决count问题:count问题和size问题是一样的,size是处理了类型转换,但是count没有处理。依据同样方案即可。

FuYouJ commented 4 weeks ago

在这里假如表的数据大于了int类型,这里使用skip分页计算每个分片的id区间,算到最后还是会超int范围的

image image
FuYouJ commented 4 weeks ago

不过这里确实如果表就大于int范围了,count那里就运行不下去了。我跟你邮件讨论下