在50 is大小的employee日志表上运行的一个简单的Hive查询正在运行数小时。
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
发布于 2015-11-09 09:38:32
您应该尝试避免计数(不同的foo):
SELECT dept, size(collect_list(emp_id)) nb_emps
FROM emp_log
GROUP BY dept计数(不同x)在0.14蜂箱中无效。
此外,还应该激活这些列的统计信息:
ANALYZE TABLE emp_log COMPUTE STATISTICS;
ANALYZE TABLE emp_log COMPUTE STATISTICS FOR COLUMNS dept, emp_id;发布于 2016-03-07 10:34:28
在增加以下属性后,请再次尝试测试用例:
在蜂巢中:
hive.tez.conatiner.size
在特兹康斯图中:
1) tez.task.resource.memory.mb
2) tez.task.launch.cmd-opts -> -Xmx占tez.task.resource.memory.mb的80%
3) tez.am.resource.memory.mb
( 4) tez.am.launch.cmd-opts -> -Xmx占tez.am.resource.memory.mb的80%
这至少可以解决Java空间问题。
发布于 2016-03-07 19:15:40
使用count(distinct)的查询强制使用单个减速器。如果您使用子查询而不是只需要一个还原器。
select dept, count(*) from
(select dept, emp_id from emp_log
group by dept, emp_id
) a
group by dept;这应该要快得多。干杯!
https://stackoverflow.com/questions/33598226
复制相似问题