Wednesday, 27 March 2013

Пост 10. Сортировка в hadoop. Синтаксис hive.

Итак, сегодня хотел бы рассказать об основных алгоритмах MapReduce и как они могут быть имплементированы в рамках данной парадигмы.
Сортировка – идея проста: на шаге map идет простая разметка, например на вход подается
(K0,V0) – (0, word1)
На выходы это преобразуется в
(K1,V1) – (word1,1)
Стоит заметить, что 0 во входной паре и 1 в выходной  - удовлетворение требования.
Далее идет стадия partition – на которой определяется на какой редьюсер пойдет выходная пара (если редьюсер один – то все становится просто)
                Вся магия сортировки в Hadoop – выбираем функцию partitioning такую, что если k1<k2, то и partitioning(k1) <= partitioning(k2).
Reduce не делает ничего. Framework уже все отсортироавл, прежде чем подавать это на reduce.

Давайте рассмотрим пример.
Создаем файл 12345 куда вбиваем алфавит:
A
B
C
….
Размножаем его:
for i in `seq 1 100000`; do cat 12345 >> /tmp/alpha.txt; done;
Загружаем в HDFS с размером блока 1 Мб
hadoop fs -D dfs.blocksize=1048576 -put /tmp/alpha.txt /tmp/
Проверяем количество блоков:
hadoop fsck /tmp/alpha.txt -locations -blocks –files
Создаем в HIVE  табличку с одной колонкой (я назвал ее sort_test)
Пишем запрос:
create table sort_result as
select col_0 from sort_test
sort by col_0
До того как его запустить выставим параметр
mapred.max.split.size=1048576
Иначе не будет нескольких map  - все свалится в один (с этим параметром у меня получилось 5 map), количество reduce тоже выставляем равным mapred.reduce.tasks=5
(! Сейчас я только имитирую большое количество данных и серверов, поэтому выставляю эти параметры).
После того как запрос отработает можно посмотреть что получилось:
[oracle@localhost ~]$ hadoop fs -ls /user/beeswax/warehouse/sort_result/
Found 5 items
-rw-r--r--   1 oracle hadoop     878714 2013-03-24 12:46 /user/beeswax/warehouse/sort_result/000000_0
-rw-r--r--   1 oracle hadoop     879928 2013-03-24 12:46 /user/beeswax/warehouse/sort_result/000001_0
-rw-r--r--   1 oracle hadoop     878716 2013-03-24 12:46 /user/beeswax/warehouse/sort_result/000002_0
-rw-r--r--   1 oracle hadoop     879966 2013-03-24 12:46 /user/beeswax/warehouse/sort_result/000003_0
-rw-r--r--   1 oracle hadoop     882676 2013-03-24 12:47 /user/beeswax/warehouse/sort_result/000004_0
Вытянемэто на локальную машину
hadoop fs -get /user/beeswax/warehouse/sort_result/*
И увидим 5 практически идентичных файлов.
Ну вот как то так оно все сортируется. Из hadoop все это можно вытащить в виде одного файла
hadoop fs -getmerge /user/beeswax/warehouse/sort_result/* big_file
но не стоит обольщаться – вы получите один большой файл вида:
a
z
a
z
То есть финальной сортировки не будет.

Если все таки хочется получить на выходе один файл в отсортированном порядке – можно указать вместо sort by конструкцию order by
create table sort_result as
select col_0 from sort_test
order by col_0

No comments:

Post a Comment