Здесь мы опишем процесс запуска 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 runsat. If “local”, then jobs are run in-process as a single mapand 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_001113/05/22 13:14:07 INFO mapred.JobClient: Counters: 2613/05/22 13:14:07 INFO mapred.JobClient: Job Counters 13/05/22 13:14:07 INFO mapred.JobClient: Launched reduce tasks=313/05/22 13:14:07 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=11892013/05/22 13:14:07 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=013/05/22 13:14:07 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=013/05/22 13:14:07 INFO mapred.JobClient: Launched map tasks=1013/05/22 13:14:07 INFO mapred.JobClient: Data-local map tasks=1013/05/22 13:14:07 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=5462013/05/22 13:14:07 INFO mapred.JobClient: File Output Format Counters 13/05/22 13:14:07 INFO mapred.JobClient: Bytes Written=126728713/05/22 13:14:07 INFO mapred.JobClient: FileSystemCounters13/05/22 13:14:07 INFO mapred.JobClient: FILE_BYTES_READ=415112313/05/22 13:14:07 INFO mapred.JobClient: HDFS_BYTES_READ=588232013/05/22 13:14:07 INFO mapred.JobClient: FILE_BYTES_WRITTEN=693708413/05/22 13:14:07 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=126728713/05/22 13:14:07 INFO mapred.JobClient: File Input Format Counters 13/05/22 13:14:07 INFO mapred.JobClient: Bytes Read=588149413/05/22 13:14:07 INFO mapred.JobClient: Map-Reduce Framework13/05/22 13:14:07 INFO mapred.JobClient: Reduce input groups=11490113/05/22 13:14:07 INFO mapred.JobClient: Map output materialized bytes=259763013/05/22 13:14:07 INFO mapred.JobClient: Combine output records=17879513/05/22 13:14:07 INFO mapred.JobClient: Map input records=11525113/05/22 13:14:07 INFO mapred.JobClient: Reduce shuffle bytes=185712313/05/22 13:14:07 INFO mapred.JobClient: Reduce output records=11490113/05/22 13:14:07 INFO mapred.JobClient: Spilled Records=46342713/05/22 13:14:07 INFO mapred.JobClient: Map output bytes=982118013/05/22 13:14:07 INFO mapred.JobClient: Total committed heap usage (bytes)=156751462413/05/22 13:14:07 INFO mapred.JobClient: Combine input records=100555413/05/22 13:14:07 INFO mapred.JobClient: Map output records=100555413/05/22 13:14:07 INFO mapred.JobClient: SPLIT_RAW_BYTES=82613/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/