MOB के लिए HBase के नए समर्थन के पीछे के डिज़ाइन निर्णयों के बारे में जानें।
Apache HBase एक वितरित, स्केलेबल, प्रदर्शनकारी, सुसंगत कुंजी मान डेटाबेस है जो विभिन्न प्रकार के बाइनरी डेटा प्रकारों को संग्रहीत कर सकता है। यह कई अपेक्षाकृत छोटे मूल्यों (<10K) को संग्रहीत करने और कम-विलंबता पढ़ने और लिखने की सुविधा प्रदान करने में उत्कृष्ट है।
हालांकि, पढ़ने और लिखने के लिए कम विलंबता बनाए रखते हुए HBase में दस्तावेज़ों, छवियों और अन्य मध्यम वस्तुओं (MOBs) को संग्रहीत करने की मांग बढ़ रही है। ऐसा ही एक उपयोग मामला एक बैंक है जो हस्ताक्षरित और स्कैन किए गए ग्राहक दस्तावेजों को संग्रहीत करता है। एक अन्य उदाहरण के रूप में, परिवहन एजेंसियां यातायात और चलती कारों के स्नैपशॉट संग्रहीत करना चाह सकती हैं। ये MOB आमतौर पर राइट-वन्स होते हैं।
दुर्भाग्य से, प्रदर्शन उन स्थितियों में खराब हो सकता है जहां कई मध्यम आकार के मान (100K से 10MB) संघनन द्वारा बनाए गए लगातार बढ़ते I/O दबाव के कारण संग्रहीत किए जाते हैं। उस मामले पर विचार करें जहां ट्रैफिक कैमरों से 1TB तस्वीरें, प्रत्येक 1MB आकार में, HBase में प्रतिदिन संग्रहीत की जाती हैं। संग्रहीत फ़ाइलों के भागों को कई बार छोटे संघनन के माध्यम से संकुचित किया जाता है और अंततः, प्रमुख संघनन द्वारा डेटा को फिर से लिखा जाता है। इन MOB के संचय के साथ, संघनन द्वारा निर्मित I/O संघनन को धीमा कर देगा, आगे मेमस्टोर फ्लशिंग को अवरुद्ध करेगा, और अंततः अद्यतनों को अवरुद्ध करेगा। एक बड़ा MOB स्टोर प्रभावित क्षेत्रों की उपलब्धता को कम करते हुए बार-बार क्षेत्र विभाजन को ट्रिगर करेगा।
इन कमियों को दूर करने के लिए, Cloudera और Intel इंजीनियरों ने HBase शाखा (hbase-11339:HBase MOB) में MOB समर्थन लागू किया है। इस शाखा को HBase 1.1 या 1.2 में मास्टर में मिला दिया जाएगा, और यह पहले से ही मौजूद है और CDH 5.4.x में भी समर्थित है।
एमओबी पर संचालन आमतौर पर लेखन-गहन होते हैं, दुर्लभ अपडेट या हटाए जाते हैं और अपेक्षाकृत कम पढ़े जाते हैं। MOB को आमतौर पर उनके मेटाडेटा के साथ संग्रहीत किया जाता है। MOB से संबंधित मेटाडेटा में शामिल हो सकते हैं, उदाहरण के लिए, कार नंबर, गति और रंग। एमओबी के सापेक्ष मेटाडेटा बहुत छोटा है। मेटाडेटा को आमतौर पर विश्लेषण के लिए एक्सेस किया जाता है, जबकि एमओबी को आमतौर पर केवल तभी एक्सेस किया जाता है जब उन्हें पंक्ति कुंजियों के साथ स्पष्ट रूप से अनुरोध किया जाता है।
उपयोगकर्ता एक ही एपीआई में कम विलंबता के साथ HBase में MOB को पढ़ना और लिखना चाहते हैं, और क्लस्टर के बीच मजबूत स्थिरता, सुरक्षा, स्नैपशॉट और HBase प्रतिकृति चाहते हैं, और इसी तरह। इन लक्ष्यों को पूरा करने के लिए, MOB को HBase के मुख्य I/O पथ से हटाकर एक नए I/O पथ में ले जाया गया।
इस पोस्ट में, आप इस डिज़ाइन दृष्टिकोण के बारे में जानेंगे, और इसे क्यों चुना गया था।
संभावित दृष्टिकोण
इस समस्या के लिए कुछ संभावित दृष्टिकोण थे। पहला तरीका जिसे हमने माना था, वह था एमओबी को ट्यूनेड स्प्लिट और कॉम्पैक्शन नीतियों के साथ एचबीएएस में स्टोर करना-एक बड़ा वांछित मैक्सफाइलसाइज क्षेत्र विभाजन की आवृत्ति को कम करता है, और कम या कोई कॉम्पैक्शन राइट एम्पलीफिकेशन पेनल्टी से बच नहीं सकता है। उस दृष्टिकोण से लेखन विलंबता और थ्रूपुट में काफी सुधार होगा। हालाँकि, संग्रहीत फ़ाइलों की बढ़ती संख्या के साथ, एक ही स्टोर में बहुत सारे खुले हुए पाठक होंगे, यहाँ तक कि OS द्वारा अनुमत से भी अधिक। परिणामस्वरूप, बहुत सारी मेमोरी खर्च हो जाएगी और पढ़ने का प्रदर्शन ख़राब हो जाएगा।
मेटाडेटा और एमओबी को अलग-अलग स्टोर करने के लिए एक अन्य दृष्टिकोण एचबीएएस + एचडीएफएस मॉडल का उपयोग करना था। इस मॉडल में, HBase में एक प्रविष्टि द्वारा एकल फ़ाइल को लिंक किया जाता है। यह एक क्लाइंट समाधान है, और लेन-देन क्लाइंट द्वारा नियंत्रित किया जाता है- कोई HBase-साइड मेमोरी MOB द्वारा उपभोग नहीं की जाती है। यह तरीका 50MB से बड़े ऑब्जेक्ट के लिए काम करेगा, लेकिन MOB के लिए, कई छोटी फ़ाइलें अक्षम HDFS उपयोग की ओर ले जाती हैं क्योंकि HDFS में डिफ़ॉल्ट ब्लॉक आकार 128MB है।
उदाहरण के लिए, मान लें कि एक NameNode में 48GB मेमोरी है और प्रत्येक फ़ाइल 100KB की है जिसमें तीन प्रतियाँ हैं। प्रत्येक फ़ाइल मेमोरी में 300 से अधिक बाइट्स लेती है, इसलिए 48GB मेमोरी वाला एक NameNode लगभग 160 मिलियन फ़ाइलों को धारण कर सकता है, जो हमें कुल 16TB MOB फ़ाइलों को संग्रहीत करने तक सीमित कर देगा।
एक सुधार के रूप में, हम छोटी MOB फ़ाइलों को बड़े लोगों में इकट्ठा कर सकते थे - यानी, एक फ़ाइल में कई MOB प्रविष्टियाँ हो सकती हैं - और तेजी से पढ़ने के लिए HBase तालिका में ऑफ़सेट और लंबाई को संग्रहीत कर सकते हैं। हालांकि, डेटा स्थिरता बनाए रखना और हटाए गए MOB और संघनन में छोटी MOB फ़ाइलों को प्रबंधित करना कठिन है।
इसके अलावा, अगर हम इस दृष्टिकोण का उपयोग करते हैं, तो हमें नई सुरक्षा नीतियों पर विचार करना होगा, लेखन के परमाणु गुणों को खोना होगा, और संभावित रूप से प्रतिकृति और स्नैपशॉट द्वारा प्रदान किए गए बैकअप और आपदा पुनर्प्राप्ति को खोना होगा।
HBase MOB डिज़ाइन
अंत में, क्योंकि HBase में MOB के भंडारण के बारे में अधिकांश चिंताओं में संघनन द्वारा बनाए गए I/O शामिल हैं, इसलिए मुख्य बात यह थी कि MOB को सामान्य क्षेत्रों द्वारा प्रबंधन से बाहर कर दिया जाए ताकि वहां क्षेत्र विभाजन और संघनन से बचा जा सके।
HBase MOB डिज़ाइन HBase + HDFS दृष्टिकोण के समान है क्योंकि हम मेटाडेटा और MOB को अलग-अलग संग्रहीत करते हैं। हालाँकि, अंतर सर्वर-साइड डिज़ाइन में निहित है:मेमस्टोर MOB को डिस्क पर फ़्लश करने से पहले कैश करता है, MOB को प्रत्येक फ्लश में "MOB फ़ाइल" नामक HFile में लिखा जाता है, और प्रत्येक MOB फ़ाइल में एकल फ़ाइल के बजाय कई प्रविष्टियाँ होती हैं। प्रत्येक भीड़ के लिए एचडीएफएस में। यह MOB फ़ाइल एक विशेष क्षेत्र में संग्रहीत है। सभी पढ़ने और लिखने का उपयोग वर्तमान HBase API द्वारा किया जा सकता है।
लिखें और पढ़ें
प्रत्येक MOB की एक सीमा होती है:यदि किसी सेल की मान लंबाई इस थ्रेशोल्ड से अधिक है, तो इस सेल को MOB सेल माना जाता है।
जब क्षेत्रों में एमओबी कोशिकाओं को अद्यतन किया जाता है, तो वे सामान्य कोशिकाओं की तरह ही वाल और मेमस्टोर को लिखे जाते हैं। फ्लशिंग में, MOB को MOB फ़ाइलों में फ़्लश किया जाता है, और MOB फ़ाइलों के मेटाडेटा और पथ फ़ाइलों को संग्रहीत करने के लिए फ़्लश किए जाते हैं। डेटा संगतता और HBase प्रतिकृति सुविधाएँ इस डिज़ाइन के मूल निवासी हैं।
MOB संपादन सामान्य से बड़े होते हैं। सिंक में, संबंधित I/O भी बड़ा होता है, जो WAL के सिंक संचालन को धीमा कर सकता है। यदि ऐसे अन्य क्षेत्र हैं जो समान WAL साझा करते हैं, तो इन क्षेत्रों की लेखन विलंबता प्रभावित हो सकती है। हालांकि, अगर डेटा स्थिरता और गैर-अस्थिरता की जरूरत है, तो वाल जरूरी है।
कोशिकाओं को दहलीज को बदलकर संघनन में संग्रहीत फ़ाइलों और MOB फ़ाइलों के बीच स्थानांतरित करने की अनुमति है। डिफ़ॉल्ट सीमा 100KB है।
जैसा कि नीचे दिखाया गया है, जिन कक्षों में MOB फ़ाइलों के पथ होते हैं उन्हें संदर्भ कक्ष . कहा जाता है . टैग कोशिकाओं में बने रहते हैं, इसलिए हम HBase सुरक्षा तंत्र पर भरोसा करना जारी रख सकते हैं।
संदर्भ कोशिकाओं में संदर्भ टैग होते हैं जो उन्हें सामान्य कोशिकाओं से अलग करते हैं। एक संदर्भ टैग एक MOB फ़ाइल में एक MOB सेल को दर्शाता है, और इस प्रकार पढ़ने में और अधिक समाधान की आवश्यकता होती है।
पढ़ने में, स्टोर स्कैनर फाइलों को मेमस्टोर और स्टोर करने के लिए स्कैनर खोलता है। यदि कोई संदर्भ सेल मिलता है, तो स्कैनर सेल मान से फ़ाइल पथ को पढ़ता है, और उस फ़ाइल से उसी पंक्ति कुंजी की तलाश करता है। स्कैन में MOB फ़ाइलों के लिए ब्लॉक कैश को सक्षम किया जा सकता है, जो खोज में तेजी ला सकता है।
सभी एमओबी फाइलों के लिए पाठकों को खोलना जरूरी नहीं है; आवश्यकता पड़ने पर केवल एक की आवश्यकता होती है। यह यादृच्छिक पठन MOB फ़ाइलों की संख्या से प्रभावित नहीं होता है। इसलिए, हमें MOB फ़ाइलों को बार-बार संकुचित करने की आवश्यकता नहीं है, जब वे पर्याप्त रूप से बड़ी हों।
MOB फ़ाइल नाम पठनीय है, और इसमें तीन भाग शामिल हैं:प्रारंभ कुंजी का MD5, इस MOB फ़ाइल में कक्षों की नवीनतम तिथि और एक UUID। पहला भाग उस क्षेत्र की प्रारंभ कुंजी है जहां से यह MOB फ़ाइल फ़्लश की जाती है। आम तौर पर, MOB में एक उपयोगकर्ता-परिभाषित TTL होता है, इसलिए आप TTL के साथ दूसरे भाग की तुलना करके समाप्त हो चुकी MOB फ़ाइलों को ढूंढ और हटा सकते हैं।
स्नैपशॉट
स्नैपशॉट के लिए अधिक अनुकूल होने के लिए, MOB फ़ाइलों को एक विशेष डमी क्षेत्र में संग्रहीत किया जाता है, जिससे स्नैपशॉट, तालिका निर्यात/क्लोन, और संग्रह अपेक्षा के अनुरूप काम करते हैं।
किसी तालिका में स्नैपशॉट संग्रहीत करते समय, कोई स्नैपशॉट में MOB क्षेत्र बनाता है, और मौजूदा MOB फ़ाइलों को मेनिफेस्ट में जोड़ता है। स्नैपशॉट को पुनर्स्थापित करते समय, MOB क्षेत्र में फ़ाइल लिंक बनाएँ।
स्वच्छ और संघनन
दो स्थितियां हैं जब एमओबी फाइलों को हटा दिया जाना चाहिए:जब एमओबी फाइल की समय सीमा समाप्त हो जाती है, और जब एमओबी फाइल बहुत छोटी होती है और एचडीएफएस दक्षता में सुधार के लिए बड़े लोगों में विलय किया जाना चाहिए।
HBase MOB में मास्टर में एक काम है:यह MOB फ़ाइलों को स्कैन करता है, फ़ाइल नाम में दिनांक द्वारा निर्धारित समय सीमा समाप्त को ढूंढता है, और उन्हें हटा देता है। इस प्रकार समय-समय पर समाप्त हो चुकी MOB फ़ाइलों को पुराना करके डिस्क स्थान को पुनः प्राप्त किया जाता है।
यदि आप ऐसी पंक्तियाँ लिखते हैं जहाँ केवल कुछ प्रविष्टियाँ MOB के रूप में योग्य होती हैं, तो HDFS ब्लॉक की तुलना में MOB फ़ाइलें अपेक्षाकृत छोटी हो सकती हैं; साथ ही, हटाए गए सेल भी हो सकते हैं। एचडीएफएस उपयोग को बेहतर बनाने के लिए आपको हटाए गए सेल को छोड़ने और छोटी फाइलों को बड़ी फाइलों में मर्ज करने की आवश्यकता है। MOB संघनन केवल छोटी फ़ाइलों को संकुचित करता है और बड़ी फ़ाइलों को स्पर्श नहीं किया जाता है, जो बड़ी फ़ाइलों को बार-बार संघनन से बचाता है।
ध्यान रखने योग्य कुछ अन्य बातें:
- जानें कि कौन से सेल डिलीट किए गए हैं। प्रत्येक HBase प्रमुख संघनन में, हटाए जाने वाले मार्करों को गिराए जाने से पहले एक डेल फ़ाइल में लिखा जाता है।
- MOB संघनन के पहले चरण में, इन डेल फ़ाइलों को बड़ी फ़ाइलों में मिला दिया जाता है।
- सभी छोटी MOB फ़ाइलें चयनित हैं। यदि छोटी फ़ाइलों की संख्या मौजूदा MOB फ़ाइलों की संख्या के बराबर है, तो इस संघनन को एक प्रमुख संघनन माना जाता है और इसे ALL_FILES संघनन कहा जाता है।
- इन चयनित फ़ाइलों को फ़ाइल नाम में प्रारंभ कुंजी और दिनांक द्वारा विभाजित किया गया है। प्रत्येक विभाजन में छोटी फाइलें डेल फाइलों के साथ संकुचित होती हैं ताकि हटाए गए कोशिकाओं को छोड़ा जा सके; इस बीच, नई संदर्भ कोशिकाओं के साथ एक नया HFile उत्पन्न होता है, कम्पेक्टर नई MOB फ़ाइल करता है, और फिर यह इस HFile को HBase में थोक में लोड करता है।
- सभी विभाजनों में संघनन समाप्त होने के बाद, यदि कोई ALL_FILES संघनन शामिल है, तो डेल फ़ाइलें संग्रहीत की जाती हैं।
एमओबी फाइलों का जीवन चक्र नीचे दिखाया गया है। मूल रूप से, वे तब बनाए जाते हैं जब मेमस्टोर को फ्लश किया जाता है, और फाइल सिस्टम से HFileCleaner द्वारा हटा दिया जाता है जब उन्हें स्नैपशॉट द्वारा संदर्भित नहीं किया जाता है या संग्रह में समाप्त हो जाता है।
निष्कर्ष
संक्षेप में, नया HBase MOB डिज़ाइन अधिकांश सुरक्षा, संघनन और स्नैपशॉटिंग सुविधाओं को बनाए रखते हुए MOB को HBase के मुख्य I/O पथ से बाहर ले जाता है। यह एमओबी में संचालन की विशेषताओं को पूरा करता है, एमओबी के लेखन प्रवर्धन को अधिक अनुमानित बनाता है, और पढ़ने और लिखने दोनों में कम विलंबता रखता है।
जिनचेंग डू इंटेल में एक सॉफ्टवेयर इंजीनियर और एक HBase योगदानकर्ता है।
जॉन हसीह क्लौडेरा में एक सॉफ्टवेयर इंजीनियर और एक HBase कमिटर/पीएमसी सदस्य हैं। वह Apache Flume के संस्थापक और Apache Sqoop के कमिटर भी हैं।