Файл: Лабораторная работа 2 Запуск примеров MapReduce. Python&Hadoop.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 30.11.2023

Просмотров: 119

Скачиваний: 10

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


Лабораторная работа №2

Запуск примеров MapReduce. Python&Hadoop

Попробуем выполнить пример MapReduce с использованием Python. Это типичный пример подсчета слов в файле.

Прежде всего, нам нужна среда Hadoop. Поскольку он у нас есть, нам просто нужно перезапустить его.

$ docker start -i

Загрузка файлов в HDFS (распределенная файловая система Hadoop)

Прежде всего, внутри нашей среды Hadoop мы должны перейти к каталогу examples.

hduser@localhost:

$ cd examples

Теперь скопируем файлы txt из локальной файловой системы в HDFS, используя следующие команды.

hduser@localhost: /examples$ hdfs dfs -put *.txt input

Для создания входного каталога в распределенной файловой системе Hadoop, следует выполнить следующие команды:

hduser@localhost: /examples$ hdfs dfs -mkdir /user

hduser@localhost: /examples$ hdfs dfs -mkdir /user/

hduser

hduser@localhost: /examples$ hdfs dfs -mkdir input

Мы можем проверить файлы, загруженные в распределенную файловую систему, используя.

hduser@localhost: /examples$ hdfs dfs -ls input Found 4 items

-rw-r--r-- 1 hduser supergroup 1586488 2020-08-09 00:29 input/4300-0.txt

-rw-r--r-- 1 hduser supergroup 1428841 2020-08-09 00:29 input/5000-8.txt

-rw-r--r-- 1 hduser supergroup 15929 2020-08-09 00:29 input/data-text.txt

-rw-r--r-- 1 hduser supergroup 674570 2020-08-09 00:29 input/pg20417.txt

Проверка и разбор кода

Mapper будет считывать строки из stdin (стандартный ввод). Hadoop отправит поток данных, считанных из HDFS, в mapper, используя стандартный вывод (stdout). Картограф прочитает каждую строку, отправленную через стандартный интерфейс, очистив все символы, отличные от буквенно-цифровых, и создав список Python со словами (split). Наконец, он создаст строку “word \ t1”, это пара (work,1), результат снова отправляется в поток данных с использованием стандартного вывода (print).

#!/usr/bin/env python
import sysimport re
for line in sys.stdin: line = re.sub(r'\W+',' ',line.strip()) words = line.split()
for word in words: print('{}\t{}'.format(word,1))

Редуктор будет считывать каждый ввод (строку) из stdin и будет считать каждое повторяющееся слово (увеличивая счетчик для этого слова) и отправит результат в стандартный вывод. Процесс будет выполняться итеративным способом до тех пор, пока в stdin не останется больше входных данных.

#!/usr/bin/env python
import sys
current_word = None

current_count = 0

word = None
for line in sys.stdin:

line = line.strip()

word, count = line.split('\t',1)
try:

count = int(count)

except ValueError:

continue
if current_word == word:

current_count += count

else:

if current_word: print('{}\t{}'.format(current_word,current_count))
current_word = word

current_count = count

if current_word == word:

print('{}\t{}'.format(current_word,current_count))

Выполнение примера MapReduce

На диаграмме (рис. 1) показано, как MapReduce будет работать при подсчете слов, прочитанных из текстовых файлов. Все текстовые файлы считываются из HDFS / input и помещаются в поток стандартного вывода для обработки mapper и reducer, чтобы, наконец, результаты были записаны в каталог HDFS с именем /output.

Следующая команда выполнит процесс MapReduce с использованием текстовых файлов, расположенных в /user /hduser/input (HDFS), mapper.py, и reducer.py . Результат будет записан в распределенную файловую систему /user/hduser/output.

hduser@localhost:/examples$ hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-

3.3.0.jar -картограф mapper.py -редуктор reducer.py

-ввод /user/hduser/input/*.txt –вывод

/user/hduser/output



Рисунок 1

Чтобы проверить результаты, следует выполнить.

hduser@localhost: /examples$ hdfs dfs -ls output

Found 2 items

-rw-r--r-- 1 hduser supergroup 0 2020-08-09 00:31 output/_SUCCESS

-rw-r--r-- 1 hduser supergroup 530859 2020-08-09 00:31 output/part-00000

Чтобы показать результаты, мы будем использовать команду cat.

hduser@localhost: /examples$ hdfs dfs -cat output/*


0 64

00 2

000 116

001 1

01 1

02 4
Abulafia 1

Abulfeda 1

Academie 3

Academy 4

Accademia 7

Accademia_ 1

Accep 1

.......

......

....

zoophyte 2

zoophytes 2

zouave 1

zrads 3

zum 1

zur 1

zvith 1

zwanzig 1

zweite 1

Это простой способ (на простом примере) понять, как работает MapReduce.