Учебники

Hadoop — потоковое

Потоковая передача 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) процесса, преобразует каждую строку в пару ключ / значение, которая собирается как выход редуктора. По умолчанию префикс строки до первого символа табуляции является ключом, а остальная часть строки (исключая символ табуляции) является значением. Однако, это может быть настроено согласно определенным требованиям.