Java 需要帮助使用存储在amazon s3上的数据运行Map reduce WordCount作业吗

Java 需要帮助使用存储在amazon s3上的数据运行Map reduce WordCount作业吗,java,hadoop,amazon-s3,mapreduce,Java,Hadoop,Amazon S3,Mapreduce,我正试图在一个文本文件上运行MapReduceWordCount作业,该文件已存储在AmazonS3的存储桶中。我已经为map reduce框架设置了与Amazon通信所需的所有身份验证,但是我一直在运行这个错误。知道为什么会这样吗 13/01/20 13:22:15 ERROR security.UserGroupInformation: PriviledgedActionException as:root cause:org.apache.hadoop.mapred.InvalidInput

我正试图在一个文本文件上运行MapReduceWordCount作业,该文件已存储在AmazonS3的存储桶中。我已经为map reduce框架设置了与Amazon通信所需的所有身份验证,但是我一直在运行这个错误。知道为什么会这样吗

13/01/20 13:22:15 ERROR security.UserGroupInformation:
PriviledgedActionException as:root
cause:org.apache.hadoop.mapred.InvalidInputException: Input path does
not exist: s3://name-bucket/test.txt
Exception in thread "main"
org.apache.hadoop.mapred.InvalidInputException: Input path does not
exist: s3://name-bucket/test.txt
    at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:197)
    at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:208)
    at org.apache.hadoop.mapred.JobClient.writeOldSplits(JobClient.java:989)
    at org.apache.hadoop.mapred.JobClient.writeSplits(JobClient.java:981)
    at org.apache.hadoop.mapred.JobClient.access$600(JobClient.java:174)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:897)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:850)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:416)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
    at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:850)
    at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:824)
    at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1261)
    at org.myorg.WordCount.main(WordCount.java:55)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:156)

实际上,您必须将协议
s3
替换为
s3n
。这是两个具有不同属性的不同文件系统:

  • s3n是s3本机文件系统:用于在s3上读取和写入常规文件的本机文件系统。这个文件系统的优点是,您可以访问S3上使用其他工具编写的文件。相反,其他工具可以访问使用Hadoop编写的文件。缺点是S3对文件大小施加了5GB的限制。由于这个原因,它不适合替代HDFS(它支持非常大的文件)
  • s3是块文件系统:由s3支持的基于块的文件系统。文件以块的形式存储,就像在HDFS中一样。这样可以有效地实施重命名。这个文件系统要求您为文件系统指定一个bucket—您不应该使用包含文件的现有bucket,也不应该将其他文件写入同一个bucket。这个文件系统存储的文件可以大于5GB,但它们不能与其他S3工具互操作
()


在您的情况下,您的bucket可能使用的是
s3n
文件系统,我相信这是默认的,我使用的大多数bucket也是
s3n
。因此,您应该使用
s3n://name bucket/test.txt

您确定您的输入存在并且输入了正确的bucket名称吗?你试过用“s3n”而不是“s3”吗?多亏了这一点,我在输入url和hadoop-site.xml中将s3替换为s3n。你知道为什么s3不起作用而s3起作用吗?我在回答中补充了更多细节。