Apache HBase तक पहुँचने और उसके साथ बातचीत करने के कई तरीके हैं। Java API सबसे अधिक कार्यक्षमता प्रदान करता है, लेकिन बहुत से लोग Java के बिना HBase का उपयोग करना चाहते हैं।
ऐसा करने के लिए दो मुख्य दृष्टिकोण हैं:एक थ्रिफ्ट इंटरफ़ेस है, जो दो विकल्पों में से तेज़ और अधिक हल्का है। HBase तक पहुँचने का दूसरा तरीका REST इंटरफ़ेस का उपयोग करना है, जो एक क्रिया करने के लिए HTTP क्रियाओं का उपयोग करता है, जिससे डेवलपर्स को उपयोग करने के लिए भाषाओं और कार्यक्रमों की एक विस्तृत पसंद मिलती है।
कैसे-कैसे की यह श्रृंखला REST इंटरफ़ेस पर चर्चा करेगी और इसे एक्सेस करने के लिए पायथन कोड नमूने प्रदान करेगी। पहली पोस्ट में HBase REST, कुछ पायथन कैविएट और टेबल एडमिनिस्ट्रेशन शामिल होंगे। दूसरी पोस्ट यह बताएगी कि XML और JSON का उपयोग करके एक बार में कई पंक्तियों को कैसे सम्मिलित किया जाए। तीसरा पोस्ट दिखाएगा कि XML और JSON का उपयोग करके गुणक पंक्तियाँ कैसे प्राप्त करें। पूरे कोड के नमूने मेरे GitHub खाते पर देखे जा सकते हैं।
HBase REST बेसिक्स
थ्रिफ्ट और आरईएसटी दोनों के काम करने के लिए, इन अनुरोधों को संभालने के लिए एक और एचबीएएस डिमन को चलाने की जरूरत है। इन डेमॉन को hbase-thrift और hbase-rest संकुल में संस्थापित किया जा सकता है। नीचे दिया गया चित्र दिखाता है कि क्लस्टर में थ्रिफ्ट और आरईएसटी को कहाँ रखा गया है। ध्यान दें कि थ्रिफ्ट और आरईएसटी क्लाइंट आमतौर पर लोड को कम रखने के लिए डेटानोड या रीजनसर्वर जैसी कोई अन्य सेवा सेवाएं नहीं चलाते हैं, और आरईएसटी इंटरैक्शन के लिए उच्च प्रतिक्रिया देते हैं।
इन डेमॉन को उन नोड्स पर स्थापित करना और शुरू करना सुनिश्चित करें जिनके पास Hadoop क्लस्टर और वेब एप्लिकेशन सर्वर दोनों तक पहुंच है। REST इंटरफ़ेस में कोई अंतर्निहित लोड संतुलन नहीं है; जिसे हार्डवेयर या कोड के साथ करने की आवश्यकता होगी। Cloudera Manager HBase REST और थ्रिफ्ट सेवाओं को स्थापित और प्रबंधित करना वास्तव में आसान बनाता है। (आप इसे मुफ्त में डाउनलोड और आज़मा सकते हैं!) REST का नकारात्मक पक्ष यह है कि यह थ्रिफ्ट या जावा की तुलना में बहुत अधिक वजन वाला है।
एक आरईएसटी इंटरफ़ेस विभिन्न डेटा प्रारूपों का उपयोग कर सकता है:एक्सएमएल, जेएसओएन, और प्रोटोबफ। Accept
. निर्दिष्ट करके और Content-Type
हेडर, आप वह प्रारूप चुन सकते हैं जिसे आप पास करना चाहते हैं या वापस प्राप्त करना चाहते हैं।
REST इंटरफ़ेस का उपयोग शुरू करने के लिए, आपको यह पता लगाना होगा कि यह किस पोर्ट पर चल रहा है। CDH के लिए डिफ़ॉल्ट पोर्ट 8070 पोर्ट है। इस पोस्ट के लिए, आपको baseurl
दिखाई देगा वेरिएबल का उपयोग किया गया है, और यहां वह मान है जिसका मैं उपयोग कर रहा हूं::
baseurl = "http://localhost:8070"
REST इंटरफ़ेस को सुरक्षा बढ़ाने के लिए Kerberos क्रेडेंशियल का उपयोग करने के लिए सेट किया जा सकता है।
अपने कोड के लिए, आपको REST डेमॉन चलाने वाले नोड के IP पते या पूरी तरह से योग्य डोमेन नाम DNS का उपयोग करना होगा। साथ ही, पुष्टि करें कि पोर्ट सही है। मैं इस URL को एक चर बनाने की अत्यधिक अनुशंसा करता हूं, क्योंकि यह नेटवर्क परिवर्तनों के साथ बदल सकता है।
पायथन और HBase बग समाधान
दो बग और वर्कअराउंड हैं जिन्हें संबोधित करने की आवश्यकता है। पहला बग यह है कि बिल्ट-इन पायथन मॉड्यूल सभी HTTP क्रियाओं का समर्थन नहीं करता है। दूसरा JSON के साथ काम करते समय HBase REST बग है।
REST इंटरैक्शन के लिए अंतर्निहित पायथन मॉड्यूल HBase REST के लिए आवश्यक सभी HTTP क्रियाओं का आसानी से समर्थन नहीं करता है। आपको पायथन अनुरोध मॉड्यूल स्थापित करने की आवश्यकता होगी। अनुरोध मॉड्यूल भी कोड को साफ करता है और सभी इंटरैक्शन को बहुत आसान बनाता है।
JSON के माध्यम से डेटा जोड़ते समय HBase REST इंटरफ़ेस में एक बग होता है:यह आवश्यक है कि फ़ील्ड अपना सटीक क्रम बनाए रखें। बिल्ट-इन पायथन dict
type इस सुविधा का समर्थन नहीं करता है, इसलिए ऑर्डर को बनाए रखने के लिए, हमें OrderedDict
का उपयोग करना होगा। कक्षा। (पायथन 2.6 और पुराने वाले लोगों को ऑर्डर्ड डिक्ट मॉड्यूल स्थापित करने की आवश्यकता होगी।) मैं बाद में पोस्ट में बग और वर्कअराउंड को भी कवर करूंगा।
बेस 64 एन्कोड और डीकोड पूर्णांक का उपयोग करना भी मुश्किल था, इसलिए मैंने ऐसा करने के लिए कुछ कोड लिखा:
# Method for encoding ints with base64 encoding def encode(n): data = struct.pack("i", n) s = base64.b64encode(data) return s # Method for decoding ints with base64 encoding def decode(s): data = base64.b64decode(s) n = struct.unpack("i", data) return n[0]
चीजों को और भी आसान बनाने के लिए, मैंने यह पुष्टि करने के लिए एक विधि लिखी कि HTTP प्रतिक्रियाएं 200 के दशक में वापस आती हैं, जो इंगित करती है कि ऑपरेशन ने काम किया। नमूना कोड आगे बढ़ने से पहले कॉल की सफलता की जांच करने के लिए इस पद्धति का उपयोग करता है। यह है विधि:
# Checks the request object to see if the call was successful def issuccessful(request): if 200
टेबल के साथ काम करना
REST इंटरफ़ेस का उपयोग करके, आप टेबल बना या हटा सकते हैं। आइए तालिका बनाने के लिए कोड पर एक नज़र डालें।
content = '' content += '' content += ' ' content += '' request = requests.post(baseurl + "/" + tablename + "/schema", data=content, headers={"Content-Type" : "text/xml", "Accept" : "text/xml"})
इस स्निपेट में, हम एक छोटा XML दस्तावेज़ बनाते हैं जो सामग्री चर में तालिका स्कीमा को परिभाषित करता है। हमें टेबल का नाम और कॉलम परिवार का नाम देना होगा। यदि एक से अधिक स्तंभ परिवार हैं, तो आप कुछ और ColumnSchema
बना सकते हैं नोड्स।
इसके बाद, हम POST
. के लिए रिक्वेस्ट मॉड्यूल का उपयोग करते हैं हमारे द्वारा बनाए गए URL के लिए XML। इस URL में नई तालिका का नाम शामिल करने की आवश्यकता है। साथ ही, ध्यान दें कि हम इस POST
. के लिए हेडर सेट कर रहे हैं बुलाना। हम दिखा रहे हैं कि हम XML में Content-Type
. के साथ भेज रहे हैं "टेक्स्ट/एक्सएमएल" पर सेट करें और हम एक्सएमएल को Accept
के साथ वापस चाहते हैं "टेक्स्ट/एक्सएमएल" पर सेट करें।
request.status_code
का उपयोग करना , आप जाँच सकते हैं कि तालिका बनाना सफल रहा। REST इंटरफ़ेस समान HTTP त्रुटि कोड का उपयोग यह पता लगाने के लिए करता है कि कोई कॉल सफल हुई या त्रुटिपूर्ण हो गई। 200 के दशक में एक स्थिति कोड का अर्थ है कि चीजें सही ढंग से काम करती हैं।
निम्नलिखित कोड का उपयोग करके हम आसानी से जांच सकते हैं कि कोई तालिका मौजूद है या नहीं:
request = requests.get(baseurl + "/" + tablename + "/schema")
कॉल GET
. का उपयोग करते हैं REST इंटरफ़ेस को बताने के लिए क्रिया हम URL में तालिका के बारे में स्कीमा जानकारी प्राप्त करना चाहते हैं। एक बार फिर, हम यह देखने के लिए स्थिति कोड का उपयोग कर सकते हैं कि तालिका मौजूद है या नहीं। 200 के दशक में एक स्थिति कोड का मतलब है कि यह मौजूद है और किसी अन्य संख्या का मतलब यह नहीं है।
curl
का उपयोग करना कमांड, हम कोड लिखे बिना REST ऑपरेशन की सफलता की जांच कर सकते हैं। निम्न आदेश कॉल की सफलता दिखाते हुए 200 लौटाएगा क्योंकि messagestable
तालिका HBase में मौजूद है। ये रहा कॉल और उसका आउटपुट:
[user@localhost]$ curl -I -H "Accept: text/xml" http://localhost:8070/messagestable/schema HTTP/1.1 200 OK Content-Length: 0 Cache-Control: no-cache Content-Type: text/xml
यह REST कॉल त्रुटिपूर्ण हो जाएगी क्योंकि tablenotthere
तालिका HBase में मौजूद नहीं है। ये रहा कॉल और उसका आउटपुट:
[user@localhost]$ curl -I -H "Accept: text/xml" http://localhost:8070/tablenotthere/schema HTTP/1.1 500 org.apache.hadoop.hbase.TableNotFoundException: tablenotthere Content-Type: text/html; charset=iso-8859-1 Cache-Control: must-revalidate,no-cache,no-store Content-Length: 10767
हम निम्नलिखित कोड का उपयोग करके तालिका को हटा सकते हैं:
request = requests.delete(baseurl + "/" + tablename + "/schema")
यह कॉल DELETE
. का उपयोग करती है REST इंटरफ़ेस को बताने के लिए क्रिया कि हम तालिका को हटाना चाहते हैं। REST इंटरफ़ेस के माध्यम से किसी तालिका को हटाने के लिए आपको इसे पहले अक्षम करने की आवश्यकता नहीं है। हमेशा की तरह, हम स्थिति कोड को देखकर सफलता की पुष्टि कर सकते हैं।
इस श्रृंखला की अगली पोस्ट में, हम पंक्तियों को सम्मिलित करने पर चर्चा करेंगे।
जेसी एंडरसन क्लौडेरा विश्वविद्यालय में प्रशिक्षक हैं।
यदि आप HBase में रुचि रखते हैं, तो . के लिए पंजीकरण करना सुनिश्चित करें HBaseCon 2013 (13 जून, सैन फ्रांसिस्को) - HBase योगदानकर्ताओं, डेवलपर्स, व्यवस्थापकों और उपयोगकर्ताओं के लिए सामुदायिक कार्यक्रम। अर्ली बर्ड पंजीकरण 23 अप्रैल तक खुला है।