阿里dataworks抽取MongoDB报错- ERROR MongoDBReader$Task
创始人
2025-05-29 02:56:15
0

目录

背景:

查询文档,阿里云官网提供一下方案:

阿里云服务支持提供方案如下:

实验解决:

学习参数:


背景:


全量加载历史备份数据,条数 1亿条数据,全部导出占用磁盘450G左右
导出过程报一下错误
日志报错内容如下:

2023-03-15 21:25:39.715 [288235-0-0-writer] INFO  OdpsWriterProxy - write block 1584 ok.
2023-03-15 21:25:42.374 [288235-0-0-reader] ERROR MongoDBReader$Task - operation exceeded time limit
com.mongodb.MongoExecutionTimeoutException: operation exceeded time limitat com.mongodb.internal.connection.ProtocolHelper.createSpecialException(ProtocolHelper.java:243) ~[mongodb-driver-core-3.9.0.jar:na]at com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:175) ~[mongodb-driver-core-3.9.0.jar:na]at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:293) ~[mongodb-driver-core-3.9.0.jar:na]at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:255) ~[mongodb-driver-core-3.9.0.jar:na]at com.mongodb.internal.connection.UsageTrackingInternalConnection.sendAndReceive(UsageTrackingInternalConnection.java:99) ~[mongodb-driver-core-3.9.0.jar:na]at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.sendAndReceive(DefaultConnectionPool.java:444) ~[mongodb-driver-core-3.9.0.jar:na]at com.mongodb.internal.connection.CommandProtocolImpl.execute(CommandProtocolImpl.java:72) ~[mongodb-driver-core-3.9.0.jar:na]at com.mongodb.internal.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:200) ~[mongodb-driver-core-3.9.0.jar:na]at com.mongodb.internal.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:269) ~[mongodb-driver-core-3.9.0.jar:na]at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:131) ~[mongodb-driver-core-3.9.0.jar:na]at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:123) ~[mongodb-driver-core-3.9.0.jar:na]at com.mongodb.operation.QueryBatchCursor.getMore(QueryBatchCursor.java:222) ~[mongodb-driver-core-3.9.0.jar:na]at com.mongodb.operation.QueryBatchCursor.hasNext(QueryBatchCursor.java:115) ~[mongodb-driver-core-3.9.0.jar:na]at com.mongodb.client.internal.MongoBatchCursorAdapter.hasNext(MongoBatchCursorAdapter.java:54) ~[mongodb-driver-sync-3.9.0.jar:na]at com.alibaba.datax.plugin.reader.mongodbreader.MongoDBReader$Task.startRead(MongoDBReader.java:186) ~[mongodbreader-0.0.1-SNAPSHOT.jar:na]at com.alibaba.datax.core.taskgroup.runner.ReaderRunner.run(ReaderRunner.java:116) [datax-core-0.0.1-SNAPSHOT.jar:na]at java.lang.Thread.run(Thread.java:834) [na:1.8.0_112]
2023-03-15 21:25:42.376 [288235-0-0-reader] ERROR ReaderRunner - Reader runner Received Exceptions:
com.alibaba.datax.common.exception.DataXException: operation exceeded time limitat com.alibaba.datax.common.exception.DataXException.asDataXException(DataXException.java:30) ~[datax-common-0.0.1-SNAPSHOT.jar:na]at com.alibaba.datax.plugin.reader.mongodbreader.MongoDBReader$Task.startRead(MongoDBReader.java:364) ~[mongodbreader-0.0.1-SNAPSHOT.jar:na]at com.alibaba.datax.core.taskgroup.runner.ReaderRunner.run(ReaderRunner.java:116) ~[datax-core-0.0.1-SNAPSHOT.jar:na]at java.lang.Thread.run(Thread.java:834) [na:1.8.0_112]
Exception in thread "taskGroup-0" com.alibaba.datax.common.exception.DataXException: operation exceeded time limitat com.alibaba.datax.common.exception.DataXException.asDataXException(DataXException.java:30)at com.alibaba.datax.plugin.reader.mongodbreader.MongoDBReader$Task.startRead(MongoDBReader.java:364)at com.alibaba.datax.core.taskgroup.runner.ReaderRunner.run(ReaderRunner.java:116)at java.lang.Thread.run(Thread.java:834)
2023-03-15 21:25:49.519 [job-288235] INFO  MetricReportUtil - reportJobMetric is turn off
2023-03-15 21:25:49.519 [job-288235] INFO  LocalJobContainerCommunicator - Total 20456992 records, 93828811021 bytes | Speed 25.31MB/s, 7500 records/s | Error 0 records, 0 bytes |  All Task WaitWriterTime 171.858s |  All Task WaitReaderTime 4,009.398s | Percentage 0.00%
2023-03-15 21:25:49.525 [job-288235] ERROR JobContainer - 运行scheduler 模式[local]出错.
2023-03-15 21:25:49.526 [job-288235] ERROR JobContainer - Exception when job run
com.alibaba.datax.common.exception.DataXException: operation exceeded time limitat com.alibaba.datax.common.exception.DataXException.asDataXException(DataXException.java:30) ~[datax-common-0.0.1-SNAPSHOT.jar:na]at com.alibaba.datax.plugin.reader.mongodbreader.MongoDBReader$Task.startRead(MongoDBReader.java:364) ~[na:na]at com.alibaba.datax.core.taskgroup.runner.ReaderRunner.run(ReaderRunner.java:116) ~[datax-core-0.0.1-SNAPSHOT.jar:na]at java.lang.Thread.run(Thread.java:834) ~[na:1.8.0_112]
2023-03-15 21:25:49.534 [job-288235] INFO  MetricReportUtil - reportJobMetric is turn off
2023-03-15 21:25:49.534 [job-288235] INFO  LocalJobContainerCommunicator - Total 20456992 records, 93828811021 bytes | Speed 0B/s, 0 records/s | Error 0 records, 0 bytes |  All Task WaitWriterTime 171.858s |  All Task WaitReaderTime 4,009.398s | Percentage 0.00%
2023-03-15 21:25:49.534 [job-288235] INFO  JobContainer - jobContainer starts to do destroy ...
2023-03-15 21:25:49.534 [job-288235] INFO  JobContainer - DataX Writer.Job [odpswriter] do destroy work.
2023-03-15 21:25:49.534 [job-288235] INFO  JobContainer - DataX Reader.Job [mongodbreader] do destroy work.
2023-03-15 21:25:49.535 [job-288235] ERROR Engine - 
Through the intelligent analysis by DataX, the most likely error reason of this task is: 
com.alibaba.datax.common.exception.DataXException: operation exceeded time limitat com.alibaba.datax.common.exception.DataXException.asDataXException(DataXException.java:30)at com.alibaba.datax.plugin.reader.mongodbreader.MongoDBReader$Task.startRead(MongoDBReader.java:364)at com.alibaba.datax.core.taskgroup.runner.ReaderRunner.run(ReaderRunner.java:116)at java.lang.Thread.run(Thread.java:834)
2023-03-15 21:25:49 INFO =================================================================
2023-03-15 21:25:49 INFO Exit code of the Shell command 1
2023-03-15 21:25:49 INFO --- Invocation of Shell command completed ---
2023-03-15 21:25:49 ERROR Shell run failed!
2023-03-15 21:25:49 ERROR Current task status: ERROR
2023-03-15 21:25:49 INFO Cost time is: 4883.857s
/home/admin/alisatasknode/taskinfo//20230315/diide/20/04/21/uait7kghrsy0gg1w8qksa6ay/T3_0000910947.log-END-EOF
2023-03-15 21:25:55 : Detail log url: http://cdp.res.tkbjdmp.yun/outter/pipeline/basecommon_sys_default/job/288235/log?requestor=999999999
Return with failed!!
2023-03-15 21:25:55 [INFO] Sandbox context cleanup temp file success.
2023-03-15 21:25:55 [INFO] Data synchronization ended with return code: [1].
2023-03-15 21:25:55 INFO =================================================================
2023-03-15 21:25:55 INFO Exit code of the Shell command 1
2023-03-15 21:25:55 INFO --- Invocation of Shell command completed ---
2023-03-15 21:25:55 ERROR Shell run failed!
2023-03-15 21:25:55 ERROR Current task status: ERROR
2023-03-15 21:25:55 INFO Cost time is: 4894.629s
/home/admin/alisatasknode/taskinfo//20230315/phoenix/20/04/17/sqbh1leuhspi41gdw8bv6by4/T3_0000910946.log-END-EOF


查询文档,阿里云官网提供一下方案:


https://developer.aliyun.com/ask/473431

阿里云服务支持提供方案如下:

 1. 按现在这个报错operation exceeded time
    limit,建议用户将cursorTimeoutInMs调大到3600000。
 2. 目前这个任务已经跑了20亿数据了,用户应该是10亿多数据,可以再确认下数据量多少。
 3. batchSize可先保持1000不动,如果调整完cursorTimeoutInMs不报错,可再尝试调大batchSize。

实验解决:

我这边实施的1,已解决。

学习参数:

下面让我们了解下MongoDB Reader的一些参数:

参数说明
参数描述 
datasource数据源名称,脚本模式支持添加数据源,此配置项填写的内容必须要与添加的数据源名称保持一致。
collectionNameMonogoDB的集合名。
hint

MongoDB支持hint参数,使查询优化器使用特定索引来完成查询,在某些情况下,可以提高查询性能。详情请参见hint参数。示例如下:

{"collectionName": "test_collection","hint": "{ age: 1 }"
}
columnMongoDB的文档列名,配置为数组形式表示MongoDB的多个列。
name:column的名字。
type支持的类型包括:
string:表示字符串。
long:表示整型数。
double表示浮点数。
date表示日期。
bool表示布尔值。
bytes:表示二进制序列。
arrays:以JSON字符串格式读出,例如["a","b","c"]。
array:以分隔符splitter分隔的方式读出,例如a,b,c,推荐使用arrays格式。
combine使用MongoDB Reader插件读出数据时,支持合并MongoDB document中的多个字段为一个JSON串。
splitter:因为MongoDB支持数组类型,但数据集成框架本身不支持数组类型,所以MongoDB读出来的数组类型,需要通过该分隔符合并成字符串。
batchSize批量获取的记录数,该参数为选填参数。默认值为1000条。
cursorTimeoutInMs

游标超时时间,该参数为选填参数。默认值为1000 * 60 * 10 = 600000。如果cursorTimeoutInMs配置为负值,则表示游标永不超时。

说明

  • 不推荐您设置游标永不超时。如果客户端程序意外退出,永不超时的游标将一直存在于MongoDB服务器中,直到服务重启。
  • 如果出现游标超时,您可以执行如下操作:
    • 减小批量获取的记录数batchSize。
    • 增加游标超时时间cursorTimeoutInMs。
query您可以通过该配置型来限制返回MongoDB数据范围,仅支持以下时间格式,不支持直接使用时间戳类型的格式。

说明 query不支持JS语法。

常用query示例如下:
  • 查询状态为normal的数据
    "query":"{ status: "normal"}"
  • status: "normal"
    "query":"{ status: { $in: [ "normal", "forbidden" ] }}"
  • AND语法,状态为正常,且年龄小于30
    "query":"{ status: "normal", age: { $lt: 30 }}"
  • 日期语法,创建时间大于等于2022-12-01 00:00:00.000,+0800表示东八时区
    "query":"{ createTime:{$gte:ISODate('2022-12-01T00:00:00.000+0800')}}"
  • 日期语法,使用调度参数占位符,查询创建时间大于等于某个时间点
    "query":"{ createTime:{$gte:ISODate('$[yyyy-mm-dd]T00:00:00.000+0800')}}"

    说明 调度参数使用详情请参见:场景:调度参数在数据集成的典型应用场景,离线同步增量同步实现方式请参见:数据集成使用调度参数的相关说明。

  • 非时间类型增量字段同步。

    可以通过赋值节点将字段处理为目标数据类型后,再传入数据集成进行数据同步。例如,当MongoDB存储的增量字段为时间戳,您可以通过赋值节点将时间类型字段通过引擎函数转换为时间戳,再传给离线同步任务使用,关于赋值节点的使用详情请参见:赋值节点。

说明 更多MongoDB的查询语法请参见MongoDB官方文档。

splitFactor如果存在比较严重的数据倾斜,可以考虑增加splitFactor,实现更小粒度的切分,无需增加并发数。

更多内容请前往阿里云官方文档:

MongoDB Reader_大数据开发治理平台 DataWorks-阿里云帮助中心 

相关内容

热门资讯

1.57亿元!郑州官宣:这一补... 广大消费者、各有关汽车销售企业: 根据2025年郑州市消费品以旧换新工作安排,现统筹新增消费品以旧换...
马丁内利本场数据解析:错失良机... 在英超第16轮的较量中,阿森纳与狼队的对决以0-0平局收场,令人失望的结果让球迷们感到沮丧。尤其是阿...
力争2026年全国基本实现政策... 新华社北京12月13日电(记者彭韵佳)记者12月13日从全国医疗保障工作会议上获悉,为积极适应人口发...
江苏省人民代表大会常务委员会关... 江苏省人大常委会公告 第 47 号 《江苏省人民代表大会常务委员会关于修改〈江苏省学生体质健康促进条...
俄发动大规模空袭,摧毁多家乌军... 据新华社,根据俄罗斯国防部13日发布的战报,俄武装力量12日深夜至13日凌晨对乌克兰实施了密集火力打...
江苏省学生体质健康促进条例 目 录 第一章 总则 第二章 体育活动 第三章 卫生与营养 第四章 保障与监督 第五章 法律责任 第...
原创 越... 近年来,中美关系愈发紧张,尤其是在稀土资源的争夺上。越南作为东南亚的一颗新星,正试图借此机遇在全球稀...
关联公司混同用工的三个关键法律... 随着经济的发展,关联公司作为更具规模性和竞争性的现代企业组织型态在实践中广泛存在。关联公司是《公司法...
退休生活新指南!北京首个社管退... 12月11日,北京首个面向社会化管理退休人员的“乐活足迹”地图正式发布,标志着顺义区人力社保局在打造...
从“制度之异”到“制度之利”(... 本报记者 张 烁 贺林平 江 琳 图①:港珠澳大桥风光。 刘国兴摄(人民视觉) 图②:横琴粤澳深度...