我正在尝试使用EMR中的工作流将文件从s3复制到hdfs,当我运行以下命令时,作业流程成功启动,但在尝试将文件复制到HDFS时出现错误。我需要设置任何输入文件权限?
命令:
./ elastic-mapreduce --jobflow j-35D6JOYEDCELA --jar s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar --args'-- src,s3: // odsh /输入/, - DEST,HDFS:///用户
输出
任务TASKID =“task_201301310606_0001_r_000000”TASK_TYPE =“REDUCE”TASK_STATUS =“FAILED”FINISH_TIME =“1359612576612”ERROR =“java.lang.RuntimeException:Reducer任务无法复制1个文件:s3:// odsh / input / GL_01112_20121019 .dat等 在com.amazon.external.elasticmapreduce.s3distcp.CopyFilesReducer.close(CopyFilesReducer.java:70) 在org.apache.hadoop.mapred.ReduceTask.runOldReducer(ReduceTask.java:538) 在org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:429) 在org.apache.hadoop.mapred.Child $ 4.run(Child.java:255) at java.security.AccessController.doPrivileged(Native Method) 在javax.security.auth.Subject.doAs(Subject.java:396) 在org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1132) 在org.apache.hadoop.mapred.Child.main(Child.java:249)
答案 0 :(得分:6)
我得到了同样的例外。当CopyFilesReducer
使用多个CopyFilesRunable
实例从S3下载文件时,看起来该错误是由竞争条件引起的。问题是它在多个线程中使用相同的临时目录,并且线程在完成后删除临时目录。因此,当一个线程在另一个线程之前完成时,它会删除另一个线程仍在使用的临时目录。
我已向AWS报告此问题,但同时您可以通过在作业配置中将变量s3DistCp.copyfiles.mapper.numWorkers
设置为1来强制reducer使用单个线程来解决此问题。
答案 1 :(得分:2)
我看到同样的问题是由竞争条件造成的。通过-Ds3DistCp.copyfiles.mapper.numWorkers=1
有助于避免此问题。
我希望亚马逊修复这个错误。
答案 2 :(得分:2)
调整工人的数量并不适合我; s3distcp在小型/中型实例上总是失败。增加任务作业的堆大小(通过-D mapred.child.java.opts=-Xmx1024m
)解决了它。
使用示例:
hadoop jar /home/hadoop/lib/emr-s3distcp-1.0.jar
-D mapred.child.java.opts=-Xmx1024m
--src s3://source/
--dest hdfs:///dest/ --targetSize 128
--groupBy '.*\.([0-9]+-[0-9]+-[0-9]+)-[0-9]+\..*'
--outputCodec gzip
答案 3 :(得分:1)
问题在于地图-减少作业失败。映射器执行完美,但是化简器在群集内存中造成瓶颈。
为我解决了这个问题 -Dmapreduce.job.reduces = 30 如果仍然失败,请尝试
将其减少到20,即 -Dmapreduce.job.reduces = 20
为了便于理解,我将添加整个参数:
在AWS集群中:
JAR位置:command-runner.jar
主类:无
参数:s3-dist-cp -Dmapreduce.job.reduces = 30 --src = hdfs:/// user / ec2-user / riskmodel-output --dest = s3:/ / dev-quant-risk-model / 2019_03_30_SOM_EZ_23Factors_Constrained_CSR_Stats / output --multipartUploadChunkSize = 1000
失败时采取的措施:继续
在脚本文件中:
aws --profile $ AWS_PROFILE emr添加步骤--cluster-id $ CLUSTER_ID --steps类型= CUSTOM_JAR,Jar ='command-runner.jar',Name =“将模型输出复制到S3”,ActionOnFailure = CONTINUE ,Args = [s3-dist-cp,-Dmapreduce.job.reduces = 20,-src = $ OUTPUT_BUCKET,-dest = $ S3_OUTPUT_LARGEBUCKET,-multipartUploadChunkSize = 1000]