Apache HBase तक पहुँचने और उसके साथ बातचीत करने के कई तरीके हैं। सबसे विशेष रूप से, जावा एपीआई सबसे अधिक कार्यक्षमता प्रदान करता है। लेकिन कुछ लोग जावा के बिना HBase का उपयोग करना चाहते हैं।
उन लोगों के पास दो मुख्य विकल्प हैं:एक थ्रिफ्ट इंटरफ़ेस है (अधिक हल्का और इसलिए दो विकल्पों में से तेज़), और दूसरा आरईएसटी इंटरफ़ेस (उर्फ स्टारगेट) है। एक आरईएसटी इंटरफ़ेस एक क्रिया करने के लिए HTTP क्रियाओं का उपयोग करता है। HTTP का उपयोग करके, एक आरईएसटी इंटरफ़ेस उन भाषाओं और कार्यक्रमों की एक विस्तृत श्रृंखला प्रदान करता है जो इंटरफ़ेस तक पहुंच सकते हैं। (यदि आप REST इंटरफ़ेस के बारे में अधिक जानकारी चाहते हैं, तो आप इसके बारे में कैसे करें की मेरी श्रृंखला पर जा सकते हैं।)
कैसे-कैसे की इस श्रृंखला में आप थ्रिफ्ट इंटरफ़ेस के बारे में अपना तरीका सीखेंगे और ऐसा करने के लिए पायथन कोड के नमूनों का पता लगाएंगे। यह पहली पोस्ट थ्रिफ्ट के साथ काम करने वाले एचबीज़ थ्रिफ्ट को कवर करेगी, और थ्रिफ्ट से कनेक्ट करने के लिए कुछ बॉयलरप्लेट कोड। दूसरी पोस्ट एक बार में कई पंक्तियों को सम्मिलित करने और प्राप्त करने का तरीका दिखाएगी। तीसरी पोस्ट यह बताएगी कि आरईएसटी और थ्रिफ्ट के बीच चयन करते समय स्कैन और कुछ विचारों का उपयोग कैसे करें।
पूरे कोड के नमूने मेरे GitHub खाते पर देखे जा सकते हैं।
HBase थ्रिफ्ट
थ्रिफ्ट एक सॉफ्टवेयर ढांचा है जो आपको क्रॉस-लैंग्वेज बाइंडिंग बनाने की अनुमति देता है। HBase के संदर्भ में, Java एकमात्र प्रथम श्रेणी का नागरिक है। हालांकि, HBase थ्रिफ्ट इंटरफ़ेस अन्य भाषाओं को जावा क्लाइंट के साथ इंटरफेस करने वाले थ्रिफ्ट सर्वर से कनेक्ट करके थ्रिफ्ट पर HBase तक पहुँचने की अनुमति देता है।
थ्रिफ्ट और आरईएसटी दोनों के काम करने के लिए, इन अनुरोधों को संभालने के लिए एक और एचबीएएस डिमन को चलाने की जरूरत है। इन डेमॉन को hbase-thrift और hbase-rest संकुल के साथ संस्थापित किया जा सकता है। नीचे दिया गया चित्र दिखाता है कि थ्रिफ्ट और आरईएसटी को क्लस्टर में कैसे रखा जाता है।
ध्यान दें कि थ्रिफ्ट और आरईएसटी क्लाइंट होस्ट आमतौर पर कोई अन्य सेवाएं (जैसे डेटानोड्स या रीजनसर्वर) नहीं चलाते हैं ताकि आरईएसटी या थ्रिफ्ट इंटरैक्शन के लिए ओवरहेड कम और प्रतिक्रियाशीलता उच्च रहे।
इन डेमॉन को उन नोड्स पर स्थापित करना और शुरू करना सुनिश्चित करें जिनके पास Hadoop क्लस्टर और HBase तक पहुंच की आवश्यकता वाले एप्लिकेशन दोनों तक पहुंच है। थ्रिफ्ट इंटरफ़ेस में कोई अंतर्निहित लोड संतुलन नहीं है, इसलिए सभी लोड संतुलन को बाहरी उपकरणों जैसे डीएनएस राउंड-रॉबिन, वर्चुअल आईपी एड्रेस या कोड में करने की आवश्यकता होगी। Cloudera Manager HBase REST और थ्रिफ्ट सेवाओं को स्थापित और प्रबंधित करना वास्तव में आसान बनाता है। आप Cloudera Standard में इसे मुफ्त में डाउनलोड और आज़मा सकते हैं!
थ्रिफ्ट का नकारात्मक पक्ष यह है कि इसे REST की तुलना में स्थापित करना अधिक कठिन है। आपको थ्रिफ्ट को संकलित करने और भाषा-विशिष्ट बाइंडिंग उत्पन्न करने की आवश्यकता होगी। ये बाइंडिंग अच्छे हैं क्योंकि वे आपको उस भाषा के लिए कोड देते हैं जिसमें आप काम कर रहे हैं - एक्सएमएल या जेएसओएन को आरईएसटी में पार्स करने की कोई आवश्यकता नहीं है; बल्कि, थ्रिफ्ट इंटरफ़ेस आपको पंक्ति डेटा तक सीधी पहुँच प्रदान करता है। एक और अच्छी विशेषता यह है कि थ्रिफ्ट प्रोटोकॉल में देशी बाइनरी ट्रांसपोर्ट है; आपको डेटा को बेस 64 एनकोड और डीकोड करने की आवश्यकता नहीं होगी।
थ्रिफ्ट इंटरफ़ेस का उपयोग शुरू करने के लिए, आपको यह पता लगाना होगा कि यह किस पोर्ट पर चल रहा है। सीडीएच के लिए डिफ़ॉल्ट पोर्ट पोर्ट 9090 है। इस पोस्ट के लिए, आप होस्ट और पोर्ट वेरिएबल का उपयोग देखेंगे, यहां वे मान हैं जिनका हम उपयोग करेंगे:
होस्ट ="लोकलहोस्ट" पोर्ट ="9090"
आप बेहतर सुरक्षा के लिए Kerberos क्रेडेंशियल का उपयोग करने के लिए थ्रिफ्ट इंटरफ़ेस सेट कर सकते हैं।
अपने कोड के लिए, आपको आईपी पते या नोड के पूरी तरह से योग्य डोमेन नाम और थ्रिफ्ट डेमॉन चलाने वाले पोर्ट का उपयोग करने की आवश्यकता होगी। मैं इस URL को एक चर बनाने की अत्यधिक अनुशंसा करता हूं क्योंकि यह नेटवर्क परिवर्तनों के साथ बदल सकता है।
भाषा बाइंडिंग
इससे पहले कि आप थ्रिफ्ट बाइंडिंग बना सकें, आपको थ्रिफ्ट को डाउनलोड और संकलित करना होगा। विंडोज़ को छोड़कर, थ्रिफ्ट के लिए कोई बाइनरी पैकेज नहीं है जो मुझे मिल सकता है। आपको अपने पसंद के प्लेटफॉर्म पर इंस्टालेशन के लिए थ्रिफ्ट के निर्देशों का पालन करना होगा।
एक बार थ्रिफ्ट स्थापित हो जाने के बाद, आपको Hbase.thrift फ़ाइल ढूंढनी होगी। थ्रिफ्ट में सेवाओं और डेटा प्रकारों को परिभाषित करने के लिए, आपको एक आईडीएल फ़ाइल बनानी होगी। सौभाग्य से, HBase डेवलपर्स ने पहले ही हमारे लिए एक बना लिया है। दुर्भाग्य से, फ़ाइल को CDH बाइनरी पैकेज के हिस्से के रूप में वितरित नहीं किया गया है। (हम भविष्य में सीडीएच रिलीज में इसे ठीक कर देंगे।) आपको एचबीएएस संस्करण का स्रोत पैकेज डाउनलोड करना होगा जिसका आप उपयोग कर रहे हैं। HBase के सही संस्करण का उपयोग करना सुनिश्चित करें क्योंकि यह IDL बदल सकता है। संपीड़ित फ़ाइल में, IDL का पथ hbase-VERSION/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift है।
थ्रिफ्ट जावा, सी ++, पायथन, पीएचपी, रूबी और सी # सहित 14 से अधिक भाषाओं के लिए भाषा बाइंडिंग उत्पन्न करने का समर्थन करता है। पायथन के लिए बाइंडिंग उत्पन्न करने के लिए, आप निम्न कमांड का उपयोग करेंगे:
थ्रिफ्ट-जेन py /path/to/hbase/source/hbase-VERSION/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
इसके बाद, आपको अपनी भाषा के लिए थ्रिफ्ट कोड प्राप्त करना होगा जिसमें थ्रिफ्ट और उसके प्रोटोकॉल के संबंध में सभी वर्ग शामिल हैं। यह कोड /path/to/thrift/thrift-0.9.0/lib/py/src/ पर पाया जा सकता है।
HBase थ्रिफ्ट का उपयोग करने के लिए पायथन प्रोजेक्ट बनाने के लिए मैंने जो आदेश दिए हैं, वे यहां दिए गए हैं:
$ mkdir HBaseThrift$ cd HBaseThrift/$ थ्रिफ्ट-जेन py ~/डाउनलोड/hbase-0.94.2-cdh4.2.0/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift$ mv जेन-पीई/* . $ rm -rf gen-py/$ mkdir थ्रिफ्ट$ cp -rp ~/डाउनलोड/थ्रिफ्ट-0.9.0/lib/py/src/* ./thrift/
मैं परियोजना में वापस संदर्भित करने के लिए Hbase.thrift फ़ाइल की एक प्रति रखना चाहता हूं। इसमें विभिन्न कॉल, डेटा ऑब्जेक्ट और रिटर्न ऑब्जेक्ट पर बहुत सारे "Javadoc" हैं।
$ cp ~/Downloads/hbase-0.94.2-cdh4.2.0/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
बॉयलरप्लेट कोड
आप पाएंगे कि आपकी सभी पायथन थ्रिफ्ट स्क्रिप्ट बहुत समान दिखाई देंगी। आइए प्रत्येक भाग को देखें।
थ्रिफ्ट.ट्रांसपोर्ट इंपोर्ट टीसॉकेटसे थ्रिफ्ट.प्रोटोकॉल इंपोर्ट टीबीनरीप्रोटोकॉलफ्रॉम थ्रिफ्ट.ट्रांसपोर्ट इम्पोर्ट टीट्रांसपोर्टफ्रॉम एचबेस इंपोर्ट एचबेस
ये आपके लिए आवश्यक थ्रिफ्ट और HBase मॉड्यूल आयात करेंगे।
# HBase थ्रिफ्ट सर्वरट्रांसपोर्ट से कनेक्ट करें =TTransport.TBufferedTransport(TSocket.TSocket(host, port))protocol =TBinaryProtocol.TBinaryProtocolAccelerated(transport)
यह सॉकेट ट्रांसपोर्ट और लाइन प्रोटोकॉल बनाता है और थ्रिफ्ट क्लाइंट को थ्रिफ्ट सर्वर से जुड़ने और बात करने की अनुमति देता है।
# क्लाइंट कनेक्शन क्लाइंट बनाएं और खोलें =Hbase.Client(protocol)transport.open()
ये लाइनें क्लाइंट ऑब्जेक्ट बनाती हैं जिसका उपयोग आप HBase के साथ इंटरैक्ट करने के लिए करेंगे। इस क्लाइंट ऑब्जेक्ट से, आप अपने सभी Gets and Puts जारी करेंगे। इसके बाद, सॉकेट को थ्रिफ्ट सर्वर पर खोलें।
# कुछ करें
आगे आप वास्तव में HBase क्लाइंट के साथ काम करेंगे। सब कुछ निर्मित, आरंभिक और जुड़ा हुआ है। सबसे पहले, क्लाइंट का उपयोग शुरू करें।
transport.close()
अंत में, परिवहन बंद करें। यह सॉकेट को बंद कर देता है और थ्रिफ्ट सर्वर पर संसाधनों को मुक्त कर देता है। आसान प्रतिलिपि बनाने और चिपकाने के लिए यहां पूरी तरह से कोड दिया गया है:
थ्रिफ्ट.ट्रांसपोर्ट इंपोर्ट टीसॉकेटसे थ्रिफ्ट.प्रोटोकॉल इंपोर्ट टीबीनरी प्रोटोकॉल से थ्रिफ्ट.ट्रांसपोर्ट इम्पोर्ट टीट्रांसपोर्टफ्रॉम एचबेस इंपोर्ट एचबेस# एचबीएएस थ्रिफ्ट सर्वरट्रांसपोर्ट से कनेक्ट करें। # क्लाइंट कनेक्शन क्लाइंट बनाएं और खोलें =Hbase.Client (प्रोटोकॉल) ट्रांसपोर्ट.ओपन () # डू समथिंगट्रांसपोर्ट.क्लोज़ ()
HBase थ्रिफ्ट के पायथन कार्यान्वयन में, सभी मानों को स्ट्रिंग्स के रूप में पारित किया जाता है। इसमें एक पूर्णांक की तरह बाइनरी डेटा शामिल है। सभी कॉलम मान TCell ऑब्जेक्ट में रखे जाते हैं। यहाँ Hbase.thrift फ़ाइल में परिभाषा दी गई है:
स्ट्रक्चर टीसेल{ 1:बाइट्स मान, 2:i64 टाइमस्टैम्प}
पायथन कोड जनरेट होने पर स्ट्रिंग में परिवर्तन पर ध्यान दें:
thrift_spec =( कोई नहीं, # 0 (1, TType.STRING, 'मान', कोई नहीं, कोई नहीं, ), # 1 (2, TType.I64, 'टाइमस्टैम्प', कोई नहीं, कोई नहीं, ), # 2)
मैंने 32-बिट पूर्णांकों से निपटना आसान बनाने के लिए एक सहायक विधि लिखी। एक स्ट्रिंग के बीच एक पूर्णांक को आगे और पीछे बदलने के लिए, आप इन दो विधियों का उपयोग करते हैं।
# थ्रिफ्ट की स्ट्रिंग के साथ इनकोडिंग एन्कोडिंग के लिए विधि एन्कोडिंगडीफ़ एनकोड (एन): रिटर्न स्ट्रक्चर.पैक ("i", n)# थ्रिफ्ट के स्ट्रिंग एन्कोडिंग के साथ इनट्स को डिकोड करने की विधि डीकोड (एस): रिटर्न स्ट्रक्चर। अनपैक ('i') , एस)[0]
थ्रिफ्ट में बाइनरी डेटा के साथ काम करते समय इस चेतावनी को ध्यान में रखें। आपको बाइनरी डेटा को स्ट्रिंग्स में बदलना होगा और इसके विपरीत।
त्रुटि समाप्त
थ्रिफ्ट इंटरफ़ेस में त्रुटियों को समझना उतना आसान नहीं है जितना कि हो सकता है। उदाहरण के लिए, टेबल नहीं मिलने पर पायथन से निकलने वाली त्रुटि यहां दी गई है:
ट्रेसबैक (सबसे हाल की कॉल अंतिम): फ़ाइल "./get.py", पंक्ति 17, <मॉड्यूल> पंक्तियों में =client.getRow(tablename, "shakespeare-comdies-000001") फ़ाइल "/mnt/hgfs/ jesse/repos/DevHivePigHBaseVM/training_materials/hbase/exercises/python_bleets_thrift/hbase/Hbase.py", लाइन 1038, getRow में return self.recv_getRow() फाइल "/mnt/hgfs/jesse/repos/DevHive /python_bleets_thrift/hbase/Hbase.py", लाइन 1062, recv_getRow में परिणाम बढ़ाएँ।
हालांकि सब कुछ खो नहीं गया है क्योंकि आप HBase थ्रिफ्ट लॉग फ़ाइल देख सकते हैं। CDH पर, यह फ़ाइल /var/log/hbase/hbase-hbase-thrift-localhost.localdomain.log पर स्थित होती है। अनुपलब्ध तालिका उदाहरण में, आपको थ्रिफ्ट लॉग में यह कहते हुए एक त्रुटि दिखाई देगी कि तालिका मौजूद नहीं है। यह असुविधाजनक है, लेकिन आप वहां से डिबग कर सकते हैं।
अगली किस्त में, मैं पंक्तियों को सम्मिलित करना और प्राप्त करना शामिल करूँगा।
जेसी एंडरसन क्लौडेरा विश्वविद्यालय के प्रशिक्षक हैं।