8

Amazon EC2 で 5 つのノードを含む Hadoop クラスターをセットアップしました。ここで、マスター ノードにログインして次のコマンドを送信すると、

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

次のエラーがスローされます (同時にではありません)。最初のエラーはスラッシュを '%2F' に置き換えないとスローされ、2 番目のエラーはスラッシュを '%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 を送信したところ、表示されました

1116 NameNode
1699 Jps
1180 JobTracker

DataNode と TaskTracker を残します。

2) 私の秘密鍵には 2 つの「/」(スラッシュ) が含まれています。そして、S3 URI でそれらを「%2F」に置き換えます。

PS: 単一ノードで実行すると、プログラムは EC2 で正常に実行されます。クラスターを起動したときにのみ、HDFS との間で S3 との間でデータをコピーすることに関連する問題が発生します。そして、distcp は何をしますか? S3 から HDFS にデータをコピーした後でも、データを配布する必要がありますか? (HDFS が内部で処理すると思っていました)

Amazon EC2/S3 を使用して Hadoop クラスターで Map/reduce プログラムを実行する方法を説明するリンクに誘導していただければ幸いです。それは素晴らしいことです。

よろしく、

ディーパック。

4

4 に答える 4

21

おそらく、s3:// URL ではなく、s3n:// URL を使用する必要があります。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 のキーを使用すると、これがなくなることはわかっています。

その他の急ごしらえ:

  • s3n:// (および s3://) URL で正常に機能する hadoop ファイルシステム コマンドを使用して、問題を最も迅速にデバッグできます。または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 バイトの糞がそのまま残ります。
  • が表示され始めた場合は、 HADOOP-6254 のパッチを適用してSocketTimeoutExceptionください。私たちはそうしました、そして私たちはそうしました、そして彼らは去りました。
于 2010-06-13T18:30:47.477 に答える
4

このワークフローにApache Whirrを使用することもできます。詳細については、クイック スタート ガイド5 分間のガイドを確認してください。

免責事項: 私はコミッターの 1 人です。

于 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 に答える