Как использовать файл в потоковом задании Hadoop с помощью python?

Я хочу прочитать список из файла в моем потоковом задании hadoop. Вот мой простой mapper.py:

#!/usr/bin/env python

import sys
import json

def read_file():
    id_list = []
    #read ids from a file
    f = open('../user_ids','r')
    for line in f:
        line = line.strip()
        id_list.append(line)
    return id_list

if __name__ == '__main__':
    id_list = set(read_file())
    # input comes from STDIN (standard input)
    for line in sys.stdin:
        # remove leading and trailing whitespace
        line = line.strip()
        line = json.loads(line)
        user_id = line['user']['id']
        if str(user_id) in id_list:
            print '%st%s' % (user_id, line)

а вот мой reducer.py

#!/usr/bin/env python

from operator import itemgetter
import sys

current_id = None
current_list = []
id = None

# input comes from STDIN
for line in sys.stdin:
    # remove leading and trailing whitespace
    line = line.strip()

    # parse the input we got from mapper.py
    id, line = line.split('t', 1)

    # this IF-switch only works because Hadoop sorts map output
    # by key (here: word) before it is passed to the reducer
    if current_id == id:
        current_list.append(line)
    else:
        if current_id:
            # write result to STDOUT
            print '%st%s' % (current_id, current_list)
        current_id = id
        current_list = [line]

# do not forget to output the last word if needed!
if current_id == id:
        print '%st%s' % (current_id, current_list)

теперь, чтобы запустить его, я говорю:

hadoop jar contrib/streaming/hadoop-streaming-1.1.1.jar -file ./mapper.py 
    -mapper ./mapper.py -file ./reducer.py -reducer ./reducer.py 
    -input test/input.txt  -output test/output -file '../user_ids' 

задание начинает выполняться:

13/11/07 05:04:52 INFO streaming.StreamJob:  map 0%  reduce 0%
13/11/07 05:05:21 INFO streaming.StreamJob:  map 100%  reduce 100%
13/11/07 05:05:21 INFO streaming.StreamJob: To kill this job, run:

я получаю сообщение об ошибке:

job not successful. Error: # of failed Map Tasks exceeded allowed limit. FailedCount: 1.         LastFailedTask: task_201309172143_1390_m_000001
13/11/07 05:05:21 INFO streaming.StreamJob: killJob...

I, когда я не читаю идентификаторы из файла ../user_ids это не дает мне никаких ошибок. Я думаю, проблема в том, что он не может найти мой ..файл /ид_пользователя. Я также использовал расположение в hdfs и до сих пор не работает. Спасибо за помощь.

2 ответов


hadoop jar contrib/streaming/hadoop-streaming-1.1.1.jar -file ./mapper.py \
  -mapper ./mapper.py -file ./reducer.py -reducer ./reducer.py \
  -input test/input.txt  -output test/output -file '../user_ids'

делает ../user_ids существует в локальном пути к файлу при выполнении задания? Если это так, вам нужно изменить код картографа, чтобы учесть тот факт, что этот файл будет доступен в локальном рабочем каталоге картографа во время выполнения:

f = open('user_ids','r')

попробуйте указать полный путь к файлу или при выполнении команды hadoop убедитесь, что вы находитесь в том же каталоге, в котором файл user_ids присутствует