Когда мы не должны использовать пакетирование в улье?

#hadoop #hive

#hadoop #улей

Вопрос:

Когда мы не должны использовать пакетирование в улье? В чем узкое место этого метода?

Ответ №1:

Я думаю, вам не нужно использовать пакетирование, если вы не можете извлечь из него выгоду. Насколько я знаю, среди основных преимуществ группирования: более эффективная выборка и объединения на стороне карты (см. Ниже). Поэтому, если ваша таблица маленькая или вам не нужна быстрая выборка и объединения на стороне карты, просто не используйте ее, потому что вам нужно помнить, что вам нужно собирать данные перед вставкой вручную или с помощью set hive.enforce.bucketing = true; Нет узкого места, это всего лишь один из возможных макетов данных, который позволяет вам использоватьпреимущество в некоторых ситуациях.

Пример соединения на стороне карты улья (подробнее см. Здесь):

Если объединяемые таблицы группируются по столбцам объединения, а количество сегментов в одной таблице кратно количеству сегментов в другой таблице, сегменты могут быть объединены друг с другом. Если таблица A имеет 4 сегмента, а таблица B имеет 4 сегмента, следующее объединение

 SELECT a.key, a.value
FROM a JOIN b ON a.key = b.key
  

может быть сделано только на mapper. Вместо полной выборки B для
каждого картографа A извлекаются только требуемые сегменты. Для
приведенного выше запроса сопоставитель, обрабатывающий сегмент 1 для A, получит только сегмент 1
из B. Это не поведение по умолчанию и регулируется следующим
параметром

 set hive.optimize.bucketmapjoin = true
  

Обновление с учетом искажения данных при группировании.

Номер корзины, рассчитанный с использованием hash_function(bucketing_column) mod num_buckets . Если ваш столбец группирования имеет тип int, то hash_int(i) == i (подробнее см. Здесь). Итак, если у вас есть искаженные значения в этом столбце, например, одно значение появляется намного чаще, чем другие, тогда в соответствующий сегмент будет помещено гораздо больше строк, у вас будут непропорциональные сегменты, это снижает скорость запроса. В Hive есть встроенные инструменты для преодоления асимметрии данных (см. Перекошенные таблицы), но я не думаю, что вам следует использовать столбец с перекошенными данными для группирования в первую очередь.

Комментарии:

1. Спасибо за ответ. Но я ищу ситуацию в реальном времени, в которой мы не должны использовать пакетирование. Одна из ситуаций заключается в том, что у нас «искаженные» данные.

Ответ №2:

Пакетирование — это метод, с помощью которого мы распределяем данные по файлам. которые в противном случае были бы распределены неравномерно.

Когда использовать пакетирование: когда мы знаем, что запрос будет использовать столбец, такой как «customer_id», который является последовательным или равномерно распределенным.

Когда не использовать пакетирование: мы бы не стали использовать пакетирование, если знаем, что большинство вариантов использования таблицы связаны с чтением подмножества данных.

Например: хотя мы храним исторические данные, мы обрабатываем только данные за последние 2 недели, чтобы что-то определить. В этом сценарии мы бы использовали разделение по неделям.

Ответ №3:

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