Здесь мы опишем процесс запуска MapReduce Job в Apache Hadoop в многоузловом кластере. Чтобы настроить Apache Hadoop в Multinode Cluster, можно прочитать раздел Настройка Apache Hadoop Multi-Node Cluster .
Для настройки мы должны настроить hadoop со следующими параметрами на каждой машине:
- Добавьте следующее свойство в conf / mapred-site.xml во всех узлах
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
< property > < name >mapred.job.tracker</ name > < value >master:54311</ value > < description >The host and port that the MapReduce job tracker runs at. If “local”, then jobs are run in-process as a single map and reduce task. </ description > </ property > < property > < name >mapred.local.dir</ name > < value >${hadoop.tmp.dir}/mapred/local</ value > </ property > < property > < name >mapred.map.tasks</ name > < value >20</ value > </ property > < property > < name >mapred.reduce.tasks</ name > < value >2</ value > </ property > |
NB. Последние три являются дополнительными настройками, поэтому мы можем их опустить.
- Проект Гутенберга
Для нашей демонстрационной цели MapReduce мы будем использовать пример работы WordCount, который читает текстовые файлы и подсчитывает, как часто встречаются слова. Входные данные представляют собой текстовые файлы, а выходные данные представляют собой текстовые файлы, каждая строка которых содержит слово и счетчик частоты его появления, разделенных вкладкой.
Загрузите примеры входных данных со следующих сайтов, и все электронные тексты должны быть в текстовом формате us-ascii.
- Очерк науки, вып. 1 (из 4) Дж. Артур Томсон
- Записные книжки Леонардо да Винчи
- Улисс Джеймсом Джойсом
- Искусство войны 6-го века BC Sunzi
- Приключения Шерлока Холмса сэр Артур Конан Дойл
- Словарь дьявола Амброз Бирс
- Британская энциклопедия, 11-е издание, том 4, часть 3
Пожалуйста, Google для этих текстов. Загрузите каждую электронную книгу в виде текстовых файлов в кодировке UTF-8 в виде простого текста и сохраните файлы в локальном временном каталоге, например / tmp / gutenberg. Проверьте файлы с помощью следующей команды:
1
|
$ ls -l /tmp/gutenberg/ |
- Затем мы запускаем слой dfs и mapred в нашем кластере.
1
2
3
|
$ start-dfs.sh $ start-mapred.sh |
Проверьте, введя следующую команду jps, чтобы проверить датоды, наменоды и систему отслеживания задач. Система отслеживания заданий исправна и работает на всех узлах.
- Далее мы скопируем локальные файлы (здесь текстовые файлы) в Hadoop HDFS
1
2
3
|
$ hadoop dfs -copyFromLocal /tmp/gutenberg /Users/hduser/gutenberg $ hadoop dfs - ls /Users/hduser |
Если файлы успешно скопированы, мы увидим что-то вроде ниже — Найдено 2 пункта
1
|
drwxr-xr-x – hduser supergroup 0 2013-05-21 14:48 /Users/hduser/gutenberg |
Кроме того, мы проверяем нашу файловую систему в / Users / hduser / gutenberg:
1
|
$ hadoop dfs - ls /Users/hduser/gutenberg |
1
2
3
4
5
6
7
8
9
|
Found 7 items -rw-r--r-- 2 hduser supergroup 336705 2013 - 05 - 21 14 : 48 /Users/hduser/gutenberg/pg132.txt -rw-r--r-- 2 hduser supergroup 581877 2013 - 05 - 21 14 : 48 /Users/hduser/gutenberg/pg1661.txt -rw-r--r-- 2 hduser supergroup 1916261 2013 - 05 - 21 14 : 48 /Users/hduser/gutenberg/pg19699.txt -rw-r--r-- 2 hduser supergroup 674570 2013 - 05 - 21 14 : 48 /Users/hduser/gutenberg/pg20417.txt -rw-r--r-- 2 hduser supergroup 1540091 2013 - 05 - 21 14 : 48 /Users/hduser/gutenberg/pg4300.txt -rw-r--r-- 2 hduser supergroup 447582 2013 - 05 - 21 14 : 48 /Users/hduser/gutenberg/pg5000.txt -rw-r--r-- 2 hduser supergroup 384408 2013 - 05 - 21 14 : 48 /Users/hduser/gutenberg/pg972.txt |
- Мы начинаем нашу работу MapReduce
Давайте запустим пример MapReduce WordCount:
1
|
$ hadoop jar hadoop-examples-1.0.4.jar wordcount /Users/hduser/gutenberg /Users/hduser/gutenberg-output |
NB: Предполагая, что вы уже находитесь в директории HADOOP_HOME. Если нет то
1
|
$ hadoop jar ABSOLUTE /PATH/TO/HADOOP/DIR/hadoop-examples-1 .0.4.jar wordcount /Users/hduser/gutenberg /Users/hduser/gutenberg-output |
Или, если вы установили Hadoop в / usr / local / hadoop,
1
|
hadoop jar /usr/local/hadoop/hadoop-examples-1 .0.4.jar wordcount /Users/hduser/gutenberg /Users/hduser/gutenberg-output |
Вывод выглядит примерно так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
13 / 05 / 22 13 : 12 : 13 INFO mapred.JobClient: map 0 % reduce 0 % 13 / 05 / 22 13 : 12 : 59 INFO mapred.JobClient: map 28 % reduce 0 % 13 / 05 / 22 13 : 13 : 05 INFO mapred.JobClient: map 57 % reduce 0 % 13 / 05 / 22 13 : 13 : 11 INFO mapred.JobClient: map 71 % reduce 0 % 13 / 05 / 22 13 : 13 : 20 INFO mapred.JobClient: map 85 % reduce 0 % 13 / 05 / 22 13 : 13 : 26 INFO mapred.JobClient: map 100 % reduce 0 % 13 / 05 / 22 13 : 13 : 43 INFO mapred.JobClient: map 100 % reduce 50 % 13 / 05 / 22 13 : 13 : 55 INFO mapred.JobClient: map 100 % reduce 100 % 13 / 05 / 22 13 : 13 : 59 INFO mapred.JobClient: map 85 % reduce 100 % 13 / 05 / 22 13 : 14 : 02 INFO mapred.JobClient: map 100 % reduce 100 % 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Job complete: job_201305211616_0011 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Counters: 26 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Job Counters 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Launched reduce tasks= 3 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: SLOTS_MILLIS_MAPS= 118920 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)= 0 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)= 0 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Launched map tasks= 10 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Data-local map tasks= 10 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES= 54620 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: File Output Format Counters 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Bytes Written= 1267287 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: FileSystemCounters 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: FILE_BYTES_READ= 4151123 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: HDFS_BYTES_READ= 5882320 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: FILE_BYTES_WRITTEN= 6937084 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: HDFS_BYTES_WRITTEN= 1267287 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: File Input Format Counters 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Bytes Read= 5881494 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Map-Reduce Framework 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Reduce input groups= 114901 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Map output materialized bytes= 2597630 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Combine output records= 178795 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Map input records= 115251 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Reduce shuffle bytes= 1857123 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Reduce output records= 114901 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Spilled Records= 463427 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Map output bytes= 9821180 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Total committed heap usage (bytes)= 1567514624 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Combine input records= 1005554 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Map output records= 1005554 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: SPLIT_RAW_BYTES= 826 13 / 05 / 22 13 : 14 : 07 INFO mapred.JobClient: Reduce input records= 178795 |
- Получение результата работы
Для чтения напрямую из hadoop без копирования в локальную файловую систему:
1
|
$ hadoop dfs - cat /Users/hduser/gutenberg-output/part-r-00000 |
Давайте скопируем результаты в локальную файловую систему.
1
2
3
4
5
|
$ mkdir /tmp/gutenberg-output $ bin /hadoop dfs -getmerge /Users/hduser/gutenberg-output /tmp/gutenberg-output $ head /tmp/gutenberg-output/gutenberg-output |
Мы получим вывод как:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
" 'Ample.' 1 " 'Arthur!' 1 "'As 1 "'Because 1 " 'But,' 1 " 'Certainly,' 1 "'Come, 1 "'DEAR 1 "'Dear 2 "'Dearest 1 " 'Don' t 1 "'Fritz! 1 "'From 1 "'Have 1 "'Here 1 "'How 2 |
Команда fs -getmerge просто объединит любые файлы, найденные в указанном вами каталоге. Это означает, что объединенный файл может (и, скорее всего, будет) не сортироваться.
Ресурсы:
- http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/
- http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-multi-node-cluster/
- http://hadoop.apache.org/docs/current/