蜂巢 - 4桌加入

时间:2017-05-30 20:15:05

标签: performance hadoop hive

我需要加入4个表,并且在每个连接条件中,连接列是不同的

数据大小

Table emp - 8T
Table stu - 10GB
Table college - 800 MB
Table address - 2 TB

查询 -

select a.*,b.*,c.*,d.* from emp  a 
Left outer join stu b(a.id=b.id)
left outer join college  c(a.trans_id=c.trans_id and a.emp_id=c.emp_id)
left outer join address  d(a.seq_no=d.seq_no and a.emp_id=d.emp_id )

上述查询的执行时间太长,因为使用大量数据集。

有没有办法提高性能

3 个答案:

答案 0 :(得分:0)

使用Tez作为执行引擎可以提高Hive的性能。

根据您是否使用预安装Hive附带的平台,或者安装了vanilla,您可能已经或可能没有Tez。

如果没有,可在此处找到Tez安装说明:Install/Deploy Instructions for Tez

要使用Tez,您需要在查询前加上: set hive.execution.engine=tez;

在我的测试(3节点集群)中,我的平均性能提升了25%。

答案 1 :(得分:0)

有多种方法可以调整您的查询:

  1. 使用Tez引擎。
  2. 为每个表格提供更好的文件格式,尤其是较大的格式。
  3. 添加CBO,矢量化属性
  4. 映射器数量,缩减器数量,每个地图任务的数量,减少任务,映射输出压缩属性。
  5. 您还可以修改查询,使最大的表格成为连接查询中的第二个表格。{em。select a.* from tabA a join tabB b on a.id=b.id。这里TabB应该大于tabA。
  6. 您可以参考this文档了解有关优化的更多详情。

答案 2 :(得分:0)

  1. 使用TEZ。 Tez的表现比MR快。
  2. set hive.execution.engine=tez;

    1. 尝试减少每个reducer的字节数。减小此参数将增加parallelizm(减速器的数量)
    2. hive.exec.reducers.bytes.per.reducer=67108864;

      1. 使用矢量化
      2. set hive.vectorized.execution.enabled = true; set hive.vectorized.execution.reduce.enabled = true; 你的桌子很大。如果可能的话减少数据量。例如,仅加入新的/最近更新的记录。