एचडीएफएस ट्यूटोरियल: Archiटेकचर, पढ़ें और लिखें Operaउत्पादन
⚡ स्मार्ट सारांश
HDFS, Hadoop की वितरित भंडारण परत है, जो बहुत बड़ी फ़ाइलों को सामान्य मशीनों में प्रतिकृति ब्लॉकों में विभाजित करती है ताकि एक ही NameNode tracकई डेटा नोड्स विश्वसनीय रूप से पढ़ने और लिखने के अनुरोधों को पूरा करते हैं, जबकि केएस मेटाडेटा भी उपलब्ध होता है।
एचडीएफएस क्या है?
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 में फ़ाइल रीड ऑपरेशन को दर्शाता है।
- एक क्लाइंट 'FileSystem' ऑब्जेक्ट के 'open()' मेथड को कॉल करके रीड रिक्वेस्ट शुरू करता है; यह DistributedFileSystem प्रकार का ऑब्जेक्ट है।
- यह ऑब्जेक्ट RPC का उपयोग करके NameNode से जुड़ता है और फ़ाइल के ब्लॉक के स्थान जैसी मेटाडेटा जानकारी प्राप्त करता है। कृपया ध्यान दें कि ये पते फ़ाइल के पहले कुछ ब्लॉक के हैं।
- इस मेटाडेटा अनुरोध के जवाब में, उस ब्लॉक की एक प्रति रखने वाले डेटा नोड्स के पते लौटाए जाते हैं।
- डेटा नोड्स के पते प्राप्त होने के बाद, FSDataInputStream प्रकार का एक ऑब्जेक्ट क्लाइंट को वापस भेज दिया जाता है। FSDataInputStream में DFSInputStream शामिल होता है, जो डेटा नोड और नेम नोड के साथ इंटरैक्शन का ध्यान रखता है। ऊपर दिए गए आरेख में चरण 4 में, क्लाइंट 'read()' विधि को कॉल करता है, जिससे DFSInputStream फ़ाइल के पहले ब्लॉक वाले पहले डेटा नोड के साथ कनेक्शन स्थापित करता है।
- डेटा को स्ट्रीम के रूप में पढ़ा जाता है, जिसमें क्लाइंट 'read()' विधि को बार-बार कॉल करता है। यह read() ऑपरेशन तब तक चलता रहता है जब तक कि ब्लॉक का अंत नहीं आ जाता।
- एक बार ब्लॉक का अंत हो जाने पर, DFSInputStream कनेक्शन बंद कर देता है और अगले ब्लॉक के लिए अगले DataNode का पता लगाने के लिए आगे बढ़ जाता है।
- जब क्लाइंट पढ़ना समाप्त कर लेता है, तो वह close() मेथड को कॉल करता है।
लिखना OperaHDFS में
इस अनुभाग में, हम समझेंगे कि फ़ाइलों के माध्यम से डेटा को HDFS में कैसे लिखा जाता है। नीचे दिए गए आरेख में देखें। traces जो पथ लिखते हैं।
- एक क्लाइंट डिस्ट्रीब्यूटेडफाइलसिस्टम ऑब्जेक्ट के 'क्रिएट()' मेथड को कॉल करके एक राइट ऑपरेशन शुरू करता है, जो एक नई फाइल बनाता है - ऊपर दिए गए आरेख में चरण संख्या 1।
- डिस्ट्रीब्यूटेडफाइलसिस्टम ऑब्जेक्ट एक आरपीसी कॉल का उपयोग करके नेमनोड से कनेक्ट होता है और नई फ़ाइल बनाने की प्रक्रिया शुरू करता है। हालांकि, इस फ़ाइल निर्माण प्रक्रिया में फ़ाइल के साथ कोई ब्लॉक संबद्ध नहीं होता है। यह नेमनोड की ज़िम्मेदारी है कि वह सत्यापित करे कि (जो फ़ाइल बनाई जा रही है) वह पहले से मौजूद नहीं है और क्लाइंट के पास नई फ़ाइल बनाने के लिए सही अनुमतियाँ हैं। यदि कोई फ़ाइल पहले से मौजूद है या क्लाइंट के पास नई फ़ाइल बनाने के लिए पर्याप्त अनुमति नहीं है, तो क्लाइंट को एक IOException भेजा जाता है। अन्यथा, प्रक्रिया सफल होती है और नेमनोड द्वारा फ़ाइल के लिए एक नया रिकॉर्ड बनाया जाता है।
- NameNode में नया रिकॉर्ड बनने के बाद, FSDataOutputStream प्रकार का एक ऑब्जेक्ट क्लाइंट को वापस भेजा जाता है। क्लाइंट इसका उपयोग HDFS में डेटा लिखने के लिए करता है। डेटा राइट विधि को कॉल किया जाता है (आरेख में चरण 3)।
- FSDataOutputStream में एक DFSOutputStream ऑब्जेक्ट होता है जो DataNodes और NameNode के साथ संचार का प्रबंधन करता है। क्लाइंट द्वारा डेटा लिखने के दौरान, DFSOutputStream इस डेटा के साथ पैकेट बनाता रहता है। इन पैकेटों को DataQueue नामक एक कतार में रखा जाता है।
- एक और घटक है जिसे डेटास्ट्रीमर कहा जाता है, जो इस डेटाक्यू का उपयोग करता है। डेटास्ट्रीमर नेमनोड से नए ब्लॉक के आवंटन का अनुरोध भी करता है, जिससे प्रतिकृति के लिए उपयुक्त डेटा नोड्स का चयन किया जा सके।
- अब, प्रतिकृतिकरण की प्रक्रिया डेटानोड्स का उपयोग करके पाइपलाइन बनाकर शुरू होती है। हमारे मामले में, हमने 3 का प्रतिकृतिकरण स्तर चुना है और इसलिए पाइपलाइन में 3 डेटानोड्स हैं।
- डेटास्ट्रीमर पाइपलाइन में पहले डेटानोड में पैकेट डालता है।
- पाइपलाइन में मौजूद प्रत्येक डेटा नोड अपने द्वारा प्राप्त पैकेट को संग्रहीत करता है और उसे पाइपलाइन में मौजूद दूसरे डेटा नोड को अग्रेषित करता है।
- एक अन्य कतार, 'एक्नॉलेजमेंट क्यू', को डीएफएसआउटपुटस्ट्रीम द्वारा बनाए रखा जाता है ताकि उन पैकेटों को संग्रहीत किया जा सके जो डेटा नोड्स से स्वीकृति की प्रतीक्षा कर रहे हैं।
- एक बार जब कतार में किसी पैकेट के लिए पाइपलाइन में सभी डेटानोड से पावती प्राप्त हो जाती है, तो उसे 'Ack कतार' से हटा दिया जाता है। किसी भी डेटानोड विफलता की स्थिति में, इस कतार से पैकेट का उपयोग ऑपरेशन को फिर से शुरू करने के लिए किया जाता है।
- जब कोई क्लाइंट डेटा लिखना पूरा कर लेता है, तो वह close() मेथड को कॉल करता है (आरेख में चरण 9)। close() को कॉल करने से शेष डेटा पैकेट पाइपलाइन में भेज दिए जाते हैं, जिसके बाद स्वीकृति की प्रतीक्षा की जाती है।
- अंतिम पुष्टि प्राप्त होने के बाद, नेमनोड से संपर्क करके उसे सूचित किया जाता है कि फ़ाइल लेखन प्रक्रिया पूरी हो गई है।
एचडीएफएस तक पहुंचने के लिए इसका उपयोग करें 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 में कॉपी करता है, जैसा कि नीचे दिए गए आउटपुट में दिखाया गया है।
2. हम -ls कमांड का उपयोग करके किसी डायरेक्टरी में मौजूद फाइलों की सूची बना सकते हैं।
$HADOOP_HOME/bin/hdfs dfs -ls /
नीचे दी गई सूची में हम ' / ' निर्देशिका के अंतर्गत 'temp.txt' फ़ाइल (जिसे पहले कॉपी किया गया था) देख सकते हैं।
3. HDFS से स्थानीय फाइल सिस्टम में फ़ाइल कॉपी करने का कमांड
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
यह कमांड -get कमांड के समान है और दूसरे आर्गुमेंट के रूप में एक स्पष्ट स्थानीय गंतव्य पथ स्वीकार करती है। नीचे दिया गया आउटपुट दिखाता है कि temp.txt फ़ाइल स्थानीय फ़ाइल सिस्टम में कॉपी हो गई है।
4. नई डायरेक्टरी बनाने के लिए कमांड
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
यह कमांड बिना किसी आवाज के पूरी हो जाती है, जैसा कि नीचे दिए गए प्रॉम्प्ट में दिखाया गया है।
जाँच लें कि डायरेक्टरी बनाई गई है या नहीं। अब आपको पता चल गया होगा कि यह कैसे करना है 😉




