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

HBase के साथ बातचीत करने के लिए Hive का उपयोग करना, भाग 1

यह ब्लॉग पोस्ट Cloudera के साथ विलय से पहले Hortonworks.com पर प्रकाशित हुआ था। कुछ लिंक, संसाधन या संदर्भ अब सटीक नहीं हो सकते हैं।

यह HBase तालिकाओं के साथ बातचीत के लिए Hive के उपयोग की जाँच करने वाली दो पोस्टों में से पहली है। दूसरी पोस्ट यहाँ है।

जिन चीजों के बारे में मुझसे अक्सर पूछा जाता है उनमें से एक यह है कि अपाचे हाइव से HBase का उपयोग कैसे करें। न केवल इसे कैसे करें, बल्कि क्या काम करता है, यह कितनी अच्छी तरह काम करता है, और इसका अच्छा उपयोग कैसे करें। मैंने इस क्षेत्र में कुछ शोध किया है, इसलिए उम्मीद है कि यह मेरे अलावा किसी और के लिए उपयोगी होगा। यह एक ऐसा विषय है जिसे एचबेस इन एक्शन में शामिल नहीं किया गया था, शायद ये नोट दूसरे संस्करण के लिए आधार बनेंगे 😉 ये नोट्स एचबीएएस 0.94.x के संयोजन में उपयोग किए जाने वाले हाइव 0.11.x पर लागू होते हैं। वे मोटे तौर पर 0.12.x + 0.96.x पर लागू होने चाहिए, हालांकि मैंने अभी तक सब कुछ परीक्षण नहीं किया है।

हाइव प्रोजेक्ट में HBase के साथ इंटरैक्ट करने के लिए एक वैकल्पिक लाइब्रेरी शामिल है। यह वह जगह है जहां दो प्रणालियों के बीच पुल परत लागू की जाती है। Hive क्वेरी से HBase को एक्सेस करते समय आप जिस प्राथमिक इंटरफ़ेस का उपयोग करते हैं, उसे  BaseStorageHandler कहा जाता है . आप सीधे इनपुट और आउटपुट स्वरूपों के माध्यम से HBase तालिकाओं के साथ इंटरैक्ट कर सकते हैं, लेकिन हैंडलर सरल है और अधिकांश उपयोगों के लिए काम करता है।

Hive से HBase टेबल

HBaseStorageHandler का उपयोग करें हाइव मेटास्टोर के साथ HBase तालिकाओं को पंजीकृत करने के लिए। आप वैकल्पिक रूप से HBase तालिका को EXTERNAL . के रूप में निर्दिष्ट कर सकते हैं , जिस स्थिति में हाइव उस तालिका को सीधे छोड़ने के लिए नहीं बनाएगा - ऐसा करने के लिए आपको HBase शेल का उपयोग करना होगा।

[एसक्यूएल]
बनाएं [बाहरी] टेबल फू(…)
'org.apache.hadoop.hive.hbase.HBaseStorageHandler' द्वारा संग्रहीत
TBLPROPERTIES ('hbase.table.name' =' bar');
[/sql]

उपरोक्त कथन bar . नामक HBase तालिका को पंजीकृत करता है हाइव मेटास्टोर में, जिसे हाइव से foo . नाम से एक्सेस किया जा सकता है ।

हुड के तहत, HBaseStorageHandler HBase तालिका के साथ सहभागिता को
HiveHBaseTableInputFormat पर प्रत्यायोजित कर रहा है और HiveHBaseTableOutputFormat . आप चाहें तो सीधे उन वर्गों का उपयोग करके अपनी HBase तालिका को हाइव में पंजीकृत कर सकते हैं। ऊपर दिया गया बयान मोटे तौर पर इसके बराबर है:

[एसक्यूएल]
टेबल फू बनाएं(…)
इस रूप में स्टोर करें
INPUTFORMAT 'org.apache.hadoop.hive.hbase.HiveHBaseTableInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive .hbase.HiveHBaseTableOutputFormat'
TBLPROPERTIES ('hbase.table.name' ='bar');
[/sql]

यह भी प्रदान किया गया है HiveHFileOutputFormat जिसका अर्थ है कि हाइव से भी बल्कलोडिंग के लिए HFiles उत्पन्न करना संभव होना चाहिए। व्यवहार में, मुझे यह शुरू से अंत तक काम करने के लिए नहीं मिला है (देखें हाइव-4627)।

स्कीमा मैपिंग

तालिका का पंजीकरण केवल पहला कदम है। उस पंजीकरण के हिस्से के रूप में, आपको एक कॉलम मैपिंग भी निर्दिष्ट करनी होगी। इस तरह आप हाइव कॉलम के नामों को HBase टेबल की रोकी और कॉलम से लिंक करते हैं। ऐसा hbase.columns.mapping . का उपयोग करके करें सेर्डे संपत्ति।

[sql]
टेबल फू बनाएं(rowkey STRING, a STRING, b STRING)
'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
SERDEPROPERTIES के साथ ('hbase.columns) स्टोर किया गया .mapping' =':key,f:c1,f:c2')
TBLPROPERTIES ('hbase.table.name' ='bar');

[/sql]

मैपिंग प्रॉपर्टी में दिए गए मान हाइव टेबल के कॉलम नामों के साथ आमने-सामने होते हैं। HBase कॉलम नाम कॉलम परिवार द्वारा पूरी तरह से योग्य हैं, और आप विशेष टोकन :key . का उपयोग करते हैं रोकी का प्रतिनिधित्व करने के लिए। उपरोक्त

उदाहरण HBase तालिका से पंक्तियाँ बनाता है bar हाइव टेबल foo . के ज़रिए उपलब्ध है . foo कॉलम rowkey HBase की टेबल की रोकी में मैप करें, a से c1 f . में स्तंभ परिवार, और b करने के लिए c2 , f . में भी परिवार।

आप हाइव के MAP . को भी संबद्ध कर सकते हैं HBase स्तंभ परिवारों के लिए डेटा संरचनाएँ। इस मामले में, केवल STRING हाइव प्रकार का उपयोग किया जाता है। वर्तमान में समर्थित अन्य हाइव प्रकार BINARY है . अधिक उदाहरणों के लिए विकि पृष्ठ देखें।

डेटा के साथ इंटरैक्ट करना

परिभाषित कॉलम मैपिंग के साथ, अब आप HBase डेटा को वैसे ही एक्सेस कर सकते हैं जैसे आप किसी अन्य हाइव डेटा को करते हैं। वर्तमान में केवल साधारण क्वेरी विधेय समर्थित हैं।

[एसक्यूएल]
चुनें * फू से कहां…;
[/sql]

आप हाइव का उपयोग करके तालिका को आबाद और HBase भी कर सकते हैं। यह दोनों INTO . के साथ काम करता है और OVERWRITE खंड।

[sql]
source_hive_table से तालिका में डालें my_hbase_table
source_hive_table चुनें.* जहां …;
[/sql]

बता दें कि हाइव 0.12.0 में एक प्रतिगमन है जो इस सुविधा को तोड़ता है, एचआईवीई-5515 देखें।

अभ्यास में

रनटाइम पर सब कुछ ठीक से तार-तार करने के लिए अभी भी थोड़ी चालाकी की आवश्यकता है। HBase इंटरेक्शन मॉड्यूल पूरी तरह से वैकल्पिक है, इसलिए आपको यह सुनिश्चित करना होगा कि यह और इसकी HBase निर्भरता हाइव के क्लासपाथ पर उपलब्ध है।

[बैश]
$ निर्यात HADOOP_CLASSPATH=…
$ hive -e "तालिका बनाएं ... 'org.apache…HBaseStorageHandler'" द्वारा संग्रहीत"
[/bash]

स्थापना परिवेश उपयोगकर्ताओं के लिए इसे संभालने का बेहतर कार्य कर सकता है, लेकिन कुछ समय के लिए आपको इसे स्वयं प्रबंधित करना होगा। आदर्श रूप से hive bin स्क्रिप्ट HBase की उपस्थिति का पता लगा सकती है और स्वचालित रूप से आवश्यक CLASSPATH . बना सकती है समायोजन। ऐसा लगता है कि यह एन्हांसमेंट HIVE-2055 में ट्रैक किया गया है। अंतिम मील वितरण द्वारा ही प्रदान किया जाता है, यह सुनिश्चित करना कि पर्यावरण चर hive के लिए सेट हैं . यह कार्यक्षमता BIGTOP-955 द्वारा प्रदान की जाती है।

आपको यह भी सुनिश्चित करना होगा कि जब आप अपने हाइव स्टेटमेंट को निष्पादित करते हैं तो आवश्यक जार MapReduce जॉब्स को भेज दिए जाते हैं। हाइव auxjars सुविधा के माध्यम से अतिरिक्त कार्य निर्भरताओं को शिप करने के लिए एक तंत्र प्रदान करता है।

[बैश]
$ निर्यात HIVE_AUX_JARS_PATH=…
$ hive -e "चुनें * से ..."
[/bash]

मैंने HDP-1.3 बिल्ड में एक छोटा बग खोजा जो HIVE_AUX_JARS_PATH के उपयोगकर्ता-निर्दिष्ट मानों को मास्क करता है . व्यवस्थापकीय अधिकारों के साथ, इसे hive-env.sh में पंक्ति को ठीक करके आसानी से ठीक किया जा सकता है मौजूदा मूल्य का सम्मान करने के लिए। उपयोगकर्ता स्क्रिप्ट में
वर्कअराउंड SET . का उपयोग करना है एक बार हाइव सीएलआई लॉन्च करने के बाद एक मूल्य प्रदान करने के लिए कथन।

[बैश]
सेट hive.aux.jars.path =…
[/bash]

हाइव को यह पता लगाने में सक्षम होना चाहिए कि कौन से जार आवश्यक हैं और उन्हें स्वयं जोड़ें। HBase  TableMapReduceUtils#addDependencyJars  . प्रदान करता है इस उद्देश्य के लिए तरीके। ऐसा लगता है कि यह hive-0.12.0 में किया गया है, कम से कम HIVE-2379 के अनुसार।

भविष्य का काम

विधेय पुशडाउन (HIVE-1643, HIVE-2854, HIVE-3617,
HIVE-3684) और डेटा प्रकार जागरूकता (HIVE-1245, HIVE-2599) के लिए उचित समर्थन के बारे में बहुत कुछ कहा गया है। ये साथ-साथ चलते हैं क्योंकि विधेय शब्दार्थ को उन प्रकारों के संदर्भ में परिभाषित किया जाता है जिन पर वे काम करते हैं। हाइव के जटिल डेटा प्रकारों जैसे मैप्स और स्ट्रक्चर्स को HBase कॉलम परिवारों पर मैप करने के लिए और भी बहुत कुछ किया जा सकता है (HIVE-3211)। HBase टाइमस्टैम्प के लिए समर्थन थोड़ा गड़बड़ है; वे किसी भी स्तर की ग्रैन्युलैरिटी (HIVE-2828, HIVE-2306) के साथ Hive अनुप्रयोगों के लिए उपलब्ध नहीं कराए गए हैं। एक उपयोगकर्ता के पास सभी संचालनों के साथ एक कस्टम टाइमस्टैम्प लिखने के लिए स्टोरेज हैंडलर सेटिंग के माध्यम से एकमात्र इंटरैक्शन होता है।

प्रदर्शन के दृष्टिकोण से, HBase का लाभ उठाने के लिए हाइव आज कुछ चीजें कर सकता है (यानी, डेटा प्रकारों पर निर्भर नहीं)। HBase तालिकाओं को मध्यवर्ती भंडारण स्थान (HIVE-3565) के रूप में उपयोग करने के लिए HBase-अवेयर हाइव की भी संभावना है, जिससे HBase में लोड की गई आयाम तालिकाओं के विरुद्ध मैप-साइड जॉइन की सुविधा मिलती है। हाइव HBase की प्राकृतिक अनुक्रमित संरचना (HIVE-3634, HIVE-3727) का उपयोग कर सकता है, संभावित रूप से बड़े स्कैन को बचा सकता है। वर्तमान में, निष्पादित किए जाने वाले स्कैन पर उपयोगकर्ता का (कोई?) नियंत्रण नहीं होता है। प्रति-कार्य या कम से कम प्रति-तालिका के आधार पर कॉन्फ़िगरेशन सक्षम होना चाहिए (HIVE-1233)। यह एक HBase-सेवी उपयोगकर्ता को Hive को इस बारे में संकेत प्रदान करने में सक्षम करेगा कि उसे HBase के साथ कैसे इंटरैक्ट करना चाहिए। HBase टेबल (HIVE-3399) के साधारण स्प्लिट सैंपलिंग के लिए सपोर्ट भी आसानी से किया जा सकता है क्योंकि HBase पहले से ही टेबल पार्टिशन को मैनेज करता है।

अन्य एक्सेस चैनल

अब तक चर्चा की गई हर चीज़ के लिए हाइव को ऑनलाइन HBase RegionServers के साथ बातचीत करने की आवश्यकता है। एप्लिकेशन महत्वपूर्ण थ्रूपुट प्राप्त करने के लिए खड़े हो सकते हैं और एचडीएफएस पर जारी एचबीएएस डेटा के साथ सीधे बातचीत करके अधिक लचीलेपन का आनंद ले सकते हैं। इससे हाइव वर्कलोड को ऑनलाइन SLA-बाउंड HBase एप्लिकेशन में हस्तक्षेप करने से रोकने का भी लाभ होता है (कम से कम, जब तक कि हम QOS को कार्यों, HBASE-4441 के बीच अलगाव में HBase सुधार नहीं देखते हैं)।

जैसा कि पहले बताया गया है, HiveHFileOutputFormat . है . HIVE-4627 को हल करने से Hive को बल्क लोडिंग के लिए HFiles जेनरेट करने का एक सीधा-सीधा तरीका बनाना चाहिए। एक बार जब आप हाइव का उपयोग करके HFiles बना लेते हैं, तब भी
LoadIncrementalHFiles को चलाने का अंतिम चरण होता है क्षेत्रों में उन्हें कॉपी और पंजीकृत करने के लिए उपयोगिता। इसके लिए HiveStorageHandler  इंटरफ़ेस को क्वेरी योजना को प्रभावित करने के लिए किसी प्रकार के हुक की आवश्यकता होगी, क्योंकि यह चरणों को जोड़ने की अनुमति देता है। एक बार स्थापित हो जाने पर, यह संभव होना चाहिए कि SET एक रनटाइम फ़्लैग, एक INSERT  स्विच कर रहा है बल्कलोड का उपयोग करने के लिए ऑपरेशन।

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

निष्कर्ष

HBase और Hive के बीच का इंटरफ़ेस युवा है, लेकिन इसमें अच्छी क्षमता है। बहुत सारे कम लटकने वाले फल हैं जिन्हें चीजों को आसान और तेज़ बनाने के लिए उठाया जा सकता है। वास्तविक अनुप्रयोग विकास को छोड़कर सबसे स्पष्ट समस्या हाइव के टाइप किए गए, सघन स्कीमा और HBase के अनटाइप्ड, विरल स्कीमा के बीच प्रतिबाधा बेमेल है। यह तकनीकी समस्या जितनी ही एक संज्ञानात्मक समस्या है। यहां समाधान कई सुधारों को विफल करने की अनुमति देगा, जिसमें प्रदर्शन सुधार के रास्ते में बहुत कुछ शामिल है। मुझे उम्मीद है कि HBase (HBASE-8089) में डेटा प्रकार जोड़ने का काम जारी रखने से इस अंतर को पाटने में मदद मिल सकती है।

बुनियादी संचालन ज्यादातर काम करते हैं, कम से कम अल्पविकसित तरीके से। आप Hive का उपयोग करके डेटा को पढ़ सकते हैं और डेटा को वापस HBase में लिख सकते हैं। परिवेश को कॉन्फ़िगर करना एक अपारदर्शी और मैन्युअल प्रक्रिया है, जो संभवत:नौसिखियों को उपकरण अपनाने से रोकती है। बल्क ऑपरेशन का भी सवाल है - HFiles लिखने और Hive का उपयोग करके HBase स्नैपशॉट पढ़ने के लिए समर्थन इस समय पूरी तरह से उपलब्ध नहीं है। और निश्चित रूप से, वहाँ कीड़े छिड़के हुए हैं। हाल ही में सबसे बड़ा सुधार HCatalog के इंटरफ़ेस का बहिष्करण, किस इंटरफ़ेस का उपयोग करने के संबंध में आवश्यक अग्रिम निर्णय को हटा रहा है।

Hive HBase के शीर्ष पर एक बहुत ही उपयोगी SQL इंटरफ़ेस प्रदान करता है, जो कि कई मौजूदा ETL वर्कफ़्लो में आसानी से एकीकृत हो जाता है। उस इंटरफ़ेस के लिए HBase द्वारा प्रदान किए जाने वाले कुछ BigTable शब्दार्थ को सरल बनाने की आवश्यकता है, लेकिन इसका परिणाम HBase को उपयोगकर्ताओं के अधिक व्यापक दर्शकों के लिए खोलना होगा। हाइव इंटरऑप फीनिक्स द्वारा प्रदान किए गए अनुभव की बहुत अच्छी तरह से तारीफ करता है। हाइव को उस सिस्टम के लिए वर्तमान में आवश्यक परिनियोजन जटिलताओं की आवश्यकता नहीं होने का लाभ है। उम्मीद है कि प्रकारों की सामान्य परिभाषा एक मानार्थ भविष्य की अनुमति देगी।


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Apache HBase क्षेत्र विभाजन और विलय

  2. CDP प्राइवेट क्लाउड बेस 7 बनाम CDH5 में ऑपरेशनल डेटाबेस परफॉर्मेंस इम्प्रूवमेंट

  3. Hadoop उच्च उपलब्धता सुविधा को समझना

  4. MapReduce में Hadoop OutputFormat क्या है?

  5. HBase के लिए जावा कचरा संग्रह ट्यूनिंग