5

distcp を使用して、ローカルの Hadoop クラスター (cdh4) から Amazon S3 バケットにフォルダーをコピーしようとしています。

次のコマンドを使用します。

hadoop distcp -log /tmp/distcplog-s3/ hdfs://nameserv1/tmp/data/sampledata  s3n://hdfsbackup/

hdfsbackup は、私の Amazon S3 バケットの名前です。

DistCp が不明なホストの例外で失敗します:

13/05/31 11:22:33 INFO tools.DistCp: srcPaths=[hdfs://nameserv1/tmp/data/sampledata]
13/05/31 11:22:33 INFO tools.DistCp: destPath=s3n://hdfsbackup/
        No encryption was performed by peer.
        No encryption was performed by peer.
13/05/31 11:22:35 INFO hdfs.DFSClient: Created HDFS_DELEGATION_TOKEN token 54 for hadoopuser on ha-hdfs:nameserv1
13/05/31 11:22:35 INFO security.TokenCache: Got dt for hdfs://nameserv1; Kind: HDFS_DELEGATION_TOKEN, Service: ha-hdfs:nameserv1, Ident: (HDFS_DELEGATION_TOKEN token 54 for hadoopuser)
        No encryption was performed by peer.
java.lang.IllegalArgumentException: java.net.UnknownHostException: hdfsbackup
    at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:414)
    at org.apache.hadoop.security.SecurityUtil.buildDTServiceName(SecurityUtil.java:295)
    at org.apache.hadoop.fs.FileSystem.getCanonicalServiceName(FileSystem.java:282)
    at org.apache.hadoop.fs.FileSystem.collectDelegationTokens(FileSystem.java:503)
    at org.apache.hadoop.fs.FileSystem.addDelegationTokens(FileSystem.java:487)
    at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:130)
    at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:111)
    at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodes(TokenCache.java:85)
    at org.apache.hadoop.tools.DistCp.setup(DistCp.java:1046)
    at org.apache.hadoop.tools.DistCp.copy(DistCp.java:666)
    at org.apache.hadoop.tools.DistCp.run(DistCp.java:881)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
    at org.apache.hadoop.tools.DistCp.main(DistCp.java:908)
Caused by: java.net.UnknownHostException: hdfsbackup
    ... 14 more

すべてのノードの core-site.xml に AWS ID/Secret を設定しました。

<!-- Amazon S3 -->
<property>
    <name>fs.s3.awsAccessKeyId</name>
    <value>MY-ID</value>
</property>

<property>
    <name>fs.s3.awsSecretAccessKey</name>
    <value>MY-SECRET</value>
</property>


<!-- Amazon S3N -->
<property>
    <name>fs.s3n.awsAccessKeyId</name>
    <value>MY-ID</value>
</property>

<property>
    <name>fs.s3n.awsSecretAccessKey</name>
    <value>MY-SECRET</value>
</property>

問題なく cp コマンドを使用して hdfs からファイルをコピーできます。以下のコマンドは、hdfs フォルダーを S3 に正常にコピーしました

hadoop fs -cp hdfs://nameserv1/tmp/data/sampledata  s3n://hdfsbackup/

Amazon S3 に最適化された distcp (s3distcp) が利用できることは知っていますが、更新/上書きオプションをサポートしていないため、使用したくありません。

4

1 に答える 1

2

Kerberos セキュリティを使用しているようですが、残念ながら Kerberos が有効になっている場合、Map/Reduce ジョブは現在 Amazon S3 にアクセスできません。詳細はMAPREDUCE-4548で確認できます。

彼らは実際にそれを修正するパッチを持っていますが、現在どの Hadoop ディストリビューションにも含まれていません。


Index: core/org/apache/hadoop/security/SecurityUtil.java
===================================================================
--- core/org/apache/hadoop/security/SecurityUtil.java   (révision 1305278)
+++ core/org/apache/hadoop/security/SecurityUtil.java   (copie de travail)
@@ -313,6 +313,9 @@
     if (authority == null || authority.isEmpty()) {
       return null;
     }
+    if (uri.getScheme().equals("s3n") || uri.getScheme().equals("s3")) {
+      return null;
+    }
     InetSocketAddress addr = NetUtils.createSocketAddr(authority, defPort);
     return buildTokenService(addr).toString();
    }

チケットが最後に更新されたのは数日前なので、まもなく公式にパッチが適用されることを願っています。

より簡単な解決策は、Kerberos を無効にすることですが、環境によってはそれができない場合があります。

バケットにドメイン名のような名前が付けられている場合、これを実行できる可能性があることを確認しましたが、試したことはありません。これが機能したとしても、ハックのように思えます。

于 2013-05-31T19:44:30.187 に答える