【发布时间】:2012-06-05 03:29:36
【问题描述】:
我正在使用 Amazon EMR,并且能够使用 CLI 工具创建和运行作业流。作业运行良好。但是,当我尝试将数据从 S3 和名称节点的本地文件系统加载到我的 EMR 集群的 HDFS 时,我遇到了问题。
我想从 S3 填充 HDFS。我正在尝试使用 S3DistCp 工具来执行此操作。我正在运行这个命令:
elastic-mapreduce --jobflow $JOBFLOWID --jar s3://us-east-1.elasticmapreduce/libs/s3distcp/1.0.1/s3distcp.jar --arg --src --arg 's3n://my-bucket/src' --arg --dest --arg 'hdfs:///my-emr-hdfs/dest/'
我在日志中遇到两个可能相关的错误。在 mapreduce 作业输出中,作业完成到 100%,但最终失败:
INFO org.apache.hadoop.mapred.JobClient (main): Map output records=184
ERROR com.amazon.elasticmapreduce.s3distcp.S3DistCp (main): 21 files failed to copy
在名称节点守护程序日志中,我收到了这个异常:
INFO org.apache.hadoop.ipc.Server (IPC Server handler 13 on 9000): IPC Server handler 13 on 9000, call addBlock(/mnt/var/lib/hadoop/tmp/mapred/system/jobtracker.info, DFSClient_-1580223521, null) from xx.xx.xx.xx:xxxxx: error: java.io.IOException: File /mnt/var/lib/hadoop/tmp/mapred/system/jobtracker.info could only be replicated to 0 nodes, instead of 1
java.io.IOException: File /mnt/var/lib/hadoop/tmp/mapred/system/jobtracker.info could only be replicated to 0 nodes, instead of 1 at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1531)
at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:685)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:563)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1388)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1384)
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.ipc.Server$Handler.run(Server.java:1382)
我在创建工作流时设置了 dfs.replication=1。我的节点是 c1.mediums,我试图推入 HDFS 的数据小于 3GB。所以它不应该是一个磁盘外的问题。但也许我错过了什么。
两个问题: 1) 了解 S3DistCp 失败的原因吗? 2)第二个问题有些无关。是否可以创建一个作业流,其中第一个作业是 S3DistCp 作业以使用数据初始化集群?
任何见解表示赞赏。谢谢。
更新:我在 cmets 下面的测试似乎不起作用。以下是日志中的更多信息。
WARN org.apache.hadoop.hdfs.DFSClient (Thread-15): Error Recovery for block null bad datanode[0] nodes == null
WARN org.apache.hadoop.hdfs.DFSClient (Thread-15): Could not get block locations. Source file "/mnt/tmp/mapred/system/jobtracker.info" - Aborting...
WARN org.apache.hadoop.mapred.JobTracker (main): Writing to file hdfs://xx.xx.xx.xx:xxxx/mnt/tmp/mapred/system/jobtracker.info failed!
WARN org.apache.hadoop.mapred.JobTracker (main): FileSystem is not ready yet!
WARN org.apache.hadoop.mapred.JobTracker (main): Failed to initialize recovery manager.
【问题讨论】:
-
EMR 使用已弃用的 hadoop-site.xml 文件启动,看起来它可能正在使用该文件和其中定义的 hadoop.tmp.dir 配置,该配置指向 /tmp。 /tmp 要小得多。我将尝试覆盖该配置。虽然它可能不起作用。 forums.aws.amazon.com/thread.jspa?threadID=32108
-
EMR 上的名称节点守护进程日志几乎总是在日志中出现这些错误时启动。我认为那些是红鲱鱼。您可以在 EMR 步骤中做任何您想做的事情,只要您在 jar 中有一个 main 方法供 Hadoop 调用。但是直接使用 s3n://(原生 s3 文件系统)作为地图输入有什么问题呢?
-
感谢@JudgeMental 的这一见解。看来我所有的数据文件都可以进入 EMR HDFS。但是 s3distcp 作业每次都会进入 FAILED 状态,所以看到这一点令人反感。
-
@JudgeMental 关于您的 s3n 问题,我的工作流程有很多工作,大约 20 个,其中一些每天运行多次。所以我倾向于保持一组 10 个 CORE 实例 24/7,以避免使用 s3n 来回传输数据(需要更多时间)。上述错误让我想尽量减少使用 s3 传输。但也许 s3distcp 的速度和 s3 作为存储的可靠性超过了传输成本?
-
我在后面的工作步骤中遇到了同样的错误,并意识到数据节点上的存储不是他们记录的那样。它看起来更像是一个实际的存储空间问题。我在这里发布了一个问题:stackoverflow.com/questions/10856190/…