HBase
 sql >> डेटाबेस >  >> NoSQL >> HBase

अपाचे HBase I/O - HFile

परिचय

Apache HBase, Hadoop ओपन-सोर्स, डिस्ट्रिब्यूटेड, वर्जनेड स्टोरेज मैनेजर है, जो यादृच्छिक के लिए उपयुक्त है। , रीयलटाइम पढ़ें/लिखें पहुंच।

रूको रूको? रैंडम, रीयल टाइम रीड/राइट एक्सेस?
यह कैसे संभव है? क्या Hadoop केवल एक अनुक्रमिक पढ़ने/लिखने, बैच प्रोसेसिंग सिस्टम नहीं है?

हां, हम उसी के बारे में बात कर रहे हैं, और अगले कुछ अनुच्छेदों में, मैं आपको समझाऊंगा कि HBase कैसे यादृच्छिक I/O प्राप्त करता है, यह कैसे डेटा संग्रहीत करता है और HBase के HFile प्रारूप का विकास कैसे करता है।

अपाचे Hadoop I/O फ़ाइल स्वरूप

Hadoop एक SequenceFile[1] फ़ाइल स्वरूप के साथ आता है जिसका उपयोग आप अपने कुंजी/मूल्य जोड़े को जोड़ने के लिए कर सकते हैं लेकिन hdfs केवल परिशिष्ट क्षमता के कारण, फ़ाइल प्रारूप किसी सम्मिलित मान को संशोधित या हटाने की अनुमति नहीं दे सकता है। केवल अनुमत ऑपरेशन संलग्न है, और यदि आप एक निर्दिष्ट कुंजी देखना चाहते हैं, तो आपको फ़ाइल को तब तक पढ़ना होगा जब तक आपको अपनी कुंजी नहीं मिल जाती।

जैसा कि आप देख सकते हैं, आपको अनुक्रमिक पढ़ने/लिखने के पैटर्न का पालन करने के लिए मजबूर किया जाता है ... लेकिन इसके शीर्ष पर HBase जैसी यादृच्छिक, कम-विलंबता पढ़ने/लिखने की पहुंच प्रणाली बनाना कैसे संभव है?

इस समस्या को हल करने में आपकी मदद करने के लिए Hadoop का एक अन्य फ़ाइल स्वरूप है, जिसे MapFile[1] कहा जाता है, जो SequenceFile का एक एक्सटेंशन है। MapFile, वास्तव में, एक निर्देशिका है जिसमें दो अनुक्रम फ़ाइलें होती हैं:डेटा फ़ाइल "/ डेटा" और अनुक्रमणिका फ़ाइल "/ अनुक्रमणिका"। MapFile आपको सॉर्ट किए गए कुंजी/मान जोड़े और प्रत्येक N कुंजी (जहां N एक कॉन्फ़िगर करने योग्य अंतराल है) को जोड़ने की अनुमति देता है, यह कुंजी और ऑफ़सेट को अनुक्रमणिका में संग्रहीत करता है। यह काफी तेजी से देखने की अनुमति देता है, क्योंकि सभी रिकॉर्ड स्कैन करने के बजाय आप उस इंडेक्स को स्कैन करते हैं जिसमें कम प्रविष्टियां होती हैं। एक बार जब आपको अपना ब्लॉक मिल जाए, तो आप वास्तविक डेटा फ़ाइल में जा सकते हैं।

MapFile अच्छा है क्योंकि आप जल्दी से कुंजी/मूल्य जोड़े देख सकते हैं लेकिन अभी भी दो समस्याएं हैं:

  • मैं किसी कुंजी/मान को कैसे हटा या बदल सकता हूं?
  • जब मेरा इनपुट सॉर्ट नहीं किया जाता है, तो मैं MapFile का उपयोग नहीं कर सकता।

HBase और MapFile

HBase कुंजी में निम्न शामिल हैं:पंक्ति कुंजी, स्तंभ परिवार, स्तंभ योग्यता, टाइमस्टैम्प और एक प्रकार।

कुंजी / मान जोड़े को हटाने की समस्या को हल करने के लिए, विचार "प्रकार" फ़ील्ड का उपयोग कुंजी को हटाए गए (टॉम्बस्टोन मार्कर) के रूप में चिह्नित करने के लिए करना है। कुंजी/मान जोड़े को बदलने की समस्या का समाधान केवल बाद के टाइमस्टैम्प को चुनने की बात है (सही मान फ़ाइल के अंत के पास है, केवल संलग्न करें का अर्थ है कि अंतिम डाला गया अंत के पास है)।

"गैर-आदेशित" कुंजी समस्या को हल करने के लिए हम स्मृति में अंतिम जोड़े गए कुंजी-मान रखते हैं। जब आप एक सीमा तक पहुँच जाते हैं, तो HBase इसे MapFile पर फ़्लश कर देता है। इस तरह, आप MapFile में क्रमबद्ध कुंजी/मान जोड़ते हैं।

HBase ठीक यही करता है[2]:जब आप table.put() के साथ कोई मान जोड़ते हैं, तो आपकी कुंजी/मान MemStore में जुड़ जाता है (हुड के तहत MemStore एक सॉर्ट किया गया ConcurrentSkipListMap है)। जब प्रति-मेमस्टोर थ्रेशोल्ड (hbase.hregion.memstore.flush.size) तक पहुंच जाता है या रीजनसर्वर मेमस्टोर्स (hbase.regionserver.global.memstore.upperLimit) के लिए बहुत अधिक मेमोरी का उपयोग कर रहा है, तो डेटा डिस्क पर एक नए MapFile के रूप में फ़्लश किया जाता है। ।

प्रत्येक फ्लश का परिणाम एक नया MapFile है, और इसका मतलब है कि एक कुंजी खोजने के लिए आपको एक से अधिक फ़ाइल में खोजना होगा। यह अधिक संसाधन लेता है और संभावित रूप से धीमा है।

हर बार एक प्राप्त या स्कैन जारी किया जाता है, परिणाम खोजने के लिए HBase प्रत्येक फ़ाइल के माध्यम से स्कैन करता है, बहुत अधिक फ़ाइलों के आसपास कूदने से बचने के लिए, एक थ्रेड होता है जो यह पता लगाएगा कि आप एक निश्चित संख्या में फ़ाइलों तक पहुँच चुके हैं (hbase.hstore.compaction अधिकतम)। इसके बाद यह उन्हें कॉम्पैक्शन नामक प्रक्रिया में एक साथ मर्ज करने का प्रयास करता है, जो मूल रूप से फ़ाइल मर्ज के परिणामस्वरूप एक नई बड़ी फ़ाइल बनाता है।

HBase में दो प्रकार के संघनन होते हैं:एक जिसे "मामूली संघनन" कहा जाता है, जो केवल दो या दो से अधिक छोटी फ़ाइलों को एक में मिलाता है, और दूसरे को "प्रमुख संघनन" कहा जाता है जो क्षेत्र की सभी फ़ाइलों को उठाता है, उन्हें मर्ज करता है और कुछ सफाई करता है। एक प्रमुख संघनन में, हटाए गए कुंजी/मान हटा दिए जाते हैं, इस नई फ़ाइल में टॉम्बस्टोन मार्कर नहीं होते हैं और सभी डुप्लिकेट कुंजी/मान (प्रतिस्थापन मान संचालन) हटा दिए जाते हैं।

संस्करण 0.20 तक, HBase ने डेटा को संग्रहीत करने के लिए MapFile प्रारूप का उपयोग किया है, लेकिन 0.20 में एक नया HBase-विशिष्ट MapFile (HBASE-61) पेश किया गया था।

HFile v1

HBase 0.20 में, MapFile को HFile द्वारा प्रतिस्थापित किया जाता है:HBase के लिए एक विशिष्ट मानचित्र फ़ाइल कार्यान्वयन। यह विचार काफी हद तक MapFile के समान है, लेकिन यह केवल एक सामान्य कुंजी/मान फ़ाइल की तुलना में अधिक सुविधाएँ जोड़ता है। मेटाडेटा और अनुक्रमणिका के लिए समर्थन जैसी सुविधाओं को अब एक ही फ़ाइल में रखा गया है।

डेटा ब्लॉक में MapFile के रूप में वास्तविक कुंजी/मान होते हैं। प्रत्येक "ब्लॉक क्लोज ऑपरेशन" के लिए पहली कुंजी को इंडेक्स में जोड़ा जाता है, और इंडेक्स को HFile क्लोज पर लिखा जाता है।

एचएफआईएल प्रारूप दो अतिरिक्त "मेटाडेटा" ब्लॉक प्रकार भी जोड़ता है:मेटा और फाइलइन्फो। फ़ाइल बंद होने पर ये दो कुंजी/मान ब्लॉक लिखे जाते हैं।

मेटा ब्लॉक को एक स्ट्रिंग के रूप में अपनी कुंजी के साथ बड़ी मात्रा में डेटा रखने के लिए डिज़ाइन किया गया है, जबकि FileInfo एक साधारण मानचित्र है जिसे छोटी जानकारी के लिए पसंद किया जाता है जिसमें कुंजी और मान दोनों बाइट-सरणी होते हैं। रीजनसर्वर का स्टोरफाइल ब्लूम फिल्टर को स्टोर करने के लिए मेटा-ब्लॉक का उपयोग करता है, और फाइलइन्फो मैक्स सीक्वेंसआईड, प्रमुख संघनन कुंजी और टाइमरेंज जानकारी के लिए। यह जानकारी फ़ाइल को पढ़ने से बचने के लिए उपयोगी है यदि कोई मौका नहीं है कि कुंजी मौजूद है (ब्लूम फ़िल्टर), यदि फ़ाइल बहुत पुरानी है (अधिकतम अनुक्रम आईडी) या यदि फ़ाइल बहुत नई है (टाइमरेंज) जो हम देख रहे हैं उसे शामिल करने के लिए के लिए।

HFile v2

HBase 0.92 में, बड़ी मात्रा में डेटा संग्रहीत होने पर प्रदर्शन को बेहतर बनाने के लिए HFile प्रारूप को थोड़ा (HBASE-3857) बदल दिया गया था। HFile v1 के साथ मुख्य समस्याओं में से एक यह है कि आपको सभी मोनोलिथिक इंडेक्स और बड़े ब्लूम फ़िल्टर को मेमोरी में लोड करने की आवश्यकता है, और इस समस्या को हल करने के लिए v2 मल्टी-लेवल इंडेक्स और एक ब्लॉक-लेवल ब्लूम फ़िल्टर पेश करता है। परिणामस्वरूप, HFile v2  बेहतर गति, मेमोरी और कैशे उपयोग की सुविधा देता है।

इस v2 की मुख्य विशेषता "इनलाइन ब्लॉक" है, यह विचार पूरे इंडेक्स और ब्लूम फ़िल्टर को मेमोरी में रखने के बजाय इंडेक्स और ब्लूम फ़िल्टर प्रति ब्लॉक को तोड़ना है। इस तरह आप RAM में वही रख सकते हैं जिसकी आपको आवश्यकता है।

चूंकि सूचकांक को ब्लॉक स्तर पर ले जाया जाता है, तो आपके पास एक बहु-स्तरीय सूचकांक होता है, जिसका अर्थ है कि प्रत्येक ब्लॉक का अपना सूचकांक (पत्ती-सूचकांक) होता है। प्रत्येक ब्लॉक की अंतिम कुंजी इंटरमीडिएट/इंडेक्स बनाने के लिए रखी जाती है जो मल्टीलेवल-इंडेक्स b+tree जैसा बनाती है।

ब्लॉक हेडर में अब कुछ जानकारी है:"ब्लॉक मैजिक" फ़ील्ड को "ब्लॉक टाइप" फ़ील्ड से बदल दिया गया था जो ब्लॉक "डेटा", लीफ-इंडेक्स, ब्लूम, मेटाडेटा, रूट-इंडेक्स, आदि की सामग्री का वर्णन करता है। साथ ही तीन फ़ील्ड्स (संपीड़ित/असंपीड़ित आकार और ऑफ़सेट पिछला ब्लॉक) को तेज़ बैकवर्ड और फ़ॉरवर्ड सीक्स की अनुमति देने के लिए जोड़ा गया था।

डेटा ब्लॉक एन्कोडिंग

चूंकि कुंजियाँ क्रमबद्ध होती हैं और आमतौर पर बहुत समान होती हैं, इसलिए एक सामान्य प्रयोजन एल्गोरिथम की तुलना में बेहतर संपीड़न डिजाइन करना संभव है।

HBASE-4218 ने इस समस्या को हल करने का प्रयास किया, और HBase 0.94 में आप दो अलग-अलग एल्गोरिदम के बीच चयन कर सकते हैं:उपसर्ग और डिफ एन्कोडिंग।

उपसर्ग एन्कोडिंग का मुख्य विचार सामान्य उपसर्ग को केवल एक बार संग्रहीत करना है, क्योंकि पंक्तियों को क्रमबद्ध किया जाता है और शुरुआत आमतौर पर समान होती है।

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

ध्यान दें कि यह सुविधा डिफ़ॉल्ट रूप से बंद है क्योंकि लेखन और स्कैनिंग धीमी है लेकिन अधिक डेटा कैश किया गया है। इस सुविधा को सक्षम करने के लिए आप DATA_BLOCK_ENCODING =PREFIX | . सेट कर सकते हैं डीआईएफएफ | तालिका जानकारी में FAST_DIFF।

HFile v3

HBASE-5313 में संपीड़न में सुधार के लिए HFile लेआउट के पुनर्गठन का प्रस्ताव है:

  • ब्लॉक की शुरुआत में सभी कुंजियों को एक साथ और ब्लॉक के अंत में सभी मानों को एक साथ पैक करें। इस तरह आप कुंजी और मानों को संपीड़ित करने के लिए दो अलग-अलग एल्गोरिदम का उपयोग कर सकते हैं।
  • एक्सओआर का उपयोग करके टाइमस्टैम्प को पहले मान के साथ संपीड़ित करें और लंबे के बजाय VInt का उपयोग करें।

इसके अलावा, कॉलमर फॉर्मेट या कॉलमर एन्कोडिंग की जांच की जा रही है, डॉग कटिंग द्वारा कॉलमर फाइल फॉर्मेट के लिए AVRO-806 पर एक नज़र डालें।

जैसा कि आप देख सकते हैं कि विकास में प्रवृत्ति यह है कि फ़ाइल में क्या है, इसके बारे में अधिक जागरूक होना, बेहतर संपीड़न या बेहतर स्थान जागरूकता प्राप्त करना जो डिस्क से लिखने/पढ़ने के लिए कम डेटा में अनुवाद करता है। कम I/O का अर्थ है अधिक गति!

[1] https://clouderatemp.wpengine.com/blog/2011/01/hadoop-io-sequence-map-set-array-bloommap-files/
[2] https://clouderatemp.wpengine। कॉम/ब्लॉग/2012/06/एचबेस-राइट-पथ/


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. सैंटेंडर के पास रीयल-टाइम डेटा इंजेस्ट आर्किटेक्चर के अंदर

  2. क्लाउडेरा ऑपरेशनल डेटाबेस प्रतिकृति संक्षेप में

  3. कैसे करें:HBase बल्क लोडिंग का उपयोग करें, और क्यों

  4. सीडीपी परिचालन डेटाबेस (सीओडी) पर अनुप्रयोगों को तैनात करना

  5. अगला पड़ाव - एज से इनसाइट तक डेटा पाइपलाइन का निर्माण