使用Amazon EC2/S3在Hadoop集群上将本地数据复制到HDFS时出现问题

Dee*_*pak 8 cloud hadoop amazon-s3 amazon-ec2 hdfs

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

bin/hadoop jar <program>.jar <arg1> <arg2> <path/to/input/file/on/S3>
Run Code Online (Sandbox Code Playgroud)

它抛出以下错误(不是同时出现.)当我不用'%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.
Run Code Online (Sandbox Code Playgroud)

注意:

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

1116 NameNode
1699 Jps
1180 JobTracker
Run Code Online (Sandbox Code Playgroud)

离开DataNode和TaskTracker.

2)我的密钥包含两个'/'(正斜杠).我用S3 URI中的'%2F'替换它们.

PS:在单个节点上运行时,程序在EC2上运行正常.只有当我启动集群时,才会遇到与从/向HDFS复制数据到/从S3复制数据的问题.而且,distcp做了什么?即使我将数据从S3复制到HDFS,我是否需要分发数据?(我想,HDFS在内部负责处理)

如果您可以引导我使用Amazon EC2/S3解释在hadoop集群上运行Map/reduce程序的链接.那太好了.

问候,

迪帕克.

mrf*_*lip 21

您可能想要使用s3n:// urls,而不是s3:// urls.s3n://表示"一个常规文件,可从外部世界读取,在此S3网址".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>
Run Code Online (Sandbox Code Playgroud)

曾经有一个突出的问题,其中包含一个斜杠的密钥 - URL在某些情况下被解码但在其他情况下则没有.我不知道它是否已被修复,但我确实知道.conf中的键会消失.

其他快捷方式:

  • 您可以使用hadoop filesystem命令最快速地调试问题,这些命令在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命令运行一个mapper-only命令,将树从那里复制到此处.如果要将大量文件复制到HDFS,请使用它.(对于日常使用,hadoop fs -cp src dest工作得很好).
  • 如果您不想要,则无需将数据移动到HDFS.您可以直接从s3中提取所有源数据,根据需要对HDFS或S3进行所有进一步的操作.
  • 如果有一个文件s3n:// myhappybucket/foo/bar和一个"目录"(许多文件带有键s3n:// myhappybucket/foo/bar/something),Hadoop会变得混乱.s3sync命令的一些旧版本将在S3树中留下这样的38字节的turds.
  • 如果您开始看到SocketTimeoutException,请应用HADOOP-6254补丁.我们曾经,而且我们做了,他们就走了.


And*_*avu 4

您还可以使用Apache Whirr来完成此工作流程。查看快速入门指南5 分钟指南以了解更多信息。

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