本次需求:想将一个集群上的 csv 文件 load 到另一个集群的 Hive 表中,由于两个集群的网络不通,所以利用华为云存储对象 OBS 作为中间栈,从而实现。
服务器A上 /home/test/ 目录下找到测试文件进行压缩,实际生产中不排除单个文件很大,导致上传至存储对象速度慢,所以压缩后效率更高。
zip -r /home/test/20231127/test_20231127.zip test_20231127.csv
上传压缩文件到 obs,这里我们已经安装了obsutil-Liunx工具,如果没有安装的话要安装。
安装地址:https://support.huaweicloud.com/utiltg-obs/obs_11_0003.html
/opt/obsutil/obsutil cp /home/test/20231127/test_20231127.zip obs://obs-tes/model_test/
实际生产中可以定时进行压缩上传。
obs://obs-test/model_test/test_20231127.zip cp /data/test/
unzip -d /data/test/ /data/test/test_20231127.zip
拉下来后最好在脚本中自动进行判断文件是否存在,如果有异常的情况可以帮助我们尽快发现异常。
if [ -f /data/cdp/test_20231127.csv ]; then
echo "该文件存在"
else
echo "该文件不存在"
fi
完整脚本如下:
/opt/obsutil/obsutil config -i=****************** -k=**************************** -e=huaweiyun.cloud.com
echo 123 | kinit hive
sh /opt/obsutil/config.sh
/opt/obsutil/obsutil cp obs://obs-test/model_test/test_20231127.zip /data/test/test_20231127.zip
if [ -e /data/test/test_20231127.zip ]; then
echo "文件下载完成"
unzip -o -d /data/test/ /data/test/test_20231127.zip
echo "解压缩完成"
hdfs dfs -put -f /data/test/test_20231127.csv /tmp/test
echo "上传hdfs完成"
hive -e "load data inpath '/tmp/test/test_20231127.csv' overwrite into table test.test_table"
echo "load完成"
else
echo "该文件不存在"
break
fi