2013-05-31 2 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 내 아마존 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 

나는 비밀 AWS ID가/모든 노드의 핵심-site.xml 파일에 구성했습니다.

<!-- 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에서 파일을 복사 할 수 있어요. 아래의 명령이 성공적으로 S3

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

내가 사용할 수 아마존 S3에 최적화 distcp (s3distcp이)가 알 수있는 HDFS 폴더를 복사,하지만 난 그것을 갱신/덮어 쓰기 옵션을 지원하지 않기 때문에 그것을 사용하지 않습니다.

답변

2

Kerberos 보안을 사용하고있는 것처럼 보입니다. 불행히도 Kerberos가 활성화되어 있으면 현재지도/축소 작업이 Amazon S3에 액세스 할 수 없습니다. MAPREDUCE-4548에서 자세한 내용을 볼 수 있습니다.

그들은 실제로 문제를 해결하지만, 현재 어떤 하둡 배포판의 일부가 아닌해야 패치를, 그래서 당신이 여기 소스 하둡을 수정하고 구축 할 수있는 기회를 가질 경우에 당신이해야 할 일이다


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