在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
答案 0 :(得分: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;
答案 1 :(得分:0)
请在增加以下属性后再次尝试测试用例:
在Hive Configs中:
hive.tez.conatiner.size
和 在Tez Configs:
1)tez.task.resource.memory.mb
2)tez.task.launch.cmd-opts
- > -Xmx为tez.task.resource.memory.mb
3)tez.am.resource.memory.mb
4)tez.am.launch.cmd-opts
- > -Xmx为tez.am.resource.memory.mb
这至少可以解决Java Heap空间问题。
答案 2 :(得分:0)
使用count(distinct)查询会强制使用单个reducer。如果您使用子查询而不是您不需要单个减速器。
select dept, count(*) from
(select dept, emp_id from emp_log
group by dept, emp_id
) a
group by dept;
这应该快得多。干杯!