2013-05-31 5 views
5

Я пытаюсь использовать distcp для копирования папки из моего локального кластера (cdh4) в мой ковш Amazon S3.DistCp от Local Hadoop до 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 

У меня есть ID AWS/Secret настроен в ядро-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> 

Я могу скопировать файлы из hdfs с помощью команды cp без каких-либо проблем. Следующая команда успешно скопировал папку HDFS в S3

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

Я знаю, что есть Amazon S3 оптимизировано distcp (s3distcp) доступны, но я не хочу, чтобы использовать его, поскольку он не поддерживает обновление/перезаписать параметры.

ответ

2

Похоже, вы используете безопасность Kerberos, и, к сожалению, задания Map/Reduce не могут получить доступ к Amazon S3 в настоящее время, если Kerberos включен. Вы можете увидеть более подробную информацию в 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), которая имела аналогичное исключение stacktrace. – Mohamed

+0

Переименование ведра для поиска имени домена не помогло мне. Патч исправил проблему. – Mohamed

Смежные вопросы