2013-05-31 10 views
5

Ich versuche Distcp zu verwenden, um einen Ordner von meinem lokalen Hadoop-Cluster (Cdh4) in meinen Amazon S3-Bucket zu kopieren.DistCp von Local Hadoop nach Amazon S3

Ich verwende den folgenden Befehl ein:

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

hdfsbackup der Name meiner Amazon S3 Bucket ist.

DistCp nicht mit unbekannter Host Ausnahme:

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 

Ich habe die AWS ID/Geheim konfigurierte im Kern-site.xml alle Knoten.

Ich bin in der Lage, Dateien von hdfs mit dem Befehl cp ohne Probleme zu kopieren. Der unter Befehl kopiert erfolgreich den hdfs Ordner S3

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

Ich weiß, es ist Amazon S3 optimiert distcp (s3distcp) zur Verfügung, aber ich will nicht, es zu benutzen, da es nicht aktualisieren/überschreiben Optionen kann leider.

Antwort

2

Es sieht so aus, als ob Sie die Kerberos-Sicherheit verwenden. Map/Reduce-Jobs können derzeit leider nicht auf Amazon S3 zugreifen, wenn Kerberos aktiviert ist. Sie können weitere Details in MAPREDUCE-4548 sehen.

Sie haben tatsächlich einen Patch, der das Problem beheben sollte, ist aber derzeit nicht Teil irgendeiner Verteilung Hadoop, also wenn Sie die Möglichkeit haben, von der Quelle Hadoop zu modifizieren und zu bauen ist hier, was Sie tun sollten:


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

Das Ticket wurde vor ein paar Tagen zuletzt aktualisiert, hoffentlich wird das bald offiziell gepatcht.

Eine einfachere Lösung wäre, Kerberos einfach zu deaktivieren, aber das ist in Ihrer Umgebung möglicherweise nicht möglich.

Ich habe gesehen, dass Sie in der Lage, dies zu tun, wenn Ihr Bucket wie ein Domain-Name benannt ist, aber ich habe es nicht versucht, und selbst wenn dies funktioniert klingt das wie ein Hack.

+0

Danke, ich vermutete, dass es sich um ein sicherheitsbezogenes Problem handelt, das auf einem anderen Problem basiert (https://issues.apache.org/jira/browse/HADOOP-8408), das eine ähnliche Exception-Stacktrace hatte. – Mohamed

+0

Das Umbenennen des Buckets, um den Domänennamen der Zeile zu sehen, funktionierte nicht für mich. Der Patch behebt das Problem. – Mohamed