1

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

4

6 回答 6

4

@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) &
于 2016-01-18T20:54:47.907 回答
0

Hive 会将 HiveQL 查询转换为 MapReduce 作业,并且 MapReduce 作业可以根据集群的大小和配置的调度程序类型并行运行。因此,Hive 查询将自动在 Hadoop 集群上并行运行。

于 2013-02-12T06:22:55.057 回答
0

Hive 上的任何查询都被编译为 Map-Reduce 并在 Hadoop 上运行。Map-reduce 是一个并行处理框架,因此您的每个 Hive 查询都将并行运行和处理数据。

我问了同样的问题,但方式不同。有关更多详细信息,您可以参考此处

于 2013-02-12T09:35:45.700 回答
0

毫无疑问,并行执行 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
于 2020-04-27T12:17:21.330 回答
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 个查询。

于 2016-07-28T13:24:26.530 回答
0

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

如果您想并行运行完全独立的查询,最好的选择是按照其他建议将其作为来自单独文件的单独作业运行。

于 2016-01-19T15:44:01.003 回答