2015-11-13 6 views
1

У меня есть карта сократить программу работы, чтобы прочитать HDFS файл, как показано ниже:Как загрузить данные из HDFS sequencefile в питона

hadoop jar /opt/mapr/hadoop/hadoop-0.20.2/contrib/streaming/hadoop-0.20.2-dev-streaming.jar -Dmapred.reduce.tasks=1000 -file $homedir/mapper.py -mapper $homedir/mapper.py -file $homedir/reducer.py -reducer $homedir/reducer.py -input /user/data/* -output /output/ 2> output.text 

Все, что будет подтвердить, путь/пользователь/данные/* есть папки, включая файлы,/user/data/* будут итерации всех файлов под всеми подпапками?

Текстовый файл HDFS содержит строку JSON для каждой строки так, картограф читать файл, как показано ниже:

for line in sys.stdin: 
    try: 
     object = json.loads(line) 

Но владелец HDFS изменил файл с текстом в sequencefile. и я обнаружил, что карта уменьшает выход программы на множество файлов с нулевым размером, что, вероятно, означает, что он не смог прочитать файл с HDFS.

Что следует изменить для кода, чтобы я мог читать из файла последовательности? У меня также есть внешняя таблица HIVE для выполнения агрегирования и сортировки на основе этого вывода mapreduce, а HIVE был STORED AS TEXTFILE раньше, должен ли я перейти на STORED AS SEQUENCEFILE?

Спасибо,

ответ

2

Посмотрите this

Run ниже питона файла перед вашей MapReduce работы
вход: файл последовательность
вывод: ваш вход MapReduce

import sys 

from hadoop.io import SequenceFile 

if __name__ == '__main__': 
    if len(sys.argv) < 3: 
     print 'usage: SequenceFileReader <filename> <output>' 
    else: 
     reader = SequenceFile.Reader(sys.argv[1]) 

    key_class = reader.getKeyClass() 
    value_class = reader.getValueClass() 

    key = key_class() 
    value = value_class() 

    #reader.sync(4042) 
    position = reader.getPosition() 
    f = open(sys.argv[2],'w') 
    while reader.next(key, value): 
     f.write(value.toString()+'\n') 
    reader.close() 
    f.close() 

Вам не придется менять исходный файл python.

+0

Спасибо, должен ли я изменить команду задания потока hadoop, чтобы запустить эту карту, уменьшить скрипт python? Первый код, который я вставил. – Terry

+0

вам не придется менять команду отправки задания, если ваш входной каталог тот же. Вам нужно будет изменить свой mapper.py –

+0

Спасибо. Я использовал поток hadoop для обработки, а mapper читает из stdint, но ваш код читается из файла напрямую (reader = SequenceFile.Reader («ваш_файл_path») ) в коде. Как прочитать файл последовательности из stdin? – Terry