如何在Sqoop导入DB到S3的命令中获取已处理记录数?
解决Sqoop导入时同步获取处理记录数的方案
嘿,刚好能帮到你!既然你不想用额外的eval之类的命令(避免源库新增数据导致统计不准),那我们可以直接从Sqoop本身的执行日志里提取那行记录数信息,而且完全和导入命令同步执行,不会有数据不一致的问题。
具体实现命令
你可以把原Sqoop命令和shell管道结合,这样既能完成数据导入,又能捕获并保存处理的记录数:
sqoop import -D mapreduce.job.name=xxx -D mapred.job.queue.name=user -Dhadoop.security.credential.provider.path=<path> -Dfs.s3a.server-side-encryption-algorithm=<xx> --options-file <path> --query "select col1,ID,UPDATETIME from db.table where UPDATETIME between to_date('2015-09-11 00:00:00','yyyy/mm/dd hh24:mi:ss') and to_date('2018-05-24 04:28:16','yyyy/mm/dd hh24:mi:ss') and \$CONDITIONS" --hive-delims-replacement ' ' --direct --m 1 --split-by ID --target-dir <s3://path> 2>&1 | tee sqoop_import.log | grep "Retrieved [0-9]* records" | awk '{print $4}' > processed_records_count.txt
命令各部分说明
2>&1:Sqoop的日志默认输出到标准错误流(stderr),这一步把stderr重定向到标准输出流(stdout),让我们能捕获到所有日志内容tee sqoop_import.log:同时把完整的Sqoop执行日志保存到文件,方便后续排查问题,也不会影响你在终端查看实时输出grep "Retrieved [0-9]* records":精准过滤出包含处理记录数的那行日志awk '{print $4}':从过滤后的行里提取出数字部分,保存到processed_records_count.txt文件中
可选优化
如果你不想保存完整日志,或者想在终端直接看到记录数提示,可以用这个版本:
sqoop import [你的所有导入参数] 2>&1 | tee >(grep "Retrieved [0-9]* records" | awk '{print "✅ 本次导入处理记录数: " $4}' | tee -a processed_records_count.txt)
这个命令会:
- 正常在终端显示所有Sqoop日志
- 额外输出一行带提示的记录数信息
- 把记录数同时保存到文件里
注意事项
- 确保Sqoop的日志级别是默认的
INFO:如果之前修改过日志配置把级别调到WARN或更高,那ImportJobBase的这条记录数日志就不会输出了,得改回INFO级别 - 因为你指定了
--m 1(单Map任务),所以日志里只会有一条Retrieved X records的记录;如果是多Map任务,你可能需要用grep汇总所有Map任务的记录数,不过你的场景下刚好不用考虑这个~
内容的提问来源于stack exchange,提问作者LUZO
相关产品推荐
相关产品推荐

