Потоковая передача Hadoop — это утилита, поставляемая с дистрибутивом Hadoop. Эта утилита позволяет создавать и запускать задания Map / Reduce с любым исполняемым файлом или скриптом в качестве средства отображения и / или редуктора.
Пример использования Python
Для потоковой передачи Hadoop мы рассматриваем проблему подсчета слов. Любая работа в Hadoop должна иметь две фазы: маппер и редуктор. Мы написали коды для картографа и редуктора в скрипте Python для запуска его под Hadoop. То же самое можно написать на Perl и Ruby.
Код фазы картографирования
!/usr/bin/python import sys # Input takes from standard input for myline in sys.stdin: # Remove whitespace either side myline = myline.strip() # Break the line into words words = myline.split() # Iterate the words list for myword in words: # Write the results to standard output print '%s\t%s' % (myword, 1)
Убедитесь, что у этого файла есть разрешение на выполнение (chmod + x / home / expert / hadoop-1.2.1 / mapper.py).
Код фазы редуктора
#!/usr/bin/python from operator import itemgetter import sys current_word = "" current_count = 0 word = "" # Input takes from standard input for myline in sys.stdin: # Remove whitespace either side myline = myline.strip() # Split the input we got from mapper.py word, count = myline.split('\t', 1) # Convert count variable to integer try: count = int(count) except ValueError: # Count was not a number, so silently ignore this line continue if current_word == word: current_count += count else: if current_word: # Write result to standard output print '%s\t%s' % (current_word, current_count) current_count = count current_word = word # Do not forget to output the last word if needed! if current_word == word: print '%s\t%s' % (current_word, current_count)
Сохраните коды мапперов и редукторов в mapper.py и reducer.py в домашнем каталоге Hadoop. Убедитесь, что эти файлы имеют разрешение на выполнение (chmod + x mapper.py и chmod + x reducer.py). Поскольку python чувствителен к отступам, такой же код можно скачать по ссылке ниже.
Выполнение программы WordCount
$ $HADOOP_HOME/bin/hadoop jar contrib/streaming/hadoop-streaming-1. 2.1.jar \ -input input_dirs \ -output output_dir \ -mapper <path/mapper.py \ -reducer <path/reducer.py
Где «\» используется для продолжения строки для четкого чтения.
Например,
./bin/hadoop jar contrib/streaming/hadoop-streaming-1.2.1.jar -input myinput -output myoutput -mapper /home/expert/hadoop-1.2.1/mapper.py -reducer /home/expert/hadoop-1.2.1/reducer.py
Как работает потоковая передача
В приведенном выше примере и преобразователь, и преобразователь являются сценариями Python, которые считывают ввод из стандартного ввода и выводят вывод в стандартный вывод. Утилита создаст задание Map / Reduce, отправит задание в соответствующий кластер и будет отслеживать ход выполнения задания до его завершения.
Когда для мапперов указан скрипт, каждая задача маппера будет запускать скрипт как отдельный процесс при инициализации маппера. Когда задача mapper выполняется, она преобразует свои входные данные в строки и передает эти строки в стандартный ввод (STDIN) процесса. В то же время преобразователь собирает линейно-ориентированные выходные данные из стандартного вывода (STDOUT) процесса и преобразует каждую строку в пару ключ / значение, которая собирается в качестве выходных данных преобразователя. По умолчанию префикс строки до первого символа табуляции является ключом, а остальная часть строки (исключая символ табуляции) будет значением. Если в строке нет символа табуляции, тогда клавишей считается вся строка, а значение равно нулю. Однако, это может быть настроено, согласно одной потребности.
Если для редукторов указан сценарий, каждая задача редуктора запускает сценарий как отдельный процесс, а затем инициализируется редуктор. По мере выполнения задачи редуктора она преобразует свои пары ключ / значение ввода в строки и передает эти строки в стандартный ввод (STDIN) процесса. Между тем, редуктор собирает линейно-ориентированные выходы из стандартного выхода (STDOUT) процесса, преобразует каждую строку в пару ключ / значение, которая собирается как выход редуктора. По умолчанию префикс строки до первого символа табуляции является ключом, а остальная часть строки (исключая символ табуляции) является значением. Однако, это может быть настроено согласно определенным требованиям.