[英]Hive : Optimize a long running Query
在50GB大小的員工日志表上運行的簡單Hive SQL查詢運行了幾個小時。
select dept,count(distinct emp_id) from emp_log group by dept;
只有4-5個部門,每個部門有大量員工。
它以Hive 0.14 + Tez在1TB內存上運行。 有什么方法可以優化此代碼塊以獲得更好的性能?
修改1
測試用collect_list替換不重復。
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
您應該嘗試避免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;
增加以下屬性后,請再次嘗試測試用例:
在Hive Configs中:
hive.tez.conatiner.size
在Tez配置中:
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 Heap空間問題。
您使用count(distinct)的查詢強制使用單個化簡器。 如果使用子查詢,則不需要單個reducer。
select dept, count(*) from
(select dept, emp_id from emp_log
group by dept, emp_id
) a
group by dept;
這應該快得多。 干杯!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.