hive:优化长时间运行的查询

mlmc2os5  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(483)

在50gb大小的员工日志表上运行的简单配置单元sql查询已运行数小时。

select dept,count(distinct emp_id) from emp_log group by dept;

只有4-5个部门,每个部门有大量员工。
它是用hive0.14+tez在1tb内存上运行的。有没有办法优化这个代码块以获得更好的性能?
修改1
用collect\u list替换distinct进行测试。 SELECT dept, size(collect_list(emp_id)) nb_emps FROM emp_log GROUP BY dept 出现以下错误, Status: Failed Vertex failed, vertexName=Reducer 2,vertexId=vertex_1446976653619_0043_1_02, diagnostics=[Task failed,taskId=task_1446976653619_0043_1_02_000282, diagnostics=[TaskAttempt 0 failed, info=[Error: Failure while running task:java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space

np8igboo

np8igboo1#

请在增加以下属性后重试测试用例:
在配置单元中: hive.tez.conatiner.size 在tez配置中:

  1. tez.task.resource.memory.mb 2) tez.task.launch.cmd-opts ->-xmx为80% tez.task.resource.memory.mb 3) tez.am.resource.memory.mb 4) tez.am.launch.cmd-opts ->-xmx为80% tez.am.resource.memory.mb 这至少可以解决java堆空间问题。
yacmzcpb

yacmzcpb2#

您应该尝试这样做以避免计数(不同的foo):

SELECT dept, size(collect_list(emp_id)) nb_emps
FROM emp_log 
GROUP BY dept

计数(distinct x)在Hive0.14中无效。
您还应该激活这些列的统计信息:

ANALYZE TABLE emp_log COMPUTE STATISTICS;
ANALYZE TABLE emp_log COMPUTE STATISTICS FOR COLUMNS dept, emp_id;
06odsfpq

06odsfpq3#

使用count(distinct)的查询强制使用一个reducer。如果改用子查询,则不需要单个减速机。

select dept, count(*) from
    (select dept, emp_id from emp_log 
     group by dept, emp_id
     ) a
group by dept;

这应该快得多。干杯!

相关问题