2013-05-31 16 views
5

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

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

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

hdfsbackupは私のAmazon S3バケットの名前です。私はAWS ID /シークレットは、すべてのノードのコア-site.xmlで設定されている

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 

DistCpは不明なホスト例外で失敗します。

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

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

にHDFSフォルダをコピーした私は、利用可能なAmazon S3の最適化distcp(s3distcp)があるけど、私はそれを更新/上書きオプションをサポートしていないとして、それを使用したくありません。

答えて

2

Kerberosセキュリティを使用しているようですが、現時点ではKerberosが有効になっていると、現時点ではMap/ReduceジョブはAmazon S3にアクセスできません。 MAPREDUCE-4548で詳細を見ることができます。

彼らが実際にそれを修正する必要があるパッチを持っていますが、現在は任意のHadoopのディストリビューションの一部ではないので、あなたはここのソースからの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を無効にすることですが、それはあなたの環境では不可能かもしれません。

バケットの名前がドメイン名のように指定されていても、試していない場合でも、ハックのように聞こえる場合でも、これを実行できる可能性があります。

+0

これは、同様の例外スタックトレースを持つ別の問題(https://issues.apache.org/jira/browse/HADOOP-8408)に基づくセキュリティ関連の問題だと思います。 – Mohamed

+0

行ドメイン名を表示するためにバケットの名前を変更しても機能しませんでした。 この問題は修正されました。 – Mohamed

関連する問題