为什么蜂巢加入时间太长?

Why is hive join taking too long?

我是 运行 基本上是这样的代码:

Create table abc as 
select A.* from
table1 A
Left outer join
table2 B 
on 
A.col1=B.col1 and  A.col2=B.col2;

表1的记录数=7009102 table2的记录数=1787493

我的脚本中有类似的 6 个查询,但我的脚本卡在了第 4 个这样的查询上。我通过 tez 和 mapreduce 尝试 运行 但两者都有同样的问题。

在 mapreduce 中它停留在 map 0% 并且即使在一小时后 reduce 0%。没有减速机 在Tez,1小时才22%

检查日志后,它显示了许多条目,例如 'progress of TaskAttempt attempt_12334_m_000003_0 is: 0.0'。

我 运行 在 tez 的工作,现在已经快 3 个小时了,工作即将完成,但 Map-2 Vertice 中有 2 个失败。

Hive 使用 MapReduce,这是它速度慢的主要原因,但如果您想查找更多信息,请参阅下面的 link https://community.hortonworks.com/content/supportkb/48808/a-hive-join-query-is-slow-because-it-is-stuck-for.html

提高 Hive 查询速度 运行 的一般技巧

1.使用 ORC 文件
Hive 支持 ORC 文件——一种新的 table 存储格式,通过谓词下推(Hive 中的上推)、压缩等技术实现了惊人的速度提升。
为每个 HIVE 使用 ORCFile table 应该真的很简单,并且对于获得快速响应 HIVE 查询非常有益。

CREATETABLEA_ORC ( 
customerIDint, namestring, age int, address string 
)

2。使用矢量化 向量化查询执行提高了扫描、聚合、筛选和连接等操作的性能,方法是一次批量执行 1024 行,而不是每次执行一行。 在 Hive 0.13 中引入,此功能显着缩短了查询执行时间,并且可以通过两个参数设置轻松启用:

I. sethive.vectorized.execution.enabled = true;
II. sethive.vectorized.execution.reduce.enabled = true;

3。基于分区的联接: 要优化 Hive 中的连接,我们必须减少查询扫描时间。为此,我们可以通过在“WHERE”子句或 JOIN 中的 ON 子句中指定分区谓词来创建带有分区的 Hive table。
例如:table“状态视图”在“状态”列上进行分区。 以下查询仅检索给定状态的行: 优化 Hive 中的连接

SELECT state_view.* FROM state view WHERE state_view.state= ‘State-1’ AND state_view.state = ‘State-3’;

如果一个 table 状态视图与另一个 table 城市用户连接,您可以在 ON 子句中指定分区范围,如下所示:

SELECT state_view.* FROM state_view JOIN city_users ON (state_view.state = city_users.state); 

希望本文 post 能帮助您满足 Hive 中的所有连接优化需求。