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

⚡ स्मार्ट सारांश

HDFS, Hadoop की वितरित भंडारण परत है, जो बहुत बड़ी फ़ाइलों को सामान्य मशीनों में प्रतिकृति ब्लॉकों में विभाजित करती है ताकि एक ही NameNode tracकई डेटा नोड्स विश्वसनीय रूप से पढ़ने और लिखने के अनुरोधों को पूरा करते हैं, जबकि केएस मेटाडेटा भी उपलब्ध होता है।

  • 🔘 Archiटेक्चर: नेमनोड में नेमस्पेस इमेज और एडिट लॉग होता है, जबकि डेटा नोड्स में वास्तविक ब्लॉक प्रतिकृतियां संग्रहीत होती हैं।
  • ब्लॉक का आकार: Hadoop 1.x में डिफ़ॉल्ट रूप से 64 MB के ब्लॉक होते थे; Hadoop 2.x और 3.x में इसके बजाय 128 MB के ब्लॉक होते हैं।
  • प्रतिकृति: प्रति ब्लॉक तीन प्रतिकृतियां डिफ़ॉल्ट रूप से मौजूद होती हैं, जो रैक में फैली होती हैं ताकि हार्डवेयर की विफलता से कभी भी डेटा नष्ट न हो।
  • 🧪 पढ़ने का मार्ग: FSDataInputStream और DFSInputStream, NameNode से ब्लॉक लोकेशन प्राप्त करते हैं, फिर DataNodes से सीधे बाइट्स को स्ट्रीम करते हैं।
  • लेखन पथ: DFSOutputStream पैकेटों को कतारबद्ध करता है, DataStreamer एक DataNode पाइपलाइन बनाता है, और एक Ack Queue पैकेट हानि से सुरक्षा प्रदान करता है।
  • 🧭 पहुँच विकल्प: org.apache.hadoop.fs Java एपीआई और एचडीएफएस डीएफएस शेल दोनों ही ओपन, रीड, राइट और क्लोज कमांड को कवर करते हैं।

एचडीएफएस ट्यूटोरियल

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

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

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

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

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

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

क्योंकि एक अकेला नेमनोड विफलता का एक एकल बिंदु होगा, इसलिए वर्तमान क्लस्टर एक सक्रिय नेमनोड के साथ एक स्टैंडबाय नेमनोड चलाते हैं जो जर्नलनोड्स के एक कोरम के माध्यम से एडिट लॉग साझा करता है, और दोनों के बीच स्वचालित फेलओवर होता है।

HDFS में रीड और राइट ऑपरेशन ब्लॉक लेवल पर काम करते हैं। HDFS में डेटा फ़ाइलें ब्लॉक-साइज़ के चंक्स में विभाजित होती हैं, जिन्हें स्वतंत्र इकाइयों के रूप में संग्रहीत किया जाता है। Hadoop 1.x में डिफ़ॉल्ट ब्लॉक साइज़ 64 MB है। Hadoop 2.x के बाद से डिफ़ॉल्ट ब्लॉक साइज़ 64 MB से अधिक हो गया है। डीएफएस.ब्लॉकसाइज़ 128 एमबी है.

HDFS डेटा प्रतिकृति की अवधारणा पर काम करता है, जिसमें डेटा ब्लॉक की कई प्रतिकृतियां बनाई जाती हैं और नोड विफलता की स्थिति में डेटा की उच्च उपलब्धता सुनिश्चित करने के लिए उन्हें क्लस्टर में मौजूद नोड्स पर वितरित किया जाता है। डिफ़ॉल्ट प्रतिकृति कारक तीन है।डीएफएस.रेप्लिकेशन), और जब कोई डेटा नोड हार्टबीट भेजना बंद कर देता है, तो नेम नोड स्वचालित रूप से अपने ब्लॉक को कहीं और पुनः प्रतिकृत कर देता है।

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

पढ़ना OperaHDFS में

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

क्लाइंट, नेम नोड और डेटा नोड्स के बीच एचडीएफएस रीड ऑपरेशन डेटा प्रवाह

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

लिखना OperaHDFS में

इस अनुभाग में, हम समझेंगे कि फ़ाइलों के माध्यम से डेटा को HDFS में कैसे लिखा जाता है। नीचे दिए गए आरेख में देखें। traces जो पथ लिखते हैं।

डेटाक्यू, डेटास्ट्रीमर और एकनॉलेजमेंट क्यू के साथ एचडीएफएस राइट ऑपरेशन पाइपलाइन

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

एचडीएफएस तक पहुंचने के लिए इसका उपयोग करें Java API

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

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

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

ऑब्जेक्ट जावा.नेट.URL फ़ाइल की सामग्री को पढ़ने के लिए उपयोग किया जाता है। सबसे पहले, हमें यह करना होगा Java Hadoop के hdfs को पहचानें URL योजना। यह सेट को कॉल करके किया जाता है।URLStreamHandlerFactory विधि पर 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 तक पहुंचें

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

हम दौड़ सकते हैं '$HADOOP_HOME/bin/hdfs dfs -help' प्रत्येक कमांड पर विस्तृत सहायता प्राप्त करने के लिए। यहां, 'dfs' HDFS का एक शेल कमांड है जो कई सबकमांड का समर्थन करता है। Hadoop के वर्तमान रिलीज़ में एचडीएफएस डीएफएस यह पसंदीदा रूप है, जबकि पुराना रूप हैडूप एफएस यह कमांड किसी भी समर्थित फाइल सिस्टम के लिए समान कार्य करता है।

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

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

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

यह कमांड temp.txt फ़ाइल को स्थानीय फ़ाइल सिस्टम से HDFS में कॉपी करता है, जैसा कि नीचे दिए गए आउटपुट में दिखाया गया है।

hdfs dfs -copyFromLocal कमांड temp.txt फ़ाइल को HDFS में कॉपी कर रहा है।

2. हम -ls कमांड का उपयोग करके किसी डायरेक्टरी में मौजूद फाइलों की सूची बना सकते हैं।

$HADOOP_HOME/bin/hdfs dfs -ls /

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

hdfs dfs -ls कमांड का आउटपुट HDFS रूट डायरेक्टरी में मौजूद temp.txt फ़ाइल को दर्शाता है।

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

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

यह कमांड -get कमांड के समान है और दूसरे आर्गुमेंट के रूप में एक स्पष्ट स्थानीय गंतव्य पथ स्वीकार करती है। नीचे दिया गया आउटपुट दिखाता है कि temp.txt फ़ाइल स्थानीय फ़ाइल सिस्टम में कॉपी हो गई है।

hdfs dfs -copyToLocal कमांड का आउटपुट दिखाता है कि temp.txt फ़ाइल स्थानीय फ़ाइल सिस्टम में कॉपी हो गई है।

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

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

यह कमांड बिना किसी आवाज के पूरी हो जाती है, जैसा कि नीचे दिए गए प्रॉम्प्ट में दिखाया गया है।

hdfs dfs -mkdir कमांड का उपयोग करके HDFS में /mydirectory फ़ोल्डर बनाया जाता है।

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

अक्सर पूछे जाने वाले प्रश्न

बड़े ब्लॉक नेमनोड मेटाडेटा को छोटा रखते हैं और मैपर को दोबारा खोजने से पहले बाइट्स की एक लंबी अनुक्रमिक श्रृंखला पढ़ने की अनुमति देते हैं। इसलिए डिस्क सीक टाइम ट्रांसफर टाइम का एक छोटा सा हिस्सा बन जाता है, जिससे फुल-फाइल स्कैन तेज़ हो जाते हैं।

NameNode को हार्टबीट मिलना बंद हो जाता है, नोड को निष्क्रिय घोषित कर दिया जाता है, और उन सभी ब्लॉकों के पुनः प्रतिकृति की व्यवस्था की जाती है जिनका प्रतिकृति कारक स्वस्थ DataNodes से कम हो गया है। चल रहे लेखन Ack Queue से पुनर्प्राप्त हो जाते हैं, इसलिए क्लाइंट को पैकेट का नुकसान नहीं होता है।

सही ढंग से कॉन्फ़िगर किए गए क्लस्टर में नहीं। HDFS हाई अवेलेबिलिटी एक सक्रिय और एक स्टैंडबाय नेमनोड चलाती है जो जर्नलनोड्स के माध्यम से संपादन साझा करते हैं, और जब सक्रिय नोड प्रतिक्रिया देना बंद कर देता है तो ज़ूकीपर फ़ेलओवर नियंत्रक स्वचालित रूप से स्टैंडबाय को सक्रिय कर देते हैं।

दोनों ही विकल्प डेटा को HDFS में अपलोड करते हैं। -copyFromLocal विकल्प स्रोत को स्थानीय फ़ाइल सिस्टम तक सीमित रखता है, जबकि -put किसी भी समर्थित स्रोत को स्वीकार करता है, जिसमें कोई अन्य HDFS पथ या stdin भी शामिल है। अन्यथा व्यवहार समान है, इसलिए -copyFromLocal केवल उद्देश्य को दर्शाता है।

NameNode में प्रत्येक फ़ाइल, निर्देशिका और ब्लॉक मेमोरी का उपयोग करते हैं, इसलिए लाखों छोटी फ़ाइलें डिस्क भरने से बहुत पहले ही मेमोरी हीप को खाली कर देती हैं। इन्हें अनुक्रम फ़ाइलों, Avro, ORC, Parquet या HAR अभिलेखागारों में संयोजित करने से मेटाडेटा को प्रबंधनीय बनाए रखा जा सकता है।

प्रतिकृति तीन पूर्ण प्रतियां रखती है, जिसके लिए 200 प्रतिशत अतिरिक्त स्टोरेज की आवश्यकता होती है। हैडूप 3 में जोड़ी गई इरेज़र कोडिंग, इसके बजाय पैरिटी सेल को स्टोर करती है और लगभग 50 प्रतिशत अतिरिक्त लागत पर समान स्थायित्व प्राप्त करती है, जिससे कम स्टोरेज के बदले रिकवरी के दौरान CPU और नेटवर्क की लागत बढ़ जाती है।

नेमनोड ऑडिट लॉग और डेटा नोड मेट्रिक्स पर प्रशिक्षित मशीन लर्निंग मॉडल क्षमता की कमी का पूर्वानुमान लगा सकते हैं, हॉट ब्लॉक को चिह्नित कर सकते हैं और डिस्क के बंद होने से पहले ही खराब होने का पता लगा सकते हैं। एक्सेस पैटर्न पर विसंगति का पता लगाने से अनियंत्रित जॉब्स का भी जल्दी पता चल जाता है।

कोपायलट, org.apache.hadoop.fs के सामान्य कोड जैसे कि FileSystem.get, FSDataInputStream लूप और IOUtils.copyBytes कॉल को तेज़ी से पूरा करता है। जेनरेट किए गए कोड को हमेशा इस्तेमाल किए जा रहे Hadoop वर्ज़न से वेरिफाई करें, क्योंकि Hadoop 2.x और 3.x के बीच API नाम और अप्रचलित मेथड में काफ़ी अंतर होता है।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: