簡體   English   中英

蜂巢:優化長期運行的查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM