COLLECT_SET () в кусте (Hadoop) - PullRequest
       22

COLLECT_SET () в кусте (Hadoop)

2 голосов
/ 22 июня 2011

Я только что узнал о функции collect_set () в Hive и начал работу над кластером с тремя узлами разработки.

У меня есть только около 10 ГБ для обработки. Работа, однако, буквально берет навсегда. Я думаю, что может быть либо ошибка в реализации collect_set (), ошибка в моем коде, либо функция collect_set () действительно ресурсоемкая.

Вот мой SQL для Hive (не каламбур):

INSERT OVERWRITE TABLE sequence_result_1
SELECT sess.session_key as session_key,
       sess.remote_address as remote_address,
       sess.hit_count as hit_count,
       COLLECT_SET(evt.event_id) as event_set,
       hit.rsp_timestamp as hit_timestamp,
       sess.site_link as site_link
    FROM site_session sess 
        JOIN (SELECT * FROM site_event 
                WHERE event_id = 274 OR event_id = 284 OR event_id = 55 OR event_id = 151) evt 
            ON (sess.session_key = evt.session_key)
        JOIN site_hit hit ON (sess.session_key = evt.session_key)
GROUP BY sess.session_key, sess.remote_address, sess.hit_count, hit.rsp_timestamp, sess.site_link
ORDER BY hit_timestamp;

Есть 4 прохода MR. Первый занял около 30 секунд. Вторая карта заняла около 1 минуты. И большая часть второго снижения заняла около 2 минут. За последние два часа он увеличился с 97,71% до 97,73%. Это правильно? Я думаю, что должна быть какая-то проблема. Я посмотрел на журнал, и я не могу сказать, нормально ли это.

[Образец журнала]

2011-06-21 16:32:22,715 WARN org.apache.hadoop.hive.ql.exec.GroupByOperator: Hash Tbl flush: #hash table = 120894
2011-06-21 16:32:22,758 WARN org.apache.hadoop.hive.ql.exec.GroupByOperator: Hash Table flushed: new size = 108804
2011-06-21 16:32:23,003 INFO org.apache.hadoop.hive.ql.exec.JoinOperator: 4 forwarding 5142000000 rows
2011-06-21 16:32:23,003 INFO org.apache.hadoop.hive.ql.exec.SelectOperator: 5 forwarding 5142000000 rows
2011-06-21 16:32:24,138 INFO org.apache.hadoop.hive.ql.exec.JoinOperator: 4 forwarding 5143000000 rows
2011-06-21 16:32:24,138 INFO org.apache.hadoop.hive.ql.exec.SelectOperator: 5 forwarding 5143000000 rows
2011-06-21 16:32:24,725 WARN org.apache.hadoop.hive.ql.exec.GroupByOperator: Hash Tbl flush: #hash table = 120894
2011-06-21 16:32:24,768 INFO org.apache.hadoop.hive.ql.exec.GroupByOperator: 6 forwarding 42000000 rows
2011-06-21 16:32:24,771 WARN org.apache.hadoop.hive.ql.exec.GroupByOperator: Hash Table flushed: new size = 108804
2011-06-21 16:32:25,338 INFO org.apache.hadoop.hive.ql.exec.JoinOperator: 4 forwarding 5144000000 rows
2011-06-21 16:32:25,338 INFO org.apache.hadoop.hive.ql.exec.SelectOperator: 5 forwarding 5144000000 rows
2011-06-21 16:32:26,467 INFO org.apache.hadoop.hive.ql.exec.JoinOperator: 4 forwarding 5145000000 rows
2011-06-21 16:32:26,468 INFO org.apache.hadoop.hive.ql.exec.SelectOperator: 5 forwarding 5145000000 rows

Я довольно новичок в этом, и пытаюсь работать с collect_set (), а Hive Array выводит меня из глубины.

Заранее спасибо:)

Ответы [ 3 ]

2 голосов
/ 22 июня 2011

Крупный сбой.Мое решение ниже.В конце концов, не было проблем с COLLECT_SET, он просто пытался собрать все элементы, которых было бесконечно.

Почему?Потому что я присоединился к чему-то, что даже не было частью съемочной площадки.Второе соединение раньше было таким же условием ВКЛ, теперь оно правильно говорит hit.session_key = evt.session_key

INSERT OVERWRITE TABLE sequence_result_1
SELECT sess.session_key as session_key,
       sess.remote_address as remote_address,
       sess.hit_count as hit_count,
       COLLECT_SET(evt.event_id) as event_set,
       hit.rsp_timestamp as hit_timestamp,
       sess.site_link as site_link
    FROM tealeaf_session sess 
        JOIN site_event evt ON (sess.session_key = evt.session_key)
        JOIN site_hit hit   ON (sess.session_key = hit.session_key)
    WHERE evt.event_id IN(274,284,55,151)
GROUP BY sess.session_key, sess.remote_address, sess.hit_count, hit.rsp_timestamp, sess.site_link
ORDER BY hit_timestamp;
0 голосов
/ 22 июня 2011

Я предполагаю, что происходит то, что он производит COLLECT_SET() для КАЖДОЙ строки, которая была бы возвращена.Таким образом, для каждой возвращаемой строки она возвращает весь массив, созданный COLLECT_SET.Это может облагаться налогом и занимать много времени.

Проверьте производительность с помощью COLLECT_SET из запроса.Если это достаточно быстро, вставьте вычисление COLLECT_SET в подзапрос, а затем используйте этот столбец вместо вычисления, где вы находитесь.

Я не использовал COLLECT_SET или не выполнял никаких тестов,какой твой пост, это то, о чем я впервые подозреваю.

0 голосов
/ 22 июня 2011

Первое, что я хотел бы попробовать, это избавиться от вложенного выбора и просто присоединиться к site_event, затем переместить фильтр event_id во внешнее предложение where и заменить его на in ().Итак, что-то вроде:

SELECT sess.session_key as session_key,
   sess.remote_address as remote_address,
   sess.hit_count as hit_count,
   COLLECT_SET(evt.event_id) as event_set,
   hit.rsp_timestamp as hit_timestamp,
   sess.site_link as site_link
FROM site_session sess 
    JOIN site_event evt ON (sess.session_key = evt.session_key)
    JOIN site_hit hit ON (sess.session_key = evt.session_key)
WHERE evt.event_id in(274,284,55151)
GROUP BY sess.session_key, sess.remote_address, sess.hit_count, hit.rsp_timestamp, sess.site_link
ORDER BY hit_timestamp;

Кроме того, я не знаю размеров каждой таблицы, но в целом в Hive вы хотите, чтобы ваши самые большие таблицы (обычно таблица фактов) находились справа.объединений, чтобы уменьшить использование памяти.Причина в том, что Hive пытается удерживать левую сторону объединения в памяти и выполняет потоковую передачу правой стороны, чтобы выполнить соединение.

...