2012-10-08 21 views
8

पर निर्देशिका की प्रतिलिपि बनाने में मुझे जावा कोड का उपयोग कर अपने स्थानीय सिस्टम से एचडीएफएस में एक निर्देशिका की प्रतिलिपि बनाने की कोशिश करने में समस्या आ रही है। मैं अलग-अलग फ़ाइलों को स्थानांतरित करने में सक्षम हूं लेकिन उप-फ़ोल्डर और फ़ाइलों के साथ एक संपूर्ण निर्देशिका को स्थानांतरित करने का एक तरीका नहीं समझ सकता। क्या कोई मेरी यह मदद कर सकता है? अग्रिम में धन्यवाद।स्थानीय सिस्टम से एचडीएफएस जावा कोड

+0

हैडोप का कौन सा संस्करण आप उपयोग कर रहे हैं? 'bin/hadoop dfs -copyFromLocal फ़ोल्डर 'प्रतियां' फ़ोल्डर' और इसमें सबकुछ इसके लिए बस ठीक है। –

+0

क्योंकि निर्देशिका एक 'फ़ाइल' नहीं है। आपको निर्देशिका को दोबारा बनाना चाहिए और फ़ाइल को एक-एक करके ले जाना चाहिए (यदि आप चाहें तो इसे समानांतर में कर सकते हैं)। बेशक, आपको अवगत होना चाहिए, कि यह ऑपरेशन परमाणु नहीं है, इसलिए यदि आप असफल होते हैं, तो कुछ फ़ाइलें एचडीएफएस पर समाप्त हो जाती हैं। – octo

उत्तर

17

बस FileSystem की copyFromLocalFile विधि का उपयोग करें। स्रोत पथ एक स्थानीय निर्देशिका यह HDFS गंतव्य में कॉपी किया जायेगा है:

... 
Configuration conf = new Configuration(); 
conf.addResource(new Path("/home/user/hadoop/conf/core-site.xml")); 
conf.addResource(new Path("/home/user/hadoop/conf/hdfs-site.xml")); 

FileSystem fs = FileSystem.get(conf); 
fs.copyFromLocalFile(new Path("/home/user/directory/"), 
    new Path("/user/hadoop/dir")); 
... 
+0

जो एचडीएफएस प्रदान कर रहा हूं, वह पथ "hdfs: //cluster.abc.com: 8080/उपयोगकर्ता/कुछ" रूप है, लेकिन यह कहता है "गलत एफएस, अपेक्षित फ़ाइल: ///"। इसके लिए कोई मदद? – Chirag

+1

fs.default.name के लिए core-site.xml में आपके पास कौन सा मान है? इसे hdfs को इंगित करना चाहिए: // होस्ट [: पोर्ट] –

+0

धन्यवाद। fs.default.name को आवश्यक hdfs में सेट करना: // होस्ट: पोर्ट काम किया। – Chirag

0

यहाँ पढ़ सकते हैं और HDFS करने के लिए लिखने के लिए पूरा काम कर कोड है। यह दो तर्क

  1. इनपुट पथ (स्थानीय/HDFS)

  2. आउटपुट पथ (HDFS)

मैं क्लाउडेरा सैंडबॉक्स इस्तेमाल किया लेता है।

package hdfsread; 

import java.io.BufferedInputStream; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.URI; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IOUtils; 

public class ReadingAFileFromHDFS { 

    public static void main(String[] args) throws IOException { 
     String uri = args[0]; 
     InputStream in = null; 
     Path pt = new Path(uri); 
     Configuration myConf = new Configuration(); 
     Path outputPath = new Path(args[1]); 

     myConf.set("fs.defaultFS","hdfs://quickstart.cloudera:8020"); 
     FileSystem fSystem = FileSystem.get(URI.create(uri),myConf); 
     OutputStream os = fSystem.create(outputPath); 
     try{ 
      InputStream is = new BufferedInputStream(new FileInputStream(uri)); 
      IOUtils.copyBytes(is, os, 4096, false); 
     } 
     catch(IOException e){ 
      e.printStackTrace(); 
     } 
     finally{ 
      IOUtils.closeStream(in); 
     } 
    } 
} 
+0

हाय जब मैं इसे कोशिश करता हूं तो मुझे ऑर्ग/अपाचे/हैडऑप/एफएस/एफएसडेटाऑटपुटस्ट्रीम त्रुटि मिल रही है। मैंने अपने पोम में हडूप-कॉमन, हडूप-एचडीएफएस पुस्तकालयों को जोड़ा है। और मेरी कॉन्फ़िगरेशन में core-site.xml, hdfs-site.xml भी जोड़ा। – user4342532