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

如何无需读写文件实现该Bash脚本的DistCp任务信息采集入库?

问题描述

我编写了一段Bash脚本,内容如下:

#!/usr/bin/env bash

time_event="`date +%Y-%m-%d' '%H:%M:%S`"
current_day="`date +%Y%m%d`"
event="start_job"

src='hdfs://table1/'
dst='hdfs://table2/'

hadoop distcp -bandwidth 256 -m 50 -delete -update -strategy dynamic $src $dst &> log.txt

status=($?)

link=$(grep -oP "The url to track the job: \K[^']+" log.txt)
job=$(grep -oP "Submitting tokens for job: \K[^']+" log.txt)

hive -e "insert into table <table> partition (day) select '$src' as source_path, '$dst' as target_path, '$time_event' as time_event, '$event' as event, '$status' as status, '$link' as url_job, '$job' as url_pipeline, $current_day as day;"

当前脚本通过写入并读取log.txt文件获取DistCp任务相关信息后写入Hive表,请问如何修改脚本,无需读写文件即可实现相同功能?


修改后的脚本
#!/usr/bin/env bash

time_event="$(date +%Y-%m-%d' '%H:%M:%S)"
current_day="$(date +%Y%m%d)"
event="start_job"

src='hdfs://table1/'
dst='hdfs://table2/'

# 直接捕获distcp的所有输出到变量,同时保留退出状态
distcp_output=$(hadoop distcp -bandwidth 256 -m 50 -delete -update -strategy dynamic "$src" "$dst" 2>&1)
status=$?

# 从内存变量中提取所需信息,无需读写文件
link=$(grep -oP "The url to track the job: \K[^']+" <<< "$distcp_output")
job=$(grep -oP "Submitting tokens for job: \K[^']+" <<< "$distcp_output")

hive -e "insert into table <table> partition (day) select '$src' as source_path, '$dst' as target_path, '$time_event' as time_event, '$event' as event, '$status' as status, '$link' as url_job, '$job' as url_pipeline, $current_day as day;"
关键改动说明
  • 用distcp_output=$(hadoop distcp ... 2>&1)直接把distcp的标准输出和错误输出捕获到内存变量中,替代写入文件的操作;
  • 通过<<< "$distcp_output"将变量内容作为grep的输入,直接从内存提取信息,无需读取磁盘文件;
  • 把原脚本的反引号命令替换写法`改为$(),这是Bash更推荐的写法,可读性更强且避免嵌套解析问题;
  • 给$src和$dst添加双引号,避免路径含特殊字符时出现解析错误;
  • 修正status=($?)为status=$?,原写法会将单个退出状态值拆分为数组,这里直接获取数值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:43:30