Hive: оптимизировать длительный запрос

Простой запрос Hive SQL, выполняемый для таблицы журнала сотрудников размером 50 ГБ, выполняется в течение нескольких часов.

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

Есть только 4-5 отделов и огромное количество сотрудников на отдел.

Он был запущен с Hive 0.14 + Tez на 1 ТБ памяти. Есть ли способ оптимизировать этот блок кода для повышения производительности?

Модификация 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

3 ответа

Ваш запрос, использующий количество (отличный), вызывает один редуктор. Если вместо этого вы используете подзапрос, вам не потребуется ни одного редуктора.

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

Это должно быть намного быстрее. Ура!

Вы должны попробовать это, чтобы избежать подсчета (отличный от foo):

SELECT dept, size(collect_list(emp_id)) nb_emps
FROM emp_log 
GROUP BY dept

количество (отличное х) неэффективно при ВИЧ E 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 Configs:

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 по крайней мере.

Другие вопросы по тегам