繁体   English   中英

Hive查询在Hive客户端和JDBC中的执行方式不同

[英]Hive query executing differently in Hive client and JDBC

我通过Hive客户端,Java程序JDBC和beeline执行以下查询。

SELECT
*
FROM
    TABLE_ONE AS t1
    JOIN TABLE_TWO t2 ON t2.p_id = t1.p_id 
        AND t2.p_n_id = t1.p_n_id 
        AND t2.d_id = t1.d_id
    JOIN TABLE_THREE t3 ON t3.d_m_id = t1.d_m_id
        AND t3.d_p_id = t1.d_p_id
    JOIN TABLE_FOUR t4 ON t4.c_id = t1.c_id
    JOIN TABLE_FIVE t5 ON t5.a_n_id = t1.a_n_id
    JOIN TABLE_SIX t6 ON t6.d_p_p_s_id = t1.d_p_p_s_id
        AND t6.a_v_id = t1.a_v_id
        AND t6.p_f_id = t1.p_f_id

通过Hive cilent执行时,它已在21秒内完成,而Java程序JDBC和beeline分别花费了110秒和200秒。

这是我如何在JDBC中获得Hive Connection

DriverManager.getConnection("jdbc:hive2://<ip address of hive gateway server>:10000/default?zeroDateTimeBehavior=round").
  • Hive客户端仅用一个映射器即可完成。
  • Java JDBC和beeline执行了5 MR作业。 每个MR工作需要2个映射器和1个减速器。

这是每个表的行数。

  • TABLE_ONE有44981条记录。
  • TABLE_TWO有2173条记录。
  • TABLE_THREE有1415条记录。
  • TABLE_FOUR有249条记录。
  • TABLE_FIVE有168条记录。
  • TABLE_SIX有255条记录。
  • OUTPUT有33362条记录。

我想要Hive客户端在JDBC中的性能。 有什么建议吗?

Hive版本为0.13.1(Cloudera 5.3.3)

一些建议可以帮助您调试:

从beeline客户端和通过JDBC运行时设置的属性。

我怀疑属性hive.auto.convert.join导致了此行为。

基本上,从beeline可以读取每个映射器内存中的所有较小表(2到6)并将其用于联接。 但是在第二种情况下,它执行Mapper读取每个输入。

尝试将hive.auto.convert.join设置为true。 您可能还需要尝试: hive.auto.convert.join.noconditionaltaskhive.auto.convert.join.noconditionaltask.size

HTH。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM