0

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 を使用してテストされています。

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

4

3 に答える 3

0

次のプロパティを増やしてから、テスト ケースを再試行してください。

ハイブ構成:

hive.tez.conatiner.size

および Tez 構成:

1)tez.task.resource.memory.mb

2) tez.task.launch.cmd-opts-> -Xmx の 80%tez.task.resource.memory.mb

3)tez.am.resource.memory.mb

4) tez.am.launch.cmd-opts -> -Xmx の 80%tez.am.resource.memory.mb

これにより、少なくとも Java ヒープ スペースの問題は解決するはずです。

于 2016-03-07T10:34:28.230 に答える
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;
于 2015-11-09T09:38:32.333 に答える
0

count(distinct) を使用したクエリは、単一のレデューサーを強制します。代わりにサブクエリを使用すると、単一のレデューサーは必要ありません。

select dept, count(*) from
    (select dept, emp_id from emp_log 
     group by dept, emp_id
     ) a
group by dept;

これははるかに高速です。乾杯!

于 2016-03-07T19:15:40.683 に答える