Кластер Hadoop — нужно ли мне реплицировать свой код на всех машинах перед запуском задания?

#python #hadoop #mapreduce #hadoop-streaming

#python #hadoop #mapreduce #hadoop-потоковая передача

Вопрос:

Это то, что меня смущает, когда я использую пример wordcount, я сохраняю код у мастера и позволяю ему выполнять что-то с подчиненными, и он работает нормально

Но когда я запускаю свой код, он начинает сбоить на подчиненных устройствах, выдавая странные ошибки, такие как

 Traceback (most recent call last):
  File "/app/hadoop/tmp/mapred/local/taskTracker/hduser/jobcache/job_201110250901_0005/attempt_201110250901_0005_m_000001_1/work/./mapper.py", line 55, in <module>
    from src.utilities import utilities
ImportError: No module named src.utilities
java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 1
        at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:311)
        at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:545)
        at org.apache.hadoop.streaming.PipeMapper.map(PipeMapper.java:121)
        at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
        at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:36)
        at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:436)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:372)
        at org.apache.hadoop.mapred.Child$4.run(Child.java:261)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:396)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
        at org.apache.hadoop.mapred.Child.main(Child.java:255)
java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 1
        at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:311)
        at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:545)
        at org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:132)
        at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:57)
        at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:36)
        at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:436)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:372)
        at org.apache.hadoop.mapred.Child$4.run(Child.java:261)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:396)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
        at org.apache.hadoop.mapred.Child.main(Child.java:255)  
  

Поскольку у меня нет кода на пути, я делаю что-то неправильно?

Спасибо

Комментарии:

1. Мне кажется, это проблема с правами пользователя. Вы передавали файлы своему пользователю Hadoop? Можем ли мы видеть лог-результаты задач?

2. Привет, Томас, какие журналы вы хотите видеть, я могу поделиться ими, и с какой машины, пожалуйста, дайте мне знать, спасибо

Ответ №1:

При потоковой передаче Hadoop код / зависимости должны быть скопированы с флагом -file, если код отсутствует на целевой машине. Убедитесь, что файлы map / reduce и их зависимости указаны в потоковой команде Hadoop.

 $HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar 
    -input myInputDirs 
    -output myOutputDir 
    -mapper myPythonScript.py 
    -reducer /bin/wc 
    -file myPythonScript.py 
    -file myDictionary.txt 
  

Комментарии:

1. Правин, я постараюсь дать тебе знать

2. правин, что мне делать, если мой код зависит от многих файлов, например, от 10 других файлов.

3. посмотрите, можете ли вы использовать функцию архивирования потоковой передачи — goo.gl/Dlj1N — в худшем случае вам придется использовать опцию file несколько раз.