Итак, сегодня хотел бы рассказать об основных алгоритмах 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