我遇到了一个问题,我在 AWS 的 EMR 上的 Hadoop 作业没有保存到 S3。当我在较小的样本上运行该作业时,该作业可以很好地存储输出。当我在完整的数据集上运行相同的命令时,作业再次完成,但在我指定输出的 S3 上没有任何内容。
显然,AWS EMR 在 2009 年存在一个错误,但它已“修复”。
其他人有过这个问题吗?我的集群仍然在线,希望数据被埋在某处的服务器上。如果有人知道我在哪里可以找到这些数据,请告诉我!
更新:当我查看其中一个减速器的日志时,一切看起来都很好:
2012-06-23 11:09:04,437 INFO org.apache.hadoop.fs.s3native.NativeS3FileSystem (main): Creating new file 's3://myS3Bucket/output/myOutputDirFinal/part-00000' in S3
2012-06-23 11:09:04,439 INFO org.apache.hadoop.fs.s3native.NativeS3FileSystem (main): Outputstream for key 'output/myOutputDirFinal/part-00000' writing to tempfile '/mnt1/var/lib/hadoop/s3/output-3834156726628058755.tmp'
2012-06-23 11:50:26,706 INFO org.apache.hadoop.fs.s3native.NativeS3FileSystem (main): Outputstream for key 'output/myOutputDirFinal/part-00000' is being closed, beginning upload.
2012-06-23 11:50:26,958 INFO org.apache.hadoop.fs.s3native.NativeS3FileSystem (main): Outputstream for key 'output/myOutputDirFinal/part-00000' upload complete
2012-06-23 11:50:27,328 INFO org.apache.hadoop.mapred.Task (main): Task:attempt_201206230638_0001_r_000000_0 is done. And is in the process of commiting
2012-06-23 11:50:29,927 INFO org.apache.hadoop.mapred.Task (main): Task 'attempt_201206230638_0001_r_000000_0' done.
当我连接到这个任务的节点时,提到的临时目录是空的。
更新 2:在阅读了 Hadoop 中 Amazon S3 和 S3n 之间的差异之后,我想知道我的问题是否是使用“s3://”而不是“s3n://”作为我的输出路径。在我的小样本(存储良好)和我的全部工作中,我使用了“s3://”。关于这是否可能是我的问题的任何想法?
更新 3:我现在看到在 AWS 的 EMR 上,s3:// 和 s3n:// 都映射到 S3 本机文件系统(AWS EMR 文档)。
更新 4:我又重新运行了两次这项工作,每次都增加服务器和减速器的数量。这两个中的第一个完成了 89/90 减速器输出被复制到 S3。90th 说它根据日志复制成功,但 AWS Support 说文件不存在。他们已将此问题上报给他们的工程团队。我第二次运行更多的减速器和服务器实际上完成了所有数据复制到 S3(谢天谢地!)。一个奇怪的是,一些 reducer 需要 FOREVER 将数据复制到 S3——在这两次新运行中,有一个 reducer 的输出需要 1 或 2 个小时才能复制到 S3,而其他 reducer 最多只需要 10 分钟(文件是 3GB 左右)。我认为这与 EMR 使用的 S3NativeFileSystem 有问题有关(例如长期挂起——我当然要为此付费;以及未上传的所谓成功上传)。我会先上传到本地 HDFS,然后上传到 S3,但我是在这方面也有问题(等待 AWS 工程团队的审查)。
TLDR;使用 AWS EMR 直接存储在 S3 上似乎有问题;他们的工程团队正在调查。