Я хочу включить скомпилированные протоклассы в свой mapreduce и решил, что самый простой способ сделать это - сжать необходимые файлы python как tar.gz и загрузить их в S3.
Я наткнулся на этот ответ stackoverflow и выполнил следующие шаги для создания файла архива.Затем я использовал аргумент -cacheArchive
для распространения файла по кластерам.
Использование boto для запуска задания EMR выглядит следующим образом:
Steps=[{
'Name': '...',
'ActionOnFailure': 'TERMINATE_CLUSTER',
'HadoopJarStep': {
'Jar': 'command-runner.jar',
'Args':
['hadoop-streaming',
'-files', 's3://myBucket/mapper.py,'
's3://myBucket/reducer.py',
'-mapper', 'mapper.py',
'-input', 's3://myBucket/input/',
'-output', 's3://myBucket/output',
'-reducer', 'reducer.py',
'-cacheArchive', 's3://myBucket/required.tgz#required']
}
}]
mapper.py
#!/usr/bin/env python
import sys
sys.path.append('./required')
from primitives_pb2 import Variant
for line in sys.stdin:
# DO THINGS
Я получаю следующую ошибку, когда EMR.
Ошибка: java.lang.RuntimeException: PipeMapRed.waitOutputThreads (): сбой подпроцесса с кодом 1 в org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads (PipeMapRed.java:332) в org.apache.hadoop.streaming.PipeMapRed.mapRedFinished (PipeMapRed.java:545) в org.apache.hadoop.streaming.PipeMapper.30ava: Pipe) в org.apache.hadoop.mapred.MapRunner.run (MapRunner.java:81) в org.apache.hadoop.streaming.PipeMapRunner.run (PipeMapRunner.java:34) в org.apache.hadoop.mapred.MapTask.runOldMapper (MapTask.java:452) в org.apache.hadoop.mapred.MapTask.run (MapTask.java:344) в org.apache.hadoop.mapred.YarnChild $ 2.run (YarnChild.java:171) в Java.security.AccessController.doPrivileged (собственный метод) в javax.security.auth.Subject.doAs (Subject.java:415) в org.apache.hadoop.security.UserGroupInformation.doAs (UserGroupInformation.java:1628) в org.apache.hadoop.mapred.YarnChild.main (YarnChild.java:166)
Кажется, что mapreduce работает нормально при локальном запуске, поэтому я не верю, что произошла ошибка с тем, как я написал mapper.py
или reducer.py
.