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