使配置单元中的查询并行运行

bqujaahr  于 2021-06-04  发布在  Hadoop
关注(0)|答案(6)|浏览(414)

我用Hive有一段时间了,但是,从来没有想过这个。我正在尝试使hive-fsql文件中的查询并行运行?有人知道怎么做吗?谢谢

igetnqfo

igetnqfo1#

hive将把hiveql查询转换成mapreduce作业,mapreduce作业可以根据集群的大小和配置的调度器类型并行运行。因此,配置单元查询将自动在hadoop集群上并行运行。

dwthyt8l

dwthyt8l2#

对配置单元上的任何查询进行编译以Mapreduce并在hadoop上运行。MapReduce是一个并行处理框架,因此每个配置单元查询都将并行运行和处理数据。
我问了同样的问题,但方式不同。更多详情请参见此处。

wfveoks0

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) &

jvlzgdj9

jvlzgdj94#

毫无疑问,并行执行配置单元查询是一种很好的方法,但是我们如何确保querys\u file.sql中的所有查询都能正确执行。
在我用来确保

hive -f queries_file.sql
if [ "$?" -ne 0 ] 
        then 
        echo "Failed!!"
        GOTO ERROR:
fi

如果要在以后执行某些操作,成功执行是非常重要的。
例如:--merge\u calculated\u 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;"

输出
查询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

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
nwwlzxa7

nwwlzxa75#

这是我选择做的,因为我找不到一个方法来做它从Hive本身。只需将文件名/数据库替换为您案例中的文件名/数据库。


# 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个查询。

e5nszbig

e5nszbig6#

配置单元查询计划器应该能够在特定情况下并行处理事情。但您需要设置配置选项:

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
如果您想并行运行完全独立的查询,最好的选择可能是按照其他建议将其作为单独的作业从单独的文件中运行。

相关问题