我使用蜂巢有一段时间了,但是,从来没有想过这个。我正在尝试使 hive -f sql-file 中的查询并行运行?有人知道该怎么做吗?谢谢
6 回答
@user1653240 为了同时运行独立查询,我正在做的是:
- 将查询放入不同的文件,例如
select count(1) from t1
-> file1.sql,select count(1) from t2
-> file2.sql - 使用nohup和&命令。以 file1.sql 和 file2.sql 为例,运行:
nohup hive -f file1.sql & nohup hive -f file2.sql
,这两个查询会并行运行。 - 如果你想在后台运行,只需在最后添加一个&即可。例如:
(nohup hive -f file1.sql & nohup hive -f file2.sql) &
Hive 会将 HiveQL 查询转换为 MapReduce 作业,并且 MapReduce 作业可以根据集群的大小和配置的调度程序类型并行运行。因此,Hive 查询将自动在 Hadoop 集群上并行运行。
Hive 上的任何查询都被编译为 Map-Reduce 并在 Hadoop 上运行。Map-reduce 是一个并行处理框架,因此您的每个 Hive 查询都将并行运行和处理数据。
我问了同样的问题,但方式不同。有关更多详细信息,您可以参考此处。
毫无疑问,并行执行 hive 查询的绝佳方法,但我们如何确保 query_file.sql 中的所有查询执行时没有任何错误。
在我用来确保的序列模式中
hive -f queries_file.sql
if [ "$?" -ne 0 ]
then
echo "Failed!!"
GOTO ERROR:
fi
如果您想在之后执行某些操作,成功执行非常重要。
例如: -- Merge_Calculated_KPI.SQL(包含一个依赖于上述内容的单个查询。)
hive -e "Drop table SANDBOX.status; Create table SANDBOX.status as Select 10 as Query1 ,FROM_UNIXTIME(UNIX_TIMESTAMP()) AS UPDATE_TS FROM Metadata.DUMMY;"
sh exec_parralel.sh
hive -e "USE SANDBOX; INSERT INTO table SANDBOX.status Select 50 as Query1 ,FROM_UNIXTIME(UNIX_TIMESTAMP()) AS UPDATE_TS FROM Metadata.DUMMY;"
输出
query1 update_ts - 0 10 2020-04-27 14:44:33 - 1 20 2020-04-27 14:45:04 - 4 30 2020-04-27 14:48:06 - 2 40 2020-04-27 14 :46:06 - 3 50 2020-04-27 14:47:06
请注意,最后一条语句 50 很早就执行了。应该是 10, 20,30,40 50
参考 exec_parralel.sh
queries=`cat /Hadoop_SAN/TU_Prod/TMP/queries_file.sql`
count=0
while true; do
((count++))
query=`echo ${queries} | cut -d';' -f${count}`
if [ -z "${query}" ]; then
echo "Completed executing." $count
exit
fi
echo "${query}"
hive --database "Default" -e "${query};" &
done
exit 0
这是我选择做的,因为我找不到从蜂巢本身做的方法。只需用您的情况替换文件名/数据库即可。
# This file should have all the queries separated with semicolon ';'
queries=`cat queries_file.sql`
count=0
while true; do
((count++))
query=`echo ${queries} | cut -d';' -f${count}`
if [ -z "${query}" ]; then
echo "Completed executing ${count} - 1 queries."
exit
fi
echo "${query}"
hive --database "your_db" -e "${query};" &
# This is optional. If you want to give some gap, say after every 5
# concurrent queries, use this. Or remove next 4 lines.
mod=`expr ${count} % 5`
if [ ${mod} -eq 0 ]; then
sleep 30
fi
done
编辑:
相当老的线程,但仍然想为其他人更新更好的解决方案。xargs
可以用来代替我粘贴的自定义代码来实现这一点。假设文件中的所有查询都以分号结尾,可以使用以下 xargs 命令:
cat queries.hql | sed 's/;$//g' | xargs -d';' -n1 -I{} -P20 -r bash -c "hive --database ${your_db} -e '{}'"
where-P20
声明要并行运行 20 个查询。
Hive 查询计划器应该能够在特定情况下并行处理。您需要设置配置选项:
hive.exec.parallel
Default Value: false
Added In: Hive 0.5.0
Whether to execute jobs in parallel. Applies to MapReduce jobs that can run in parallel, for example jobs processing different source tables before a join. As of Hive 0.14, also applies to move tasks that can run in parallel, for example moving files to insert targets during multi-insert.
取自https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
如果您想并行运行完全独立的查询,最好的选择是按照其他建议将其作为来自单独文件的单独作业运行。