Как использовать файл в потоковом задании 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 присутствует