首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hive :优化一个长时间运行的查询

Hive :优化一个长时间运行的查询
EN

Stack Overflow用户
提问于 2015-11-08 19:44:24
回答 3查看 1.4K关注 0票数 0

在50 is大小的employee日志表上运行的一个简单的Hive查询正在运行数小时。

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

发布于 2015-11-09 09:38:32

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

代码语言:javascript
复制
SELECT dept, size(collect_list(emp_id)) nb_emps
FROM emp_log 
GROUP BY dept

计数(不同x)在0.14蜂箱中无效。

此外,还应该激活这些列的统计信息:

代码语言:javascript
复制
ANALYZE TABLE emp_log COMPUTE STATISTICS;
ANALYZE TABLE emp_log COMPUTE STATISTICS FOR COLUMNS dept, emp_id;
票数 0
EN

Stack Overflow用户

发布于 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空间问题。

票数 0
EN

Stack Overflow用户

发布于 2016-03-07 19:15:40

使用count(distinct)的查询强制使用单个减速器。如果您使用子查询而不是只需要一个还原器。

代码语言:javascript
复制
select dept, count(*) from
    (select dept, emp_id from emp_log 
     group by dept, emp_id
     ) a
group by dept;

这应该要快得多。干杯!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33598226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档