एचडीएफएस ट्यूटोरियल: Archiटेकचर, पढ़ें और लिखें Operaका उपयोग कर Java API

एचडीएफएस क्या है?

HDFS एक वितरित फ़ाइल सिस्टम है जो बहुत बड़ी डेटा फ़ाइलों को संग्रहीत करने के लिए है, जो कमोडिटी हार्डवेयर के क्लस्टर पर चलता है। यह दोष सहिष्णु, स्केलेबल और विस्तार करने में बेहद सरल है। Hadoop के साथ बंडल आता है एचडीएफएस (Hadoop वितरित फ़ाइल सिस्टम).

जब डेटा किसी एक भौतिक मशीन पर स्टोरेज की क्षमता से ज़्यादा हो जाता है, तो उसे कई अलग-अलग मशीनों में विभाजित करना ज़रूरी हो जाता है। एक फ़ाइल सिस्टम जो मशीनों के नेटवर्क में स्टोरेज से जुड़े खास ऑपरेशन को मैनेज करता है, उसे डिस्ट्रिब्यूटेड फ़ाइल सिस्टम कहा जाता है। HDFS एक ऐसा ही सॉफ़्टवेयर है।

एचडीएफएस Archiटेक्चर

HDFS क्लस्टर मुख्य रूप से निम्न से बना होता है नाम नोड जो फ़ाइल सिस्टम का प्रबंधन करता है मेटाडाटा और एक डेटानोड्स जो स्टोर करता है वास्तविक तथ्य.

  • नामनोड: नेमनोड को सिस्टम का मास्टर माना जा सकता है। यह फाइल सिस्टम ट्री और सिस्टम में मौजूद सभी फाइलों और निर्देशिकाओं के लिए मेटाडेटा को बनाए रखता है। दो फाइलें 'नेमस्पेस छवि' और 'लॉग संपादित करें' मेटाडेटा जानकारी संग्रहीत करने के लिए उपयोग किया जाता है। नामनोड को किसी दिए गए फ़ाइल के लिए डेटा ब्लॉक वाले सभी डेटानोड्स का ज्ञान होता है, हालाँकि, यह ब्लॉक स्थानों को लगातार संग्रहीत नहीं करता है। सिस्टम शुरू होने पर डेटानोड्स से हर बार यह जानकारी फिर से बनाई जाती है।
  • डेटानोड: डेटा नोड्स स्लेव होते हैं जो क्लस्टर में प्रत्येक मशीन पर रहते हैं और वास्तविक स्टोरेज प्रदान करते हैं। यह क्लाइंट के लिए अनुरोधों को पूरा करने, पढ़ने और लिखने के लिए जिम्मेदार होता है।

HDFS में पढ़ने/लिखने का काम ब्लॉक स्तर पर होता है। HDFS में डेटा फ़ाइलों को ब्लॉक आकार के टुकड़ों में तोड़ा जाता है, जिन्हें स्वतंत्र इकाइयों के रूप में संग्रहीत किया जाता है। डिफ़ॉल्ट ब्लॉक आकार 64 MB है।

एचडीएफएस डेटा प्रतिकृति की अवधारणा पर काम करता है, जिसमें डेटा ब्लॉकों की कई प्रतिकृतियां बनाई जाती हैं और नोड विफलता की स्थिति में डेटा की उच्च उपलब्धता को सक्षम करने के लिए पूरे क्लस्टर में नोड्स पर वितरित की जाती हैं।

जानती हो? HDFS में एक फ़ाइल, जो एक ब्लॉक से छोटी होती है, ब्लॉक के पूरे स्टोरेज पर कब्जा नहीं करती।

पढ़ना OperaHDFS में

डेटा रीड रिक्वेस्ट HDFS, नेमनोड और डेटानोड द्वारा सर्व की जाती है। आइए रीडर को 'क्लाइंट' कहें। नीचे दिया गया आरेख फ़ाइल रीड ऑपरेशन को दर्शाता है Hadoop.

पढ़ना OperaHDFS में

  1. क्लाइंट कॉल करके पढ़ने का अनुरोध आरंभ करता है 'खुला()' FileSystem ऑब्जेक्ट की विधि; यह एक प्रकार का ऑब्जेक्ट है वितरितफ़ाइलसिस्टम.
  2. यह ऑब्जेक्ट RPC का उपयोग करके नाम नोड से जुड़ता है और फ़ाइल के ब्लॉक के स्थान जैसी मेटाडेटा जानकारी प्राप्त करता है। कृपया ध्यान दें कि ये पते फ़ाइल के पहले कुछ ब्लॉक के हैं।
  3. इस मेटाडेटा अनुरोध के प्रत्युत्तर में, उस ब्लॉक की प्रतिलिपि रखने वाले डेटानोड्स के पते वापस लौटा दिए जाते हैं।
  4. एक बार जब DataNodes के पते प्राप्त हो जाते हैं, तो प्रकार का एक ऑब्जेक्ट FSडेटाइनपुटस्ट्रीम ग्राहक को वापस कर दिया जाता है। FSडेटाइनपुटस्ट्रीम शामिल हैं DFSइनपुटस्ट्रीम जो DataNode और NameNode के साथ इंटरैक्शन का ख्याल रखता है। ऊपर दिए गए आरेख में दिखाए गए चरण 4 में, एक क्लाइंट आह्वान करता है 'पढ़ना()' विधि जो कारण बनता है DFSइनपुटस्ट्रीम किसी फ़ाइल के पहले ब्लॉक के साथ पहले DataNode के साथ कनेक्शन स्थापित करने के लिए।
  5. डेटा को स्ट्रीम के रूप में पढ़ा जाता है जिसमें क्लाइंट आह्वान करता है 'पढ़ना()' विधि को बार-बार दोहराएँ। इस प्रक्रिया पढ़ें () ऑपरेशन ब्लॉक के अंत तक जारी रहता है.
  6. एक बार जब ब्लॉक का अंत हो जाता है, तो DFSInputStream कनेक्शन को बंद कर देता है और अगले ब्लॉक के लिए अगले DataNode का पता लगाने के लिए आगे बढ़ता है
  7. जब ग्राहक रीडिंग कर लेता है, तो यह कॉल करता है एक पास() विधि.

लिखना OperaHDFS में

इस अनुभाग में, हम समझेंगे कि फ़ाइलों के माध्यम से डेटा को HDFS में कैसे लिखा जाता है।

लिखना OperaHDFS में

  1. क्लाइंट DistributedFileSystem ऑब्जेक्ट की 'create()' विधि को कॉल करके लेखन ऑपरेशन आरंभ करता है, जो एक नई फ़ाइल बनाता है - उपरोक्त आरेख में चरण क्रमांक 1।
  2. DistributedFileSystem ऑब्जेक्ट RPC कॉल का उपयोग करके NameNode से जुड़ता है और नई फ़ाइल निर्माण आरंभ करता है। हालाँकि, यह फ़ाइल निर्माण ऑपरेशन फ़ाइल के साथ किसी भी ब्लॉक को संबद्ध नहीं करता है। यह सत्यापित करना NameNode की ज़िम्मेदारी है कि फ़ाइल (जो बनाई जा रही है) पहले से मौजूद नहीं है और क्लाइंट के पास नई फ़ाइल बनाने के लिए सही अनुमतियाँ हैं। यदि कोई फ़ाइल पहले से मौजूद है या क्लाइंट के पास नई फ़ाइल बनाने के लिए पर्याप्त अनुमति नहीं है, तो आईओ अपवाद क्लाइंट को फेंक दिया जाता है। अन्यथा, ऑपरेशन सफल हो जाता है और फ़ाइल के लिए एक नया रिकॉर्ड NameNode द्वारा बनाया जाता है।
  3. एक बार NameNode में नया रिकॉर्ड बन जाने के बाद, FSDataOutputStream प्रकार का एक ऑब्जेक्ट क्लाइंट को लौटा दिया जाता है। क्लाइंट इसका उपयोग HDFS में डेटा लिखने के लिए करता है। डेटा लिखने की विधि लागू की जाती है (आरेख में चरण 3)।
  4. FSDataOutputStream में DFSOutputStream ऑब्जेक्ट होता है जो DataNodes और NameNode के साथ संचार की देखभाल करता है। जब क्लाइंट डेटा लिखना जारी रखता है, DFSआउटपुटस्ट्रीम इस डेटा के साथ पैकेट बनाना जारी रखता है। इन पैकेटों को एक कतार में रखा जाता है जिसे कहा जाता है डेटा कतार.
  5. इसमें एक और घटक है जिसे कहा जाता है डेटास्ट्रीमर जो इसका उपभोग करता है डेटा कतारडेटास्ट्रीमर नए ब्लॉकों के आवंटन के लिए नेमनोड से भी पूछता है, जिससे प्रतिकृति के लिए उपयोग किए जाने वाले वांछित डेटानोड्स का चयन होता है।
  6. अब, प्रतिकृतिकरण की प्रक्रिया डेटानोड्स का उपयोग करके पाइपलाइन बनाकर शुरू होती है। हमारे मामले में, हमने 3 का प्रतिकृतिकरण स्तर चुना है और इसलिए पाइपलाइन में 3 डेटानोड्स हैं।
  7. डेटास्ट्रीमर पाइपलाइन में पहले डेटानोड में पैकेट डालता है।
  8. पाइपलाइन में प्रत्येक डेटा नोड अपने द्वारा प्राप्त पैकेट को संग्रहीत करता है और उसे पाइपलाइन में दूसरे डेटा नोड को अग्रेषित करता है।
  9. एक अन्य कतार, 'Ack Queue' को DFSOutputStream द्वारा बनाए रखा जाता है, ताकि उन पैकेटों को संग्रहीत किया जा सके, जो DataNodes से पावती की प्रतीक्षा कर रहे हैं।
  10. एक बार जब कतार में किसी पैकेट के लिए पाइपलाइन में सभी डेटानोड से पावती प्राप्त हो जाती है, तो उसे 'Ack कतार' से हटा दिया जाता है। किसी भी डेटानोड विफलता की स्थिति में, इस कतार से पैकेट का उपयोग ऑपरेशन को फिर से शुरू करने के लिए किया जाता है।
  11. जब क्लाइंट डेटा लिखना समाप्त कर लेता है, तो वह close() विधि को कॉल करता है (आरेख में चरण 9)। close() को कॉल करने पर, शेष डेटा पैकेट्स को पाइपलाइन में प्रवाहित कर दिया जाता है, जिसके बाद पावती की प्रतीक्षा की जाती है।
  12. एक बार अंतिम पावती प्राप्त हो जाने पर, नेमनोड से संपर्क करके उसे बताया जाता है कि फ़ाइल लेखन कार्य पूरा हो गया है।

JAVA API का उपयोग करके HDFS तक पहुँचें

इस अनुभाग में हम यह समझने का प्रयास करते हैं Java Hadoop के फ़ाइल सिस्टम तक पहुँचने के लिए उपयोग किया जाने वाला इंटरफ़ेस।

Hadoop के फ़ाइल सिस्टम के साथ प्रोग्रामेटिक रूप से इंटरैक्ट करने के लिए, Hadoop कई JAVA क्लास प्रदान करता है। org.apache.hadoop.fs नामक पैकेज में Hadoop के फ़ाइल सिस्टम में फ़ाइल के हेरफेर में उपयोगी क्लास शामिल हैं। इन ऑपरेशन में ओपन, रीड, राइट और क्लोज शामिल हैं। वास्तव में, Hadoop के लिए फ़ाइल API सामान्य है और इसे HDFS के अलावा अन्य फ़ाइल सिस्टम के साथ इंटरैक्ट करने के लिए बढ़ाया जा सकता है।

HDFS से प्रोग्रामेटिक रूप से फ़ाइल पढ़ना

ऑब्जेक्ट java.net.URL फ़ाइल की सामग्री को पढ़ने के लिए उपयोग किया जाता है। सबसे पहले, हमें यह करना होगा Java Hadoop की hdfs URL स्कीम को पहचानें। यह कॉल करके किया जाता है setURLStreamHandlerFactory URL ऑब्जेक्ट पर विधि और FsUrlStreamHandlerFactory का एक इंस्टेंस इसे पास किया जाता है। इस विधि को प्रति दिन केवल एक बार निष्पादित करने की आवश्यकता है JVM, इसलिए यह एक स्थिर ब्लॉक में संलग्न है।

एक उदाहरण कोड है-

public class URLCat {
    static {
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    }
    public static void main(String[] args) throws Exception {
        InputStream in = null;
        try {
            in = new URL(args[0]).openStream();
            IOUtils.copyBytes(in, System.out, 4096, false);
        } finally {
            IOUtils.closeStream(in);
        }
    }
}

यह कोड किसी फ़ाइल की सामग्री को खोलता है और पढ़ता है। HDFS पर इस फ़ाइल का पथ प्रोग्राम को कमांड लाइन तर्क के रूप में पास किया जाता है।

कमांड-लाइन इंटरफ़ेस का उपयोग करके HDFS तक पहुँचें

यह HDFS के साथ बातचीत करने के सबसे सरल तरीकों में से एक है। कमांड-लाइन इंटरफ़ेस में फ़ाइल सिस्टम संचालन जैसे फ़ाइल पढ़ना, निर्देशिकाएँ बनाना, फ़ाइलों को स्थानांतरित करना, डेटा हटाना और निर्देशिकाओं को सूचीबद्ध करना आदि के लिए समर्थन है।

हम दौड़ सकते हैं '$HADOOP_HOME/bin/hdfs dfs -help' हर कमांड पर विस्तृत सहायता पाने के लिए यहाँ क्लिक करें। 'डीएफएस' एचडीएफएस का एक शेल कमांड है जो कई उपकमांडों का समर्थन करता है।

कुछ व्यापक रूप से प्रयुक्त कमांड नीचे सूचीबद्ध हैं, साथ ही प्रत्येक का विवरण भी दिया गया है।

1. स्थानीय फ़ाइल सिस्टम से HDFS में फ़ाइल कॉपी करें

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /

कमांड-लाइन इंटरफ़ेस का उपयोग करके HDFS तक पहुँचें

यह कमांड स्थानीय फाइल सिस्टम से temp.txt फ़ाइल को HDFS में कॉपी करता है।

2. हम किसी निर्देशिका में मौजूद फ़ाइलों को सूचीबद्ध कर सकते हैं -LS

$HADOOP_HOME/bin/hdfs dfs -ls /

कमांड-लाइन इंटरफ़ेस का उपयोग करके HDFS तक पहुँचें

हम एक फ़ाइल देख सकते हैं 'अस्थायी.txt' (पहले कॉपी किया गया) नीचे सूचीबद्ध किया जा रहा है '/' निर्देशिका.

3. HDFS से स्थानीय फाइल सिस्टम में फ़ाइल कॉपी करने का कमांड

$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt

कमांड-लाइन इंटरफ़ेस का उपयोग करके HDFS तक पहुँचें

हम देख सकते हैं अस्थायी.txt स्थानीय फ़ाइल सिस्टम में कॉपी किया गया.

4. नई डायरेक्टरी बनाने के लिए कमांड

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

कमांड-लाइन इंटरफ़ेस का उपयोग करके HDFS तक पहुँचें

जाँचें कि कोई डायरेक्टरी बनी है या नहीं। अब, आपको पता होना चाहिए कि यह कैसे करना है 😉