Sqoop执行HDFS到Oracle导出任务map进度100%后失败
排查步骤
第一步:拉取Map任务详细日志
你当前看到的仅为作业层面的笼统报错,没有具体失败原因,首先需要获取失败Map任务的完整运行日志:
- 执行命令
yarn logs -applicationId application_1635324128846_0049拉取整个作业的全量日志,重点查找Map阶段抛出的具体异常,通常会直接提示是字段不匹配、主键冲突、连接权限不足、编码错误等具体原因。
第二步:排查高频触发问题
结合你提供的场景,以下是最容易出现的问题点,可以逐一验证:
1. 导出路径配置问题
你当前的--export-dir参数直接指向了具体文件/user/hadoop/OPORTUNIDADES/000000_0,而sqoop export默认是读取指定目录下的所有数据文件,先确认:
- 执行命令
hdfs dfs -ls /user/hadoop/OPORTUNIDADES/000000_0确认文件存在,且运行sqoop的账号有该文件的可读权限 - 尝试将
--export-dir参数修改为指向目录/user/hadoop/OPORTUNIDADES/,sqoop会自动扫描目录下所有符合规则的数据文件。
2. 数据格式不匹配
即使你指定了制表符作为分隔符,也需要确认实际存储的文件格式是否符合预期:
- 拉取小部分文件到本地验证:
hdfs dfs -get /user/hadoop/OPORTUNIDADES/000000_0 /tmp/test.txt,执行cat -A /tmp/test.txt查看分隔符是否确实为\t(显示为^I),检查是否存在行内换行、多分隔符、特殊字符导致字段解析错位的情况 - 如果Hive表使用
\N作为NULL值的存储标识,需要在sqoop命令中补充参数--input-null-string '\\N' --input-null-non-string '\\N',避免NULL值解析错误。
3. Oracle侧配置问题
- 确认你使用的Oracle账号对
OPORTUNIDADESHIVE表有INSERT权限,目标表没有被锁、表空间容量充足 - 确认两边字段的顺序、类型完全一致:Oracle表的字段顺序、数字精度、字符串长度、日期格式要和Hive表完全匹配,如果存在日期类型,可以临时加参数
--map-column-java 日期字段名=java.sql.String将日期转成字符串导入排查问题 - 检查是否存在主键/唯一键冲突:如果Oracle表设置了主键约束,HDFS数据中有重复主键值会直接导致导入失败。
4. 驱动兼容性问题
确认sqoop的lib目录下已经放置了和Oracle服务端版本匹配的ojdbc驱动包,驱动版本不兼容会抛出未捕获异常直接导致任务失败。
缩小问题范围的验证命令
可以添加--verbose参数输出调试日志,指定单Map任务运行,更容易定位问题:
sqoop export --verbose \ --connect jdbc:oracle:thin:@ip:port/db \ --username user -P \ --table OPORTUNIDADESHIVE \ --export-dir /user/hadoop/OPORTUNIDADES/ \ --input-fields-terminated-by "\t" \ --m 1 \ --input-null-string '\\N' \ --input-null-non-string '\\N'
内容的提问来源于stack exchange,提问作者user826500
相关产品推荐
相关产品推荐

