2013-05-31 23 views
5

Próbuję użyć distcp do skopiowania folderu z mojego lokalnego klastra hadoop (cdh4) do mojego kubełka Amazon S3.DistCp z lokalnego Hadoop do Amazon S3

użyć następującego polecenia:

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

hdfsbackup to nazwa mojego Amazon S3 Bucket.

DistCp nie powiedzie się z nieznanego wyjątkiem gospodarza:

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 

mam ID AWS/Tajny skonfigurowany w podstawowej site.xml wszystkich węzłów.

<!-- 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> 

Jestem w stanie skopiować pliki z hdfs za pomocą polecenia cp bez żadnego problemu. Komenda poniżej pomyślnie skopiowane do folderu HDFS S3

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

wiem, że jest zoptymalizowany distcp Amazon S3 (s3distcp) są dostępne, ale nie chcę go używać, ponieważ nie obsługuje aktualizacji/opcje zastępowania.

Odpowiedz

2

Wygląda na to, że korzystasz z zabezpieczeń Kerberos, a niestety obecnie aplikacja Map/Reduce nie może uzyskać dostępu do usługi Amazon S3, jeśli włączona jest opcja Kerberos. Możesz zobaczyć więcej szczegółów w MAPREDUCE-4548.

one rzeczywiście mają poprawkę, która powinna go naprawić, ale nie jest obecnie częścią każdej dystrybucji Hadoop, więc jeśli masz możliwość modyfikowania i budowania Hadoop ze źródła tutaj jest to, co należy zrobić:


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(); 
    } 

Bilet został ostatnio zaktualizowany kilka dni temu, więc mam nadzieję, że wkrótce zostanie oficjalnie załatany.

Łatwiejszym rozwiązaniem byłoby po prostu wyłączyć Kerberos, ale może to nie być możliwe w twoim środowisku.

Widziałem, że możesz to zrobić, jeśli twoje wiadro jest nazwane jak nazwa domeny, ale nie próbowałem, a nawet jeśli to działa, to brzmi jak włamanie.

+0

Dzięki, podejrzewałem, że jest to problem związany z bezpieczeństwem oparty na innym numerze (https://issues.apache.org/jira/browse/HADOOP-8408), który miał podobny stos wyjątków stacktrace. – Mohamed

+0

Zmiana nazwy zasobnika w celu wyświetlenia nazwy domeny linii nie działa dla mnie. Poprawka rozwiązała problem. – Mohamed