Предложение DISTRIBUTE BY в HIVE

Я не могу понять, что делает это предложение DISTRIBUTE BY в Hive. Я знаю определение, в котором говорится, что если у нас есть DISTRIBUTE BY (city), это отправит каждый город в другой reducer, но я не получаю того же самого. Рассмотрим данные следующим образом:

Скажем, у нас есть таблица с именем data со столбцами username и amount:

+----------+--------+
| username | amount |
+----------+--------+
| user_1   | 25     |
+----------+--------+
| user_1   | 53     |
+----------+--------+
| user_1   | 28     |
+----------+--------+
| user_1   | 50     |
+----------+--------+
| user_2   | 20     |
+----------+--------+
| user_2   | 50     |
+----------+--------+
| user_2   | 10     |
+----------+--------+
| user_2   | 5      |
+----------+--------+

Теперь, если я скажу -

SELECT username, SUM(amount) FROM data DISTRIBUTE BY (username)

Разве это не должно запускать 2 отдельных редуктора? Он все еще работает с одним редуктором, и я не знаю, почему. Я думал, что это может быть связано с кластеризацией в сегменты или разбиением на разделы, но я перепробовал все, и все равно работает один редьюсер. Кто-нибудь может объяснить, почему?


person User9523    schedule 14.02.2017    source источник


Ответы (2)


Единственное, что говорит DISTRIBUTE BY (city), это то, что записи с одним и тем же city будут попадать в один и тот же редьюсер. Ничего больше.

Hive использует столбцы в Distribute By для распределения строк между редьюсерами. Все строки с одинаковыми столбцами «Распределить по» перейдут к одному и тому же редюсеру.

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy


Вопрос от ОП:

Тогда в чем смысл этого DISTRIBUTE BY? Нет никакой гарантии, что каждый (город) перейдет к другому редуктору, тогда зачем его использовать?


По 2 причинам:

  1. В начале улья DISTRIBUTE BY, SORT BY и CLUSTER BY использовались для обработки данных способом, который сегодня выполняется автоматически (например, аналитические функции https://oren.lederman.name/?p=32)

  2. Возможно, вы захотите передать свои данные через скрипт (Hive «Transform»), и вы хотите, чтобы ваш скрипт обрабатывал ваши данные в определенных группах и порядке. Для этого вы можете использовать DISTRIBUTE BY + SORT BY или CLUSTER BY. С DISTRIBUTE BY гарантируется, что вся группа будет в одном редюсере. С SORT BY вы будете постоянно получать все записи группы.

person David דודו Markovitz    schedule 14.02.2017
comment
Как если бы я сказал, что есть четыре города A, B, C и D, A должен перейти к другому редюсеру, B к другому и так далее? - person User9523; 15.02.2017
comment
Нет. Все A пойдет на 1 редуктор. Все B перейдут к 1 редуктору. У вас нет гарантии, что это будут разные редьюсеры. - person David דודו Markovitz; 15.02.2017
comment
Итак, мы можем сказать, что редуктор будет содержать только (1) вид города? - person User9523; 15.02.2017
comment
Также нет. Каждая запись, которая считывается картографом, копируется в один из редюсеров, определяемых хэш-функцией (функциями) над значением (ями) распределения, в данном случае city, и это происходит только после определения количества редукторов. . - person David דודו Markovitz; 15.02.2017
comment
Серьезно, я не понимаю. Тогда в чем смысл этого DISTRIBUTE BY? Нет никакой гарантии, что каждый (город) перейдет к другому редуктору, тогда зачем его использовать? - person User9523; 15.02.2017
comment
По двум причинам (1) В начале куста DISTRIBUTE BY, SORT BY и CLUSTER BY использовались для обработки данных способом, который сегодня выполняется автоматически (например, аналитические функции oren.lederman.name/?p=32) (2) Вы можете поток данных через сценарий (Hive Transform), и вы хотите, чтобы ваш сценарий обрабатывал ваши данные в определенных группах и порядке. Для этого вы можете использовать РАСПРЕДЕЛЕНИЕ ПО + СОРТИРОВКА ПО или КЛАСТЕР ПО. С DISTRIBUTE BY гарантируется, что вся группа будет в одном редукторе. С помощью SORT BY вы будете постоянно получать все записи группы. - person David דודו Markovitz; 15.02.2017
comment
Наконец-то понял. Большое спасибо ! - person User9523; 17.02.2017
comment
Эй, @DavidדודוMarkovitz, я использовал предложение DISTRIBUTE BY, как вы сказали... Но что, если в моих таблицах нет разделов? Тогда как я могу убедиться, что мои файлы попадают в один редуктор? Я пытаюсь решить проблему с небольшими файлами, используя insert overwrite куста, чтобы объединить их в один больший. Для секционированной таблицы distribute by работает нормально, но что, если у меня нет столбцов разделов? - person Hemakshi Sachdev; 21.06.2018

В дополнение к ответу @Dudu, Distribute By распределяет строки только среди редукторов, что определяется размером ввода.

Количество редукторов, которые будут использоваться для задания Hive, будет определяться этим свойством hive.exec.reducers.bytes.per.reducer, которое зависит от ввода.

Начиная с Hive 0.14, если входные данные ‹ 256 МБ, будет использоваться только один редуктор (один редуктор на 256 МБ входных данных), если количество редьюсеров не переопределено свойствами hive.exec.reducers.max или mapred.reduce.tasks.

person franklinsijo    schedule 14.02.2017
comment
Итак, если мне нужен другой редуктор, скажем, для каждого (города), я должен знать количество РАЗЛИЧНЫХ городов, верно? - person User9523; 15.02.2017
comment
Нет. Понятно, что количество редукторов должно быть больше или равно количеству городов, чтобы каждый город располагался на разном редукторе, но ничто этого не гарантирует. Это хэш-функция, и теоретически у вас может быть 10 городов и 100 редукторов, и все равно все города будут на одном редюсере. - person David דודו Markovitz; 15.02.2017
comment
Привет @franklinsijo и hive.exec.reducers.max, и mapred.reduce.tasks не работают. Я хочу установить нет. редукторов на 1, чтобы все файлы попадали в один редуктор и объединялись в один. Поскольку в моей таблице нет разделов, я не могу использовать предложение DISTRIBUTE BY для отправки файлов одного раздела в один редуктор. Вы в любом случае я могу установить нет. редукторов на 1?? - person Hemakshi Sachdev; 20.06.2018