Sqoop使用-Dmapreduce.output.basename追加数据时文件未写入HDFS
问题排查:Sqoop Append模式下自定义文件名前缀导致文件被忽略
我碰到过类似的问题,在Sqoop 1.4.6-cdh5.12.0版本中,当你结合--append参数和-Dmapreduce.output.basename自定义输出文件名前缀时,就会出现临时文件被AppendUtils忽略的情况,本质是Sqoop的Append工具类的文件名匹配逻辑没有适配自定义前缀的场景。
问题根源分析
从你提供的日志可以看到,AppendUtils在处理文件移动时,直接忽略了12345_-m-00000、12345_-m-00001这些文件,原因是:
- Sqoop 1.4.6-cdh5.12.0的
AppendUtils类中,默认只匹配以part-开头的文件(正则规则大致为part-(m|r)-\\d+) - 当你通过
mapreduce.output.basename自定义前缀后,生成的文件名格式变成了[自定义前缀]-m-xxxx,完全不符合AppendUtils的匹配规则,所以这些文件被判定为“非导入数据文件”而被直接忽略,随后临时目录被删除,导致数据没有被移动到目标目录。
哪怕是首次运行目标目录为空,AppendUtils依然会执行这个筛选逻辑,所以同样会出现数据丢失的情况。
可行的解决方案
方案1:绕过AppendUtils,手动处理临时文件
放弃使用--append参数,改为先将数据导入临时目录,再手动将自定义前缀的文件移动到目标目录,具体步骤如下:
- 执行Sqoop导入到临时目录:
sqoop-import -Dmapreduce.output.basename="12345_" --connect "jdbc:sap://xx.xx.xx.xx:30215" --username "EDHQUERY" -password xxxxxxxxxx --driver "com.sap.db.jdbc.Driver" --query "SELECT PLANT FROM SAPBWT.PLANT where \$CONDITIONS" --split-by "PLANT" --target-dir "/tmp/SRITEST/temp_HANA_Extract_Plant/" --as-textfile --fields-terminated-by "|" --num-mappers "2" --verbose
- 将临时目录中的自定义前缀数据文件移动到目标目录:
hadoop fs -mv /tmp/SRITEST/temp_HANA_Extract_Plant/12345_-m-* /tmp/SRITEST/HANA_Extract_Plant/
- (可选)如果需要保留
_SUCCESS文件,也可以一起移动:
hadoop fs -mv /tmp/SRITEST/temp_HANA_Extract_Plant/_SUCCESS /tmp/SRITEST/HANA_Extract_Plant/
- 删除临时目录:
hadoop fs -rm -r /tmp/SRITEST/temp_HANA_Extract_Plant/
方案2:升级Sqoop版本
这个问题在Sqoop的后续版本(比如1.4.7及以上)中已经被修复,AppendUtils会适配自定义的mapreduce.output.basename前缀来匹配文件。如果你的集群允许升级,可以考虑升级到更高版本的Sqoop,这样就能正常使用--append+自定义前缀的组合。
方案3:避免自定义文件名前缀(临时妥协)
如果暂时无法升级或手动处理,可以放弃自定义前缀,使用Sqoop默认的part-m-xxxx文件名格式,这样--append参数就能正常工作,数据会被正确追加到目标目录。
内容的提问来源于stack exchange,提问作者srikanth ramesh
相关产品推荐
相关产品推荐

