2013-05-31 11 views
5

से Distcp मैं अपने अमेज़ॅन एस 3 बाल्टी में अपने स्थानीय हडूप क्लस्टर (सीडीएच 4) से एक फ़ोल्डर की प्रतिलिपि बनाने के लिए distcp का उपयोग करने की कोशिश कर रहा हूं।स्थानीय हडोप से अमेज़ॅन एस 3

मैं निम्न आदेश का उपयोग:

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 

मैं एडब्ल्यूएस आईडी/गुप्त सभी नोड्स के मूल-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 से फ़ाइलों की प्रतिलिपि बनाने में सक्षम हूं। नीचे दिए गए आदेश को सफलतापूर्वक S3

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

मैं जानता हूँ कि वहाँ अमेज़न S3 अनुकूलित distcp (s3distcp) उपलब्ध करने के लिए HDFS फ़ोल्डर की नकल की, लेकिन मैं इसे उपयोग करने के लिए के रूप में यह अद्यतन/अधिलेखित विकल्प का समर्थन नहीं करता नहीं करना चाहती।

उत्तर

2

ऐसा लगता है कि आप केर्बेरोज सुरक्षा का उपयोग कर रहे हैं, और दुर्भाग्यवश मानचित्र/कम करें नौकरियां वर्तमान में अमेज़ॅन एस 3 तक नहीं पहुंच सकती हैं अगर केर्बेरो सक्षम है। आप 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(); 
    } 

टिकट को दो दिन पहले अपडेट किया गया था, इसलिए उम्मीद है कि इसे जल्द ही आधिकारिक तौर पर पैच किया जाएगा।

एक आसान समाधान केवल केर्बेरोस को अक्षम करना होगा, लेकिन यह आपके पर्यावरण में संभव नहीं हो सकता है।

मैंने देखा है कि यदि आप अपनी बाल्टी को डोमेन नाम की तरह नामित करते हैं तो आप ऐसा करने में सक्षम हो सकते हैं, लेकिन मैंने कोशिश नहीं की है और यहां तक ​​कि अगर यह काम करता है तो यह हैक की तरह लगता है।

+0

धन्यवाद, मुझे संदेह है कि यह एक अन्य समस्या (https://issues.apache.org/jira/browse/HADOOP-8408) के आधार पर एक सुरक्षा संबंधी समस्या है जिसका एक समान अपवाद स्टैकट्रैक था। – Mohamed

+0

लाइन डोमेन नाम देखने के लिए बाल्टी का नाम बदलना मेरे लिए काम नहीं करता था। पैच समस्या को हल करता है। – Mohamed