Hive 查询在 Hive 客户端和 JDBC 中的执行方式不同
Hive query executing differently in Hive client and JDBC
我通过 Hive 客户端、Java 程序 JDBC 和直线执行的以下查询。
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 和直线分别花费了大约 110 秒和 200 秒。
这是我在 JDBC
中获得 Hive Connection 的方式
DriverManager.getConnection("jdbc:hive2://<ip address of hive gateway server>:10000/default?zeroDateTimeBehavior=round").
- Hive 客户端仅用一个映射器就完成了它。
- Java JDBC 直线执行了 5 个 MR 作业。每个 MR 作业需要 2 个映射器和 1 个减速器。
这是每个 table 的行数。
- TABLE_ONE 有 44981 条记录。
- TABLE_TWO 有 2173 条记录。
- TABLE_THREE 有 1415 条记录。
- TABLE_FOUR 有 249 条记录。
- TABLE_FIVE 有 168 条记录。
- TABLE_SIX 有 255 条记录。
- OUTPUT 有 33362 条记录。
我想要 JDBC 中的 Hive 客户端性能。有什么建议吗?
Hive 版本为 0.13.1 (Cloudera 5.3.3)
一些可以帮助您调试的建议:
当 运行 来自直线客户端并通过 JDBC 时设置的属性。
我怀疑 属性 hive.auto.convert.join
导致了这种行为。
基本上从直线开始,它能够读取每个映射器内存中的所有较小的表(2 到 6 个),并将其用于连接。但在第二种情况下,它执行一个 Mapper 来读取每个输入。
尝试将 hive.auto.convert.join
设置为 true。您可能还需要玩弄:hive.auto.convert.join.noconditionaltask
& hive.auto.convert.join.noconditionaltask.size
.
HTH.
我通过 Hive 客户端、Java 程序 JDBC 和直线执行的以下查询。
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 和直线分别花费了大约 110 秒和 200 秒。
这是我在 JDBC
中获得 Hive Connection 的方式DriverManager.getConnection("jdbc:hive2://<ip address of hive gateway server>:10000/default?zeroDateTimeBehavior=round").
- Hive 客户端仅用一个映射器就完成了它。
- Java JDBC 直线执行了 5 个 MR 作业。每个 MR 作业需要 2 个映射器和 1 个减速器。
这是每个 table 的行数。
- TABLE_ONE 有 44981 条记录。
- TABLE_TWO 有 2173 条记录。
- TABLE_THREE 有 1415 条记录。
- TABLE_FOUR 有 249 条记录。
- TABLE_FIVE 有 168 条记录。
- TABLE_SIX 有 255 条记录。
- OUTPUT 有 33362 条记录。
我想要 JDBC 中的 Hive 客户端性能。有什么建议吗?
Hive 版本为 0.13.1 (Cloudera 5.3.3)
一些可以帮助您调试的建议:
当 运行 来自直线客户端并通过 JDBC 时设置的属性。
我怀疑 属性 hive.auto.convert.join
导致了这种行为。
基本上从直线开始,它能够读取每个映射器内存中的所有较小的表(2 到 6 个),并将其用于连接。但在第二种情况下,它执行一个 Mapper 来读取每个输入。
尝试将 hive.auto.convert.join
设置为 true。您可能还需要玩弄:hive.auto.convert.join.noconditionaltask
& hive.auto.convert.join.noconditionaltask.size
.
HTH.