Оптимизация соединения улья и распределение ресурсов - PullRequest
0 голосов
/ 17 января 2019

Моя таблица (MyTable ~ 365 ГБ) содержит данные о поведении клиентов за 2 года. Он разделен по дням и сгруппирован по customer_id в 64 сегмента. В среднем один день содержит 8 миллионов записей.

Моя задача - получать клиентов в день (~ 512 МБ) и анализировать их поведение - например, количество покупок за последние 2 года.

В моем понимании, здесь применимо левое полусоединение, например:

    WITH TabA as (SELECT cid, NUM_PURCHASES from MyTable where dt>= '20161001' and dt <= '20181001'), 
TabB as (SELECT cid from MyTable where dt='20181001') 
    SELECT TabA.cid as ID,
    SUM(TabA.NUM_PURCHASES) as total_p
    FROM TabA LEFT SEMI JOIN TabB on (TabB.cid = TabA.cid) GROUP BY TabA.cid;

Поскольку моя таблица сгруппирована, я в большой степени полагался на советы по оптимизации соединения, опубликованные в Оптимизация соединения улья . Поэтому в Hive установлены следующие параметры (обратите внимание, что tez не работает в моей среде):

set hive.auto.convert.join=true;
SET hive.variable.substitute.depth=150;
set hive.auto.convert.join=true;
set hive.optimize.skewjoin.compiletime=true;
set hive.optimize.skewjoin=true;
set hive.enforce.bucketing = true;
set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
set hive.optimize.bucketmapjoin=true;
set hive.optimize.bucketmapjoin.sortedmerge=true;
set hive.exec.parallel=true;
set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true;
set hive.vectorized.execution.reduce.groupby.enabled = true;
set hive.cbo.enable=true;
SET mapred.child.java.opts=-Xmx4G -XX:+UseConcMarkSweepGC  -XX:-UseGCOverheadLimit;
set mapreduce.map.memory.mb=9216;
set mapreduce.reduce.memory.mb=9216;

Последние три строки добавлены, поскольку у меня были проблемы с памятью.

Мой запрос не выполнен на первом задании. Мапперы выполняются до 100%, и как только редукторы (кажется, запускаются), задание сбрасывается и снова выходит из строя. Диспетчер кластеров сообщает о проблемах памяти пространства кучи Java. Я также пытался уменьшить объем памяти для каждого преобразователя (6 ГБ, 4 ГБ) и редуктора (8 ГБ, 7 ГБ, 6 ГБ) - все комбинации, но я получил ту же ошибку.

Может ли кто-нибудь дать мне представление о том, а) как сделать эту работу, б) сколько места я должен выделить для каждого преобразователя / редуктора и в) можно ли оптимизировать мой запрос (т. Е. Сделать так, чтобы выполнялась группировка по cid) до того, как осталось полу присоединиться)?

...