我使用蜂巢已经有一段时间了,但是,从来没有想过这个。我试图在hive -f sql-file中并行运行查询?有谁知道怎么做?感谢
答案 0 :(得分:3)
@ user1653240为了同时运行独立查询,我正在做的是:
select count(1) from
t1
- > file1.sql,select count(1) from t2
- > file2.sql nohup hive -f file1.sql & nohup hive -f file2.sql
,这将
并行运行这两个查询。(nohup hive -f file1.sql & nohup hive -f file2.sql) &
答案 1 :(得分:0)
Hive会将HiveQL查询转换为MapReduce作业,MapReduce作业可以根据群集的大小和配置的调度程序类型并行运行。因此,Hive查询将自动在Hadoop集群上并行运行。
答案 2 :(得分:0)
任何关于Hive的查询都会被编译为Map-Reduce并在Hadoop上运行。 Map-reduce是一个并行处理框架,因此每个Hive查询都将并行运行和处理数据。
我问的同样的问题,但是以某种不同的方式。有关详细信息,请参阅here。
答案 3 :(得分:0)
Hive查询规划器应该能够在特定情况下并行化。您需要设置配置选项:
Mat.setRoi()
取自https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
如果您想并行运行完全独立的查询,则可能是将其作为单独文件中的单独作业运行的最佳选择。
答案 4 :(得分: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 '{}'"
其中-P20
表示要并行运行20个查询。
答案 5 :(得分:0)
毫无疑问,在其中执行配置单元查询的绝佳方法 并行,但是我们如何确保querys_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