8

我在 Amazon EC2 上设置了一个包含 5 个节点的 Hadoop 集群。现在,当我登录到主节点并提交以下命令时

bin/hadoop jar <program>.jar <arg1> <arg2> <path/to/input/file/on/S3>

它会引发以下错误(不是同时。)当我不将斜杠替换为“%2F”时会引发第一个错误,而当我将斜杠替换为“%2F”时会引发第二个错误:

1) Java.lang.IllegalArgumentException: Invalid hostname in URI S3://<ID>:<SECRETKEY>@<BUCKET>/<path-to-inputfile>
2) org.apache.hadoop.fs.S3.S3Exception: org.jets3t.service.S3ServiceException: S3 PUT failed for '/' XML Error Message: The request signature we calculated does not match the signature you provided. check your key and signing method.

笔记:

1)当我提交 jps 以查看 Master 上正在运行哪些任务时,它只是显示

1116 NameNode
1699 Jps
1180 JobTracker

离开 DataNode 和 TaskTracker。

2)我的密钥包含两个“/”(正斜杠)。我将它们替换为 S3 URI 中的“%2F”。

PS:该程序在单节点上运行时在 EC2 上运行良好。只有在我启动集群时,我才会遇到与将数据从 S3 复制到 HDFS 或从 HDFS 复制到 HDFS 相关的问题。而且, distcp 是做什么的?即使在我将数据从 S3 复制到 HDFS 之后,我是否还需要分发数据?(我想,HDFS 会在内部处理这个问题)

如果您可以将我引导到一个链接,该链接解释了使用 Amazon EC2/S3 在 hadoop 集群上运行 Map/reduce 程序。那太好了。

问候,

迪帕克。

4

4 回答 4

21

您可能想使用 s3n:// 网址,而不是 s3:// 网址。s3n:// 表示“在这个 S3 url 上可以从外部世界读取的常规文件”。s3:// 是指映射到 S3 存储桶的 HDFS 文件系统。

为避免访问密钥的 URL 转义问题(并使生活更轻松),请将它们放入/etc/hadoop/conf/core-site.xml文件中:

<property>
  <name>fs.s3.awsAccessKeyId</name>
  <value>0123458712355</value>
</property>
<property>
  <name>fs.s3.awsSecretAccessKey</name>
  <value>hi/momasgasfglskfghaslkfjg</value>
</property>
<property>
  <name>fs.s3n.awsAccessKeyId</name>
  <value>0123458712355</value>
</property>
<property>
  <name>fs.s3n.awsSecretAccessKey</name>
  <value>hi/momasgasfglskfghaslkfjg</value>
</property>

曾经有一个悬而未决的问题是带有斜杠的密钥——URL 在某些情况下被解码,但在其他情况下却没有。我不知道它是否已修复,但我知道使用 .conf 中的键可以解决此问题。

其他快手:

  • 您可以使用 hadoop 文件系统命令最快速地调试您的问题,这些命令在 s3n://(和 s3://)url 上工作得很好。尝试hadoop fs -cp s3n://myhappybucket/hadoop fs -cp s3n://myhappybucket/happyfile.txt /tmp/dest1什至hadoop fs -cp /tmp/some_hdfs_file s3n://myhappybucket/will_be_put_into_s3
  • distcp命令运行仅映射器命令以将树从那里复制到这里。如果您想将大量文件复制到 HDFS,请使用它。(对于日常使用,hadoop fs -cp src dest效果很好)。
  • 如果您不想,您不必将数据移动到 HDFS。您可以直接从 s3 中提取所有源数据,并根据需要对 HDFS 或 S3 进行所有进一步的操作。
  • 如果有一个文件 s3n://myhappybucket/foo/bar 和一个“目录”(许多文件的键为 s3n://myhappybucket/foo/bar/something),Hadoop 可能会变得混乱。一些旧版本的 s3sync 命令只会在 S3 树中留下这样的 38 字节垃圾。
  • 如果您开始看到SocketTimeoutException's,请应用 HADOOP-6254 的补丁。我们是,我们做到了,他们走了。
于 2010-06-13T18:30:47.477 回答
4

你也可以为这个工作流使用Apache Whirr。查看快速入门指南5 分钟指南了解更多信息。

免责声明:我是提交者之一。

于 2011-06-10T09:46:35.960 回答
3

尝试使用 Amazon Elastic MapReduce。它消除了配置 hadoop 节点的需要,您可以按照您期望的方式访问您的 s3 帐户中的对象。

于 2010-06-15T22:05:55.927 回答
0

采用

-Dfs.s3n.awsAccessKeyId=<your-key> -Dfs.s3n.awsSecretAccessKey=<your-secret-key>

例如

hadoop distcp -Dfs.s3n.awsAccessKeyId=<your-key> -Dfs.s3n.awsSecretAccessKey=<your-secret-key> -<subsubcommand> <args>

或者

hadoop fs -Dfs.s3n.awsAccessKeyId=<your-key> -Dfs.s3n.awsSecretAccessKey=<your-secret-key> -<subsubcommand> <args>
于 2014-05-08T16:17:41.247 回答