2013-09-13 5 views
1

Потоковая передача Hadoop делает доступным имя файла для каждой задачи карты через переменную окружения.Как получить входное имя файла Hadoop из mapper?

Python:

os.environ["map.input.file"] 

Java:

System.getenv(“map.input.file”). 

Как насчет Ruby?

mapper.rb 
#!/usr/bin/env ruby 

STDIN.each_line do |line| 
    line.split.each do |word| 
    word = word[/([a-zA-Z0-9]+)/] 
    word = word.gsub(/ /,"") 
    puts [word, 1].join("\t") 
    end 
end 

puts ENV['map.input.file'] 

ответ

0

Как насчет:

ENV['map.input.file'] 

Рубин позволяет назначить ENV хэш так же легко:

ENV['map.input.file'] = '/path/to/file' 
+0

Будет ли он работать локально, если я делаю $ cat text.txt | ruby mapper.rb | сортировать | ruby reducer.rb –

+0

Почему бы не попробовать его и посмотреть. Использование Ruby 'ENV' встроено в язык. Если «map.input.file» установлен в среде, было бы легко проверить. 'cat text.txt | ruby mapper.rb | сортировать | ruby reducer.rb' - это рабочий процесс, который должен быть написан все в одном скрипте Ruby. –

+0

хорошо, скрипты работают, но возвращает пустую строку ... –

0

Все переменные JobConf помещаются в переменные окружения с помощью Hadoop-потоковой передачи. Имена переменных сделаны «безопасными», конвертируя любой символ, но не в 0-9 A-Z a-z в _.

Так map.input.file => map_input_file

Try: puts ENV['map_input_file']

0

Используя вход из оп, я попытался картографа:

#!/usr/bin/python 
import os 
file_name = os.getenv('map_input_file') 
print file_name 

и стандартный WordCount редуктор с помощью команды:

hadoop fs -rmr /user/itsjeevs/wc && 
hadoop jar $STRMJAR -files /home/jejoseph/wc_mapper.py,/home/jejoseph/wc_reducer.py \ 
    -mapper wc_mapper.py \ 
    -reducer wc_reducer.py \ 
    -numReduceTasks 10 \ 
    -input "/data/*" \ 
    -output wc 

с ошибкой:

16/03/10 15:21:32 INFO mapreduce.Job: Task Id : attempt_1455931799889_822384_m_000043_0, Status : FAILED 
Error: java.io.IOException: Stream closed 
    at java.lang.ProcessBuilder$NullOutputStream.write(ProcessBuilder.java:434) 
    at java.io.OutputStream.write(OutputStream.java:116) 
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122) 
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) 
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:126) 
    at java.io.DataOutputStream.write(DataOutputStream.java:107) 
    at org.apache.hadoop.streaming.io.TextInputWriter.writeUTF8(TextInputWriter.java:72) 
    at org.apache.hadoop.streaming.io.TextInputWriter.writeValue(TextInputWriter.java:51) 
    at org.apache.hadoop.streaming.PipeMapper.map(PipeMapper.java:106) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) 
    at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:34) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:450) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) 
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:415) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628) 
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 

16/03/10 15:21:32 INFO mapreduce.Job: Task Id : attempt_1455931799889_822384_m_000077_0, Status : FAILED 
Error: java.io.IOException: Broken pipe 
    at java.io.FileOutputStream.writeBytes(Native Method) 
    at java.io.FileOutputStream.write(FileOutputStream.java:345) 
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122) 
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) 
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:126) 
    at java.io.DataOutputStream.write(DataOutputStream.java:107) 
    at org.apache.hadoop.streaming.io.TextInputWriter.writeUTF8(TextInputWriter.java:72) 
    at org.apache.hadoop.streaming.io.TextInputWriter.writeValue(TextInputWriter.java:51) 
    at org.apache.hadoop.streaming.PipeMapper.map(PipeMapper.java:106) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) 
    at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:34) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:450) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) 
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:415) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628) 
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 

Не уверен, что происходит.

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