1

Я написал Mapper и Reducer в Python и успешно выполнил его на Elastic MapReduce (EMR) Amazon, используя Hadoop Streaming.Объединить выходные файлы задания MapReduce

Папка конечного результата содержит выход в трех разных файлах part-00000, part-00001 и part-00002. Но мне нужен вывод как один файл. Есть ли способ, которым я могу это сделать?

Вот мой код Mapper:

#!/usr/bin/env python 

import sys 

for line in sys.stdin: 
    line = line.strip() 
    words = line.split() 
    for word in words: 
     print '%s\t%s' % (word, 1) 

И вот мой код Reducer

#!/usr/bin/env python 

from operator import itemgetter 
import sys 

current_word = None 
current_count = 0 
word = None 
max_count=0 

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: 
     # write result to STDOUT 
      if current_word[0] != '@': 
       print '%s\t%d' % (current_word, current_count) 
       if count > max_count: 
        max_count = count 
    current_count = count 
    current_word = word 

if current_word == word: 
    print '%s\t%s' % (current_word, current_count) 

мне нужен выход это как один файл.

+0

Не можете ли вы просто открыть три файла и объединить их в один выходной файл? –

+0

Вот что я делаю. Но мне бы хотелось, если бы я смог получить один выходной файл после фазы «Уменьшить». –

+0

Не могли бы вы просто (* Linux/UNIX *): '' cat part-00000 part-00001 part-00002> output''? –

ответ

1

очень простой способ сделать это (предполагая Linux/UNIX системного):

$ cat part-00000 part-00001 part-00002 > output 
+2

Или даже лучше, 'cat part- *> output' – SuperSaiyan

+0

Я думал, что было бы лучше быть более явным и не предполагать, что все они называются '' part- * '' :) –

0

Используйте single reduce для небольших наборов данных/обработки или использовать getmerge опции на выходные файлах работы.

+0

Но сама работа работает на Elastic MapReduce. Что тогда? –

+0

EMR или нет, будет поддерживать варианты, указанные в ответе. –

0

Мое решение вышеуказанной проблемы в том, чтобы выполнить следующую команду HDFS:

hadoop fs -getmerge /hdfs/path local_file 

где /HDFS/путь представляет собой путь, содержащий все части (часть - *****) от выход работы. Опция -getmerge для hadoop fs объединит весь вывод задания в один файл в нашей локальной файловой системе.

0

У меня была такая же проблема в последнее время, на самом деле объединитель должен выполнить эту задачу, но я не мог каким-то образом реализовать. Что я сделал?

  1. шаг1: mapper1.py reducer1.py

    вход: s3: //../data/

    выход s3: //..../small_output/

  2. step2: mapper2.py reducer2.py

    вход s3: //../data/

    выход: s3: //..../output2/

  3. step3: mapper3.py reducer3.py

    вход: s3: //../output2/

    выход: s3: //..../final_output/

Я предполагаю, что нам нужен вывод step1 как один файл на шаге 3.

В верхней части mapper2.py есть этот код;

if not os.path.isfile('/tmp/s3_sync_flag'): 
    os.system('touch /tmp/s3_sync_flag') 
    [download files to /tmp/output/] 
    os.system('cat /tmp/output/part* > /tmp/output/all') 

, если блок, проверяет выполнение нескольких копирайтеров.

Смежные вопросы