在hive中进行查询并行运行

时间:2013-02-11 19:06:12

标签: hadoop hive

我使用蜂巢已经有一段时间了,但是,从来没有想过这个。我试图在hive -f sql-file中并行运行查询?有谁知道怎么做?感谢

6 个答案:

答案 0 :(得分:3)

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

答案 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