You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sqoop从Oracle导入任务停滞0.0%后报ORA-01555问题求助

问题分析:Sqoop 1.4.7-cdh6.3.1 从Oracle导数据偶发进度0%+ORA-01555

现象回顾

使用Sqoop 1.4.7-cdh6.3.1从Oracle导入数据时,偶发出现以下情况:

  • Yarn日志长期显示单个TaskAttempt进度为0.0%
  • 停滞近1小时后报错:ORA-01555: snapshot too old
  • 问题非必现

相关Yarn日志片段

2022-05-10 04:52:13,351 INFO [IPC Server handler 12 on 44827] org.apache.hadoop.mapred.TaskAttemptListenerImpl: Progress of TaskAttempt attempt_1646802944907_44646_m_000000_0 is : 0.0
2022-05-10 04:52:43,421 INFO [IPC Server handler 20 on 44827] org.apache.hadoop.mapred.TaskAttemptListenerImpl: Progress of TaskAttempt attempt_1646802944907_44646_m_000000_0 is : 0.0
2022-05-10 04:53:13,487 INFO [IPC Server handler 18 on 44827] org.apache.hadoop.mapred.TaskAttemptListenerImpl: Progress of TaskAttempt attempt_1646802944907_44646_m_000000_0 is : 0.0
2022-05-10 04:53:43,556 INFO [IPC Server handler 22 on 44827] org.apache.hadoop.mapred.TaskAttemptListenerImpl: Progress of TaskAttempt attempt_1646802944907_44646_m_000000_0 is : 0.0
....

核心原因分析

1. 进度0%的本质

Sqoop的Map任务进度上报是基于已读取并输出的记录数,如果任务处于以下阶段,会长期显示0%:

  • Oracle正在构建一致性快照(Sqoop默认会请求一致性读取,保证数据完整性)
  • 全表扫描/大分片数据的初始扫描阶段(Oracle还未开始返回数据给Sqoop)
  • 任务因资源不足、网络延迟等原因,数据读取完全停滞

2. ORA-01555的触发逻辑

这个错误是Oracle的经典快照过期错误,核心是:
Sqoop任务持有Oracle的一致性快照期间,Oracle的undo表空间中对应快照的旧数据被覆盖/清理,导致Oracle无法再提供快照对应的一致性数据。而停滞1小时刚好超过了Oracle的undo保留时间(默认一般是900秒,即15分钟,部分环境会调整,但1小时大概率超过配置值)。

3. 偶发的关键因素

问题非必现,说明是环境波动触发的边缘场景,常见触发点:

  • Yarn资源竞争:偶发时段集群CPU/内存不足,Map任务分配到的资源不足以支撑数据读取,导致任务停滞,拉长快照持有时间
  • Oracle端负载波动:高峰期Oracle有大量DML操作,undo表空间被快速覆盖,或者undo retention设置的时间不足以覆盖任务停滞时长
  • Sqoop分片不合理:偶发出现单个Map任务分配到超大分片(比如分片键分布不均),导致该任务需要长时间读取数据,持有快照时间过长
  • 网络波动:偶发的跨机房/跨节点网络延迟,导致Sqoop与Oracle之间的数据传输速度骤降,拉长任务执行时间

排查与解决方向

  • 检查Yarn资源:查看任务失败时段的Yarn集群资源使用率,确认是否有CPU/内存瓶颈,必要时调整任务的资源配额(--mapreduce-map-memory-mb等参数)
  • 检查Oracle配置:
    • 执行SELECT * FROM DBA_UNDO_EXTENTS;查看undo表空间的使用情况,确认是否有空间不足或频繁覆盖的情况
    • 执行SHOW PARAMETER UNDO_RETENTION;查看undo保留时间,若远小于1小时,可适当调大(需结合undo表空间大小)
  • 优化Sqoop分片策略:
    • 用--split-by选择分布均匀的字段作为分片键(比如主键、自增ID)
    • 调整--num-mappers增加并行度,避免单个任务处理过大分片
  • 调整Sqoop连接参数:
    • 通过--connection-param-file指定Oracle的READ ONLY隔离级别,减少undo数据的生成
    • 若业务允许,关闭一致性读取(不推荐,可能导致数据不一致)
  • 排查Oracle慢查询:查看Oracle的AWR报告,确认Sqoop执行的查询是否有全表扫描等慢操作,必要时给表加合适的索引

内容的提问来源于stack exchange,提问作者user19564902

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:24:37