6.1 HBase का आविष्कार किसने और क्यों किया
इस व्याख्यान में, हम Hbase जैसे अद्भुत उपकरण के बारे में बात करेंगे, जिसने हाल ही में बहुत लोकप्रियता हासिल की है: उदाहरण के लिए, फेसबुक इसे अपने संदेश प्रणाली के आधार के रूप में उपयोग करता है, और यह पहले से ही बहुत कुछ कहता है।
व्याख्यान बिग टेबल की अवधारणा और इसके नि: शुल्क कार्यान्वयन, शास्त्रीय संबंधपरक डेटाबेस (जैसे MySQL और Oracle) और रेडिस, एयरोस्पाइक और मेमकैच जैसे कुंजी-मूल्य भंडारण दोनों से काम की विशेषताओं और अंतर के बारे में बात करेगा। हमेशा की तरह, चलिए मुद्दे के इतिहास से शुरू करते हैं। कई अन्य BigData परियोजनाओं की तरह, Hbase का जन्म एक ऐसी अवधारणा से हुआ था जिसे Google द्वारा विकसित किया गया था। Hbase के पीछे के सिद्धांतों को बिगटेबल: स्ट्रक्चर्ड डेटा के लिए एक वितरित स्टोरेज सिस्टम लेख में वर्णित किया गया था ।
जैसा कि हमने पिछले व्याख्यानों में चर्चा की थी, सामान्य फाइलें MapReduce प्रतिमान का उपयोग करके बैच डेटा प्रोसेसिंग के लिए काफी अनुकूल हैं। दूसरी ओर, फ़ाइलों में संग्रहीत जानकारी अद्यतन करने के लिए असुविधाजनक है; फाइलें रैंडम एक्सेस की संभावना से भी वंचित हैं। रैंडम एक्सेस के साथ त्वरित और सुविधाजनक काम के लिए, एयरोस्पाइक, रेडिस, काउचबेस, मेमकेच्ड जैसे की-वैल्यू स्टोरेज जैसे नोस्कल सिस्टम का एक वर्ग है। हालाँकि, इन प्रणालियों में बैच प्रोसेसिंग आमतौर पर बहुत असुविधाजनक होती है। Hbase अद्यतन और रैंडम एक्सेस की सुविधा के साथ बैच प्रोसेसिंग की सुविधा को संयोजित करने का एक प्रयास है।
![](https://cdn.codegym.cc/images/article/54d64a29-4642-4c59-8211-2b143dfcd48a/512.jpeg)
6.2 डेटा मॉडल
HBase एक वितरित, कॉलम-ओरिएंटेड, मल्टीवर्सन की-वैल्यू डेटाबेस है।
- डेटा को Hbase में RowKey नामक प्राथमिक कुंजी द्वारा अनुक्रमित तालिकाओं में व्यवस्थित किया जाता है।
- प्रत्येक RowKey कुंजी के लिए, विशेषताओं (या कॉलम) का असीमित सेट संग्रहीत किया जा सकता है।
- स्तंभों को स्तंभों के समूहों में व्यवस्थित किया जाता है जिन्हें स्तंभ परिवार कहा जाता है। एक नियम के रूप में, समान उपयोग और संग्रहण पैटर्न वाले स्तंभों को एक स्तंभ परिवार में संयोजित किया जाता है।
- प्रत्येक विशेषता के लिए, कई अलग-अलग संस्करण संग्रहीत किए जा सकते हैं। अलग-अलग संस्करणों में अलग-अलग टाइमस्टैम्प होते हैं।
रिकॉर्ड्स भौतिक रूप से RowKey सॉर्ट किए गए क्रम में संग्रहीत किए जाते हैं। इस मामले में, अलग-अलग कॉलम परिवार से संबंधित डेटा को अलग से संग्रहीत किया जाता है, जो आवश्यक होने पर केवल वांछित कॉलम परिवार से डेटा पढ़ने की अनुमति देता है।
जब एक निश्चित विशेषता हटा दी जाती है, तो इसे तुरंत भौतिक रूप से हटाया नहीं जाता है, लेकिन केवल एक विशेष समाधि ध्वज के साथ चिह्नित किया जाता है। डेटा का भौतिक विलोपन बाद में होगा, जब मेजर कॉम्पैक्शन ऑपरेशन किया जाएगा।
एक ही कॉलम समूह से संबंधित गुण और एक ही कुंजी से संबंधित भौतिक रूप से क्रमबद्ध सूची के रूप में संग्रहीत होते हैं। प्रत्येक कुंजी के लिए कोई भी विशेषता अनुपस्थित या मौजूद हो सकती है, और यदि विशेषता अनुपस्थित है, तो यह खाली मानों को संग्रहित करने के ऊपरी हिस्से का कारण नहीं बनता है।
सूची और स्तंभ समूह के नाम निश्चित हैं और एक स्पष्ट लेआउट है। स्तंभ समूह स्तर पर, रहने का समय (TTL) और संग्रहीत संस्करणों की अधिकतम संख्या जैसे पैरामीटर सेट किए गए हैं। यदि किसी विशेष संस्करण के टाइमस्टैम्प और वर्तमान समय के बीच का अंतर TTL से अधिक है, तो प्रविष्टि को हटाने के लिए चिह्नित किया जाता है। यदि किसी विशेष विशेषता के संस्करणों की संख्या संस्करणों की अधिकतम संख्या से अधिक हो जाती है, तो रिकॉर्ड को हटाने के लिए भी चिह्नित किया जाता है।
![](https://cdn.codegym.cc/images/article/38a31201-f909-4a45-9792-a5d72225f060/512.jpeg)
Hbase डेटा मॉडल को की-वैल्यू मैच के रूप में याद किया जा सकता है:
<table, RowKey, Column Family, Column, timestamp> -> Value
6.3 समर्थित संचालन
hbase में समर्थित संचालनों की सूची काफी सरल है। 4 मुख्य संचालन समर्थित हैं:
- पुट : hbase में एक नई प्रविष्टि जोड़ें। इस प्रविष्टि का टाइमस्टैम्प हाथ से सेट किया जा सकता है, अन्यथा यह स्वचालित रूप से वर्तमान समय पर सेट हो जाएगा।
- प्राप्त करें : विशिष्ट RowKey के लिए डेटा प्राप्त करें। आप कॉलम परिवार निर्दिष्ट कर सकते हैं जिससे हम डेटा लेंगे और संस्करणों की संख्या जिन्हें हम पढ़ना चाहते हैं।
- स्कैन : एक-एक करके रिकॉर्ड पढ़ें। आप उस रिकॉर्ड को निर्दिष्ट कर सकते हैं जिससे हम पढ़ना शुरू करते हैं, जिस रिकॉर्ड को पढ़ना है, पढ़ने के लिए रिकॉर्ड की संख्या, कॉलम परिवार जिसमें से रीडिंग की जाएगी और प्रत्येक रिकॉर्ड के लिए अधिकतम संस्करण।
- हटाएं : हटाने के लिए एक विशिष्ट संस्करण को चिह्नित करें। कोई भौतिक विलोपन नहीं होगा, इसे अगले प्रमुख संघनन तक स्थगित कर दिया जाएगा (नीचे देखें)।
6.4 वास्तुकला
HBase एक वितरित डेटाबेस है जो दर्जनों या सैकड़ों भौतिक सर्वरों पर चल सकता है, उनमें से कुछ के विफल होने पर भी निर्बाध संचालन सुनिश्चित करता है। इसलिए, क्लासिक रिलेशनल डेटाबेस की तुलना में HBase का आर्किटेक्चर काफी जटिल है।
![](https://cdn.codegym.cc/images/article/5bae086c-b213-47db-be33-a23d854a1543/1024.jpeg)
HBase अपने काम के लिए दो मुख्य प्रक्रियाओं का उपयोग करता है:
1. क्षेत्र सर्वर - एक या अधिक क्षेत्रों में कार्य करता है। एक क्षेत्र लगातार RowKeys की एक विशिष्ट श्रेणी के अनुरूप रिकॉर्ड की एक श्रृंखला है। प्रत्येक क्षेत्र में शामिल हैं:
- परसिस्टेंट स्टोरेज HBase का मुख्य डेटा स्टोरेज है। डेटा भौतिक रूप से एचडीएफएस पर एक विशेष एचएफआईएल प्रारूप में संग्रहीत किया जाता है। HFile में डेटा RowKey क्रमबद्ध क्रम में संग्रहित है। एक जोड़ी (क्षेत्र, स्तंभ परिवार) कम से कम एक HFIle से मेल खाती है।
- मेमस्टोर - बफर लिखें। चूँकि डेटा HFile d में क्रमबद्ध क्रम में संग्रहीत है, इसलिए HFile को प्रति रिकॉर्ड अपडेट करना काफी महंगा है। इसके बजाय, लिखते समय, डेटा एक विशेष मेमस्टोर मेमोरी क्षेत्र में प्रवेश करता है, जहां यह कुछ समय के लिए जमा होता है। जब MemStore कुछ महत्वपूर्ण मान भर जाता है, तो डेटा को एक नए HFile में लिखा जाता है।
- BlockCache - पढ़ने के लिए कैश। आपको बार-बार पढ़े जाने वाले डेटा पर महत्वपूर्ण रूप से समय बचाने की अनुमति देता है।
- आगे लॉग लिखें (वाल) । चूँकि डेटा मेमस्टोर में लिखा जाता है, क्रैश के कारण डेटा हानि का कुछ जोखिम होता है। ऐसा होने से रोकने के लिए, हेरफेर के वास्तविक कार्यान्वयन से पहले सभी ऑपरेशन एक विशेष लॉग फ़ाइल में आते हैं। यह आपको किसी भी विफलता के बाद डेटा पुनर्प्राप्त करने की अनुमति देता है।
2. मास्टर सर्वर - HBase क्लस्टर में मुख्य सर्वर। मास्टर क्षेत्र सर्वरों के बीच क्षेत्रों के वितरण का प्रबंधन करता है, क्षेत्रों के एक रजिस्टर को बनाए रखता है, नियमित कार्यों के प्रक्षेपण का प्रबंधन करता है और अन्य उपयोगी कार्य करता है।
सेवाओं के बीच क्रियाओं को समन्वित करने के लिए, HBase Apache ZooKeeper का उपयोग करता है, जो कॉन्फ़िगरेशन प्रबंधित करने और सेवाओं को सिंक्रनाइज़ करने के लिए डिज़ाइन की गई एक विशेष सेवा है।
जब क्षेत्र में डेटा की मात्रा बढ़ जाती है और यह एक निश्चित आकार तक पहुंच जाता है, तो Hbase विभाजन शुरू कर देता है, एक ऑपरेशन जो क्षेत्र को 2 से विभाजित करता है। क्षेत्रों के निरंतर विभाजन से बचने के लिए, आप क्षेत्रों की सीमाओं को पूर्व निर्धारित कर सकते हैं और उनकी अधिकतम वृद्धि कर सकते हैं। आकार।
चूँकि एक क्षेत्र का डेटा कई HFiles में संग्रहीत किया जा सकता है, Hbase समय-समय पर काम को गति देने के लिए उन्हें एक साथ मिला देता है। इस ऑपरेशन को Hbase में संघनन कहा जाता है। संघनन दो प्रकार के होते हैं:
- मामूली संघनन । स्वचालित रूप से प्रारंभ होता है, पृष्ठभूमि में चलता है। अन्य Hbase संचालन की तुलना में इसकी प्राथमिकता कम है।
- प्रमुख संघनन । इसे हाथ से या कुछ ट्रिगर्स (उदाहरण के लिए, टाइमर द्वारा) की घटना पर लॉन्च किया जाता है। इसकी उच्च प्राथमिकता है और यह क्लस्टर को महत्वपूर्ण रूप से धीमा कर सकता है। प्रमुख संघनन उस समय सबसे अच्छा किया जाता है जब क्लस्टर पर लोड कम होता है। प्रमुख संघनन भी भौतिक रूप से पहले समाधि के साथ चिह्नित डेटा को हटा देता है।
6.5 HBase के साथ काम करने के तरीके
एचबेस शेल
Hbase के साथ आरंभ करने का सबसे आसान तरीका hbase शेल यूटिलिटी का उपयोग करना है। यह किसी भी hbase क्लस्टर नोड पर hbase को स्थापित करने के तुरंत बाद उपलब्ध होता है।![](https://cdn.codegym.cc/images/article/d13e20e1-fed9-444a-929c-15ab43d8209b/800.jpeg)
Hbase शेल एक जर्बी कंसोल है जिसमें सभी बुनियादी Hbase संचालन के लिए अंतर्निहित समर्थन है। निम्नलिखित दो स्तंभ परिवारों के साथ एक उपयोगकर्ता तालिका बनाने, उस पर कुछ जोड़तोड़ करने और hbase शेल में तालिका को अंत में छोड़ने का एक उदाहरण है:
create 'users', {NAME => 'user_profile', VERSIONS => 5}, {NAME => 'user_posts', VERSIONS => 1231231231}
put 'users', 'id1', 'user_profile:name', 'alexander'
put 'users', 'id1', 'user_profile:second_name', 'alexander'
get 'users', 'id1'
put 'users', 'id1', 'user_profile:second_name', 'kuznetsov'
get 'users', 'id1'
get 'users', 'id1', {COLUMN => 'user_profile:second_name', VERSIONS => 5}
put 'users', 'id2', 'user_profile:name', 'vasiliy'
put 'users', 'id2', 'user_profile:second_name', 'ivanov'
scan 'users', {COLUMN => 'user_profile:second_name', VERSIONS => 5}
delete 'users', 'id1', 'user_profile:second_name'
get 'users', 'id1'
disable 'users'
drop 'users'
देशी एपीआई
अधिकांश अन्य हडूप-संबंधित परियोजनाओं की तरह, hbase को जावा में लागू किया गया है, इसलिए मूल एपीआई जावा में उपलब्ध है। नेटिव एपीआई आधिकारिक वेबसाइट पर बहुत अच्छी तरह से प्रलेखित है। यहाँ से लिए गए Hbase API का उपयोग करने का एक उदाहरण दिया गया है:
import java.io.IOException;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
public class MyLittleHBaseClient {
public static void main(String[] args) throws IOException {
Configuration config = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(config);
try {
Table table = connection.getTable(TableName.valueOf("myLittleHBaseTable"));
try {
Put p = new Put(Bytes.toBytes("myLittleRow"));
p.add(Bytes.toBytes("myLittleFamily"), Bytes.toBytes("someQualifier"),
Bytes.toBytes("Some Value"));
table.put(p);
Get g = new Get(Bytes.toBytes("myLittleRow"));
Result r = table.get(g);
byte [] value = r.getValue(Bytes.toBytes("myLittleFamily"),
Bytes.toBytes("someQualifier"));
String valueStr = Bytes.toString(value);
System.out.println("GET: " + valueStr);
Scan s = new Scan();
s.addColumn(Bytes.toBytes("myLittleFamily"), Bytes.toBytes("someQualifier"));
ResultScanner scanner = table.getScanner(s);
try {
for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
System.out.println("Found row: " + rr);
}
} finally {
scanner.close();
}
} finally {
if (table != null) table.close();
}
} finally {
connection.close();
}
}
}
बचत, आराम और अन्य प्रोग्रामिंग भाषाओं के लिए समर्थन
अन्य प्रोग्रामिंग भाषाओं से काम करने के लिए, Hbase थ्रिफ्ट एपीआई और रेस्ट एपीआई प्रदान करता है। उनके आधार पर, सभी प्रमुख प्रोग्रामिंग भाषाओं के लिए क्लाइंट बनाए जाते हैं: पायथन, पीएचपी, जावा स्क्रिप्ट, आदि।
6.6 HBase के साथ काम करने की कुछ विशेषताएं
-
Hbase MapReduce के साथ बॉक्स से बाहर एकीकृत होता है, और विशेष TableInputFormat और TableOutputFormat का उपयोग करके इनपुट और आउटपुट के रूप में उपयोग किया जा सकता है।
-
सही RowKey चुनना बहुत महत्वपूर्ण है। RowKey को क्षेत्रों में एक अच्छा समान वितरण प्रदान करना चाहिए, अन्यथा तथाकथित "गर्म क्षेत्रों" का जोखिम होता है - ऐसे क्षेत्र जो दूसरों की तुलना में बहुत अधिक बार उपयोग किए जाते हैं, जो सिस्टम संसाधनों के अक्षम उपयोग की ओर जाता है।
-
यदि डेटा एकल रूप से अपलोड नहीं किया गया है, लेकिन तुरंत बड़े बैचों में, Hbase एक विशेष बल्कलोड तंत्र का समर्थन करता है जो आपको एकल पुट का उपयोग करने की तुलना में डेटा को बहुत तेज़ी से अपलोड करने की अनुमति देता है। बल्कलोड अनिवार्य रूप से एक दो-चरणीय ऑपरेशन है:
- एक विशेष MapReduce जॉब का उपयोग करके पुट की भागीदारी के बिना HFile का गठन
- इन फ़ाइलों को सीधे Hbase में सम्मिलित करना
-
Hbase अपने मेट्रिक्स को गैंग्लिया मॉनिटरिंग सर्वर पर आउटपुट करने का समर्थन करता है। HBase के मुद्दों की तह तक जाने के लिए HBase को प्रशासित करते समय यह बहुत मददगार हो सकता है।
पंक्ति कुंजी
RowKey यूजर आईडी है, जो एक GUID है, एक स्ट्रिंग विशेष रूप से दुनिया भर में अद्वितीय होने के लिए उत्पन्न होती है। GUID समान रूप से वितरित किए जाते हैं, जो सर्वरों में डेटा का अच्छा वितरण प्रदान करता है।
स्तंभ परिवार
हमारा भंडारण दो स्तंभ परिवारों का उपयोग करता है:
- आंकड़े। कॉलम का यह समूह डेटा संग्रहीत करता है जो अब विज्ञापन उद्देश्यों के लिए प्रासंगिक नहीं है, जैसे तथ्य यह है कि उपयोगकर्ता ने कुछ यूआरएल का दौरा किया है। इस कॉलम परिवार के लिए TTL 2 महीने पर सेट है, वर्शन की संख्या की सीमा 2000 है.
- longdata. स्तंभों का यह समूह डेटा संग्रहीत करता है जो समय के साथ अपनी प्रासंगिकता नहीं खोता है, जैसे कि लिंग, जन्म तिथि और अन्य "शाश्वत" उपयोगकर्ता विशेषताएं।
वक्ताओं
प्रत्येक प्रकार के उपयोगकर्ता तथ्यों को एक अलग कॉलम में संग्रहित किया जाता है। उदाहरण के लिए, डेटा: _v कॉलम उपयोगकर्ता द्वारा विज़िट किए गए URL को संग्रहीत करता है, और लॉन्गडेटा: लिंग कॉलम उपयोगकर्ता के लिंग को संग्रहीत करता है।
इस तथ्य की टाइम स्टैम्प को टाइमस्टैम्प के रूप में संग्रहीत किया जाता है। उदाहरण के लिए, डेटा: _v कॉलम में, टाइमस्टैम्प वह समय है जब उपयोगकर्ता किसी विशिष्ट URL पर जाता है।
यह उपयोगकर्ता डेटा भंडारण संरचना हमारे उपयोग पैटर्न के साथ बहुत अच्छी तरह से फिट बैठती है और आपको उपयोगकर्ता डेटा को जल्दी से अपडेट करने, उपयोगकर्ताओं के बारे में सभी आवश्यक जानकारी जल्दी से प्राप्त करने और MapReduce का उपयोग करके एक ही बार में सभी उपयोगकर्ताओं के डेटा को जल्दी से संसाधित करने की अनुमति देती है।
6.7 विकल्प
HBase प्रशासन और उपयोग करने के लिए काफी जटिल है, इसलिए HBase का उपयोग करने से पहले विकल्पों को देखना समझ में आता है:
-
संबंधपरक डेटाबेस । एक बहुत अच्छा विकल्प, विशेष रूप से उस स्थिति में जब डेटा एक मशीन पर फिट होता है। साथ ही, सबसे पहले, आपको उस मामले में रिलेशनल डेटाबेस के बारे में सोचना चाहिए जब प्राथमिक के अलावा अन्य इंडेक्स का लेनदेन महत्वपूर्ण हो।
-
की-वैल्यू स्टोरेज । Redis और Aerospike जैसे स्टोरेज तब बेहतर होते हैं जब विलंबता की आवश्यकता होती है और बैच प्रोसेसिंग कम महत्वपूर्ण होती है।
-
फ़ाइलें और उनका प्रसंस्करण MapReduce के साथ । यदि डेटा केवल जोड़ा जाता है और शायद ही कभी अपडेट/बदला जाता है, तो बेहतर है कि HBase का उपयोग न करें, लेकिन डेटा को फ़ाइलों में संग्रहीत करें। फ़ाइलों के साथ काम को आसान बनाने के लिए, आप हाइव, पिग और इम्पाला जैसे टूल का उपयोग कर सकते हैं।
HBase का उपयोग उचित है जब:
- बहुत अधिक डेटा है, और वे एक कंप्यूटर/सर्वर पर फिट नहीं होते हैं
- डेटा को अक्सर अपडेट और डिलीट किया जाता है
- डेटा में एक स्पष्ट "कुंजी" है, जिससे बाकी सब कुछ बांधना सुविधाजनक है
- बैच प्रोसेसिंग की जरूरत है
- विशिष्ट चाबियों द्वारा डेटा तक यादृच्छिक पहुंच की आवश्यकता है
GO TO FULL VERSION