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;"
# 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
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.
6条答案
按热度按时间igetnqfo1#
hive将把hiveql查询转换成mapreduce作业,mapreduce作业可以根据集群的大小和配置的调度器类型并行运行。因此,配置单元查询将自动在hadoop集群上并行运行。
dwthyt8l2#
对配置单元上的任何查询进行编译以Mapreduce并在hadoop上运行。MapReduce是一个并行处理框架,因此每个配置单元查询都将并行运行和处理数据。
我问了同样的问题,但方式不同。更多详情请参见此处。
wfveoks03#
@user1653240为了同时运行独立查询,我要做的是:
将查询放入不同的文件,例如,
select count(1) from t1
->文件1.sql,select count(1) from t2
->文件2.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) &
jvlzgdj94#
毫无疑问,并行执行配置单元查询是一种很好的方法,但是我们如何确保querys\u file.sql中的所有查询都能正确执行。
在我用来确保
如果要在以后执行某些操作,成功执行是非常重要的。
例如:--merge\u calculated\u kpi.sql(包含一个依赖于上述内容的查询)
输出
查询1更新\u 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\u parralel.sh
nwwlzxa75#
这是我选择做的,因为我找不到一个方法来做它从Hive本身。只需将文件名/数据库替换为您案例中的文件名/数据库。
编辑:
相当旧的线程,但仍在为其他人更新更好的解决方案的想法。
xargs
可以用来实现这一点,而不是自定义代码我粘贴。假设文件中的所有查询都以分号结尾,则可以使用以下xargs命令:cat queries.hql | sed 's/;$//g' | xargs -d';' -n1 -I{} -P20 -r bash -c "hive --database ${your_db} -e '{}'"
哪里-P20
声明将并行运行20个查询。e5nszbig6#
配置单元查询计划器应该能够在特定情况下并行处理事情。但您需要设置配置选项:
取自https://cwiki.apache.org/confluence/display/hive/configuration+properties
如果您想并行运行完全独立的查询,最好的选择可能是按照其他建议将其作为单独的作业从单独的文件中运行。