我想运行多个Hive查询,最好是并行而不是顺序运行,并将每个查询的输出存储到一个csv文件中。例如,query1
中的csv1
输出,query2
中的csv2
输出,等等。我将在离开工作后运行这些查询,以期在运行期间进行输出分析。下一个工作日。我对使用bash shell脚本感兴趣,因为这样我就可以设置一个cron
任务来在一天的特定时间运行它。
我知道如何将HiveQL查询的结果存储在CSV文件中,一次存储一个查询。我这样做的方式如下:
hive -e
"SELECT * FROM db.table;"
" | tr "\t" "," > example.csv;
上述问题是我必须监视进程何时完成并手动启动下一个查询。我也知道如何依次运行多个查询,如下所示:
hive -f hivequeries.hql
有没有办法将这两种方法结合起来?有没有更聪明的方法可以实现我的目标?
首选代码答案,因为我不太了解bash以便从头开始编写。
这个问题是另一个问题的变体:How do I output the results of a HiveQL query to CSV?
答案 0 :(得分:1)
您可以在Shell脚本中运行和监视并行作业:
#!/bin/bash
#Run parallel processes and wait for their completion
#Add loop here or add more calls
hive -e "SELECT * FROM db.table1;" | tr "\t" "," > example1.csv &
hive -e "SELECT * FROM db.table2;" | tr "\t" "," > example2.csv &
hive -e "SELECT * FROM db.table3;" | tr "\t" "," > example3.csv &
#Note the ampersand in above commands says to create parallel process
#You can wrap hive call in a function an do some logging in it, etc
#And call a function as parallel process in the same way
#Modify this script to fit your needs
#Now wait for all processes to complete
#Failed processes count
FAILED=0
for job in `jobs -p`
do
echo "job=$job"
wait $job || let "FAILED+=1"
done
#Final status check
if [ "$FAILED" != "0" ]; then
echo "Execution FAILED! ($FAILED)"
#Do something here, log or send messege, etc
exit 1
fi
#Normal exit
#Do something else here
exit 0
还有其他方法(使用XARGS,GNU并行)在shell中运行并行进程,并在其上运行大量资源。另请阅读https://www.slashroot.in/how-run-multiple-commands-parallel-linux和https://thoughtsimproved.wordpress.com/2015/05/18/parellel-processing-in-bash/
答案 1 :(得分:0)
使用GNU Parallel,它看起来像这样:
doit() {
id="$1"
hive -e "SELECT * FROM db.table$id;" | tr "\t" "," > example"$id".csv
}
export -f doit
parallel --bar doit ::: 1 2 3 4
如果您的查询不共享同一模板,则可以执行以下操作:
queries.txt:
SELECT * FROM db.table1;
SELECT id,name FROM db.person;
... other queries ...
cat queries.txt | parallel --bar 'hive -e {} | tr "\t" "," > example{#}.csv'
花15分钟阅读https://doi.org/10.5281/zenodo.1146014的第1 + 2章,以学习基础知识,并花费第7章,以了解有关如何并行运行更多作业的更多信息。