0

在 50GB 大小的员工日志表上运行的简单 Hive SQL 查询运行了数小时。

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

只有4-5个部门,每个部门都有大量员工。

它在 1TB 内存上使用 Hive 0.14 + Tez 运行。有没有办法优化这个代码块以获得更好的性能?

修改 1
用 collect_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

4

3 回答 3

0

您使用 count(distinct) 的查询会强制使用单个减速器。如果您使用子查询,则不需要单个减速器。

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

这应该快得多。干杯!

于 2016-03-07T19:15:40.683 回答
0

请在增加以下属性后再次尝试测试用例:

在 Hive 配置中:

hive.tez.conatiner.size

在 Tez Configs 中:

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 堆空间问题。

于 2016-03-07T10:34:28.230 回答
0

您应该尝试避免count(distinct foo)

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

count(distinct x)在 HIVE 0.14 中无效。

您还应该激活这些列的统计信息:

ANALYZE TABLE emp_log COMPUTE STATISTICS;
ANALYZE TABLE emp_log COMPUTE STATISTICS FOR COLUMNS dept, emp_id;
于 2015-11-09T09:38:32.333 回答