Невозможно прочитать файлы Hadoop Sequence через стандартный ввод с помощью потоковой карты Python Map-Reduce на AWS

Я пытаюсь запустить простую задачу уменьшения количества слов на карте Amazon Elastic Map Reduce, но на выходе получается тарабарщина. Входной файл является частью файлов общего сканирования, которые представляют собой файлы последовательностей Hadoop. Предполагается, что файл представляет собой извлеченный текст (удаленный из html) с просканированных веб-страниц.

Мой шаг AWS Elastic MapReduce выглядит следующим образом:

Mapper: s3://com.gpanterov.scripts/mapper.py
Reducer: s3://com.gpanterov.scripts/reducer.py
Input S3 location: s3://aws-publicdatasets/common-crawl/parse-output/segment/1341690169105/textData-00112
Output S3 location: s3://com.gpanterov.output/job3/

Задание выполняется успешно, однако на выходе получается тарабарщина. Есть только странные символы и вообще нет слов. Я предполагаю, что это связано с тем, что файлы последовательности хаупов не могут быть прочитаны стандартно? Однако как запустить задание mr для такого файла? Должны ли мы сначала преобразовать файлы последовательности в текстовые файлы?

Первые несколько строк из part-00000 выглядят так:

'\x00\x00\x87\xa0 was found 1 times\t\n'
'\x00\x00\x8e\x01:\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x05\xc1=K\x02\x01\x00\x80a\xf0\xbc\xf3N\xbd\x0f\xaf\x145\xcdJ!#T\x94\x88ZD\x89\x027i\x08\x8a\x86\x16\x97lp0\x02\x87 was found 1 times\t\n'

Вот мой маппер:

#!/usr/bin/env python

import sys

for line in sys.stdin:
    words = line.split()
    for word in words:
      print word + "\t" + str(1)

И мой редуктор:

#!/usr/bin/env python

import sys

def output(previous_key, total):
    if previous_key != None:
      print previous_key + " was found " + str(total) + " times"

previous_key = None
total = 0

for line in sys.stdin:
    key, value = line.split("\t", 1)
    if key != previous_key:
      output(previous_key, total)
      previous_key = key
      total = 0 
    total += int(value)

output(previous_key, total)

Во входном файле нет ничего плохого. На локальной машине я запустил hadoop fs -text textData-00112 | less, и это возвращает чистый текст с веб-страниц. Мы высоко ценим любой вклад в то, как запустить задание python Streaming mapreduce для этих типов входных файлов (файлы последовательностей Hadoop с общим сканированием).


person gpanterov    schedule 19.01.2014    source источник


Ответы (2)


Вам необходимо предоставить SequenceFileAsTextInputFormat в качестве inputformat для потоковой передачи jar Hadoop.

Я никогда не использовал amazon aws mapreduce, но при обычной установке Hadoop это было бы сделано так:

HADOOP=$HADOOP_HOME/bin/hadoop
$HADOOP jar $HADOOP_HOME/contrib/streaming/hadoop-*-streaming.jar \
  -input <input_directory>
  -output <output_directory> \
  -mapper "mapper.py" \
  -reducer "reducer.py" \
  -inputformat SequenceFileAsTextInputFormat
person Sunny Nanda    schedule 19.01.2014

Предложение Санни Нанды решило проблему. Добавление -inputformat SequenceFileAsTextInputFormat в поле дополнительных аргументов в API эластичной карты aws сработало, и результат работы соответствует ожидаемому.

person gpanterov    schedule 19.01.2014