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

स्पार्क-ऑन-एचबेस:डेटाफ्रेम आधारित एचबीएएस कनेक्टर

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

ब्लूमबर्ग के साथ काम कर रहे हॉर्टनवर्क्स द्वारा विकसित स्पार्क-एचबेस कनेक्टर के तकनीकी पूर्वावलोकन की घोषणा करते हुए हमें गर्व हो रहा है।

स्पार्क-एचबेस कनेक्टर स्पार्क-1.2.0 में पेश किए गए डेटा सोर्स एपीआई (स्पार्क-3247) का लाभ उठाता है। यह सरल HBase की वैल्यू स्टोर और जटिल रिलेशनल SQL क्वेरी के बीच की खाई को पाटता है और उपयोगकर्ताओं को स्पार्क का उपयोग करके HBase के शीर्ष पर जटिल डेटा एनालिटिक्स करने में सक्षम बनाता है। एक HBase डेटाफ़्रेम एक मानक स्पार्क डेटाफ़्रेम है, और हाइव, ओआरसी, लकड़ी की छत, JSON, आदि जैसे किसी भी अन्य डेटा स्रोतों के साथ बातचीत करने में सक्षम है।

पृष्ठभूमि

कई ओपन सोर्स स्पार्क HBase कनेक्टर या तो स्पार्क पैकेज के रूप में, स्वतंत्र प्रोजेक्ट के रूप में या HBase ट्रंक में उपलब्ध हैं।

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

HBase ट्रंक में HBase कनेक्टर का RDD स्तर पर एक समृद्ध समर्थन है, उदा। बल्कपुट, आदि, लेकिन इसका डेटाफ्रेम समर्थन उतना समृद्ध नहीं है। HBase ट्रंक कनेक्टर मानक HadoopRDD पर निर्भर करता है जिसमें HBase बिल्ट-इन TableInputFormat की कुछ प्रदर्शन सीमाएँ होती हैं। इसके अलावा, ड्राइवर में निष्पादित बल्कगेट विफलता का एकल बिंदु हो सकता है।

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

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

वास्तुकला

हम मानते हैं कि स्पार्क और एचबीएएस एक ही क्लस्टर में तैनात हैं, और स्पार्क निष्पादक क्षेत्र सर्वर के साथ सह-स्थित हैं, जैसा कि नीचे दिए गए चित्र में दिखाया गया है।

चित्र 1. स्पार्क-ऑन-एचबेस कनेक्टर आर्किटेक्चर

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

टेबल कैटलॉग

HBase तालिका को स्पार्क में एक संबंधपरक तालिका के रूप में लाने के लिए, हम HBase और स्पार्क तालिकाओं के बीच एक मानचित्रण को परिभाषित करते हैं, जिसे तालिका कैटलॉग कहा जाता है। इस कैटलॉग के दो महत्वपूर्ण भाग हैं। एक पंक्ति की परिभाषा है और दूसरा स्पार्क में टेबल कॉलम और एचबीएएस में कॉलम परिवार और कॉलम क्वालीफायर के बीच मैपिंग है। कृपया विवरण के लिए उपयोग अनुभाग देखें।

मूल एवरो समर्थन

कनेक्टर मूल रूप से एवरो प्रारूप का समर्थन करता है, क्योंकि संरचित डेटा को HBase में बाइट सरणी के रूप में बनाए रखना एक बहुत ही सामान्य अभ्यास है। उपयोगकर्ता एवरो रिकॉर्ड को सीधे HBase में जारी रख सकता है। आंतरिक रूप से, एवरो स्कीमा स्वचालित रूप से एक देशी स्पार्क उत्प्रेरक डेटा प्रकार में परिवर्तित हो जाती है। ध्यान दें कि HBase तालिका में दोनों कुंजी-मूल्य भागों को एवरो प्रारूप में परिभाषित किया जा सकता है। सटीक उपयोग के लिए कृपया रेपो में उदाहरण/परीक्षण मामले देखें।

पुशडाउन की भविष्यवाणी करें

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

विभाजन काटना

विधेय से पंक्ति कुंजी निकालकर, हम स्कैन/बल्कगेट को कई गैर-अतिव्यापी श्रेणियों में विभाजित करते हैं, केवल वे क्षेत्र सर्वर जिनके पास अनुरोधित डेटा है स्कैन/बल्कगेट निष्पादित करेंगे। वर्तमान में, विभाजन प्रूनिंग पंक्ति कुंजियों के पहले आयाम पर की जाती है। उदाहरण के लिए, यदि एक पंक्ति कुंजी "की1:की2:की3" है, तो विभाजन छंटाई केवल "की1" पर आधारित होगी। ध्यान दें कि WHERE शर्तों को सावधानीपूर्वक परिभाषित करने की आवश्यकता है। अन्यथा, विभाजन प्रूनिंग प्रभावी नहीं हो सकता है। उदाहरण के लिए, WHERE rowkey1> “abc” OR column =“xyz” (जहाँ Rowkey1 Rowkey का पहला आयाम है, और कॉलम एक नियमित hbase कॉलम है) के परिणामस्वरूप एक पूर्ण स्कैन होगा, क्योंकि हमें सभी श्रेणियों को कवर करना होगा क्योंकि में से या तर्क।

डेटा स्थान

जब स्पार्क निष्पादक HBase क्षेत्र सर्वर के साथ सह-स्थित होता है, तो क्षेत्र सर्वर स्थान की पहचान करके डेटा स्थान प्राप्त किया जाता है, और क्षेत्र सर्वर के साथ कार्य को सह-पता लगाने के लिए सर्वोत्तम प्रयास करता है। प्रत्येक निष्पादक एक ही होस्ट पर सह-स्थित डेटा के हिस्से पर स्कैन/बल्कगेट करता है।

स्कैन करें और बल्कगेट करें

इन दो ऑपरेटरों को WHERE क्लॉज निर्दिष्ट करके उपयोगकर्ताओं के सामने लाया जाता है, उदाहरण के लिए, कहां कॉलम> x और कॉलम स्कैन के लिए और कहां कॉलम =x भूल जाओ। संचालन निष्पादकों में किया जाता है, और चालक केवल इन कार्यों का निर्माण करता है। आंतरिक रूप से उन्हें स्कैन और/या प्राप्त करने के लिए परिवर्तित किया जाता है, और Iterator[Row] ऊपरी परत प्रसंस्करण के लिए उत्प्रेरक इंजन में वापस आ जाता है।

उपयोग

निम्नलिखित कनेक्टर का उपयोग करने के तरीके के बारे में मूल प्रक्रिया को दिखाता है। अधिक विवरण और उन्नत उपयोग के मामले, जैसे कि एवरो और समग्र कुंजी समर्थन के लिए, कृपया रिपॉजिटरी में उदाहरण देखें।

1) स्कीमा मैपिंग के लिए कैटलॉग को परिभाषित करें:

[code language="scala"]def कैटलॉग =s"""{        |"table":{"namespace":"default", "name":"table1"},        |"rowkey":"key" ,        |"कॉलम":{         |"col0":{"cf":"rowkey", "col":"key", "type":"string"},          |"col1":{"cf":"cf1 ", "col":"col1", "type":"boolean"},          |"col2":{"cf":"cf2", "col":"col2", "type":"double"}, |"col3":{"cf":"cf3", "col":"col3", "type":"float"},          |"col4":{"cf":"cf4", "col":" col4", "टाइप":"int"},          |"col5":{"cf":"cf5", "col":"col5", "type":"bigint"},          |"col6":{" cf":"cf6", "col":"col6", "type":"smallint"},          |"col7":{"cf":"cf7", "col":"col7", "type":"स्ट्रिंग"},          |"col8":{"cf":"cf8", "col":"col8", "type":"tinyint"}        |}     |}"""stripMargin[/code] पूर्व> 

2) डेटा तैयार करें और HBase तालिका को पॉप्युलेट करें:
केस क्लास HBaseRecord(col0:String, col1:Boolean,col2:Double, col3:Float,col4:Int,       col5:Long, col6:छोटा, col7:String, col8:Byte)

ऑब्जेक्ट HBaseRecord {def लागू (i:Int, t:String):HBaseRecord ={val s =s"""row${"%03d.format(i)}"""       HBaseRecord(s, i % 2 ==0, i.toDouble, i.toFloat,  i, i.toLong, i.toShort,  s”String$i:$t”,      i.toByte) }}

वैल डेटा =(0 से 255).मैप {i =>  HBaseRecord(i, "अतिरिक्त")}

sc.parallelize(data).toDF.write.options(
 Map(HBaseTableCatalog.tableCatalog -> कैटलॉग, HBaseTableCatalog.newTable -> “5”))
.format(“org.apache.spark. sql.execution.datasources.hbase")
 .save()
 
3) डेटाफ़्रेम लोड करें:
def withCatalog(cat:String):DataFrame ={
 sqlContext
.read
.options(Map(HBaseTableCatalog.tableCatalog->cat))
.format( “org.apache.spark.sql.execution.datasources.hbase”)
.load()
}

वैल डीएफ =कैटलॉग के साथ (कैटलॉग)

4) भाषा एकीकृत क्वेरी:
वैल एस =df.filter((($"col0″ <="row050″ &&$"col0"> "row040") ||
 $"col0″ ==="row005" ||
 $”col0″ ===“row020” ||
 $”col0″ === “r20” ||
 $”col0″ <=“row005”) &&
 ($"col4″ ===1 ||
 $"col4″ ===42))
.select("col0", "col1", "col4")
s .शो

5) SQL क्वेरी:
df.registerTempTable(“table”)
sqlContext.sql(“तालिका से गिनती चुनें(col1))।दिखाएं

स्पार्क-पैकेज को कॉन्फ़िगर करना

उपयोगकर्ता स्पार्क-ऑन-एचबेस कनेक्टर का उपयोग मानक स्पार्क पैकेज के रूप में कर सकते हैं। अपने स्पार्क एप्लिकेशन उपयोग में पैकेज को शामिल करने के लिए:

स्पार्क-शेल, पाइस्पार्क, या स्पार्क-सबमिट

> $SPARK_HOME/bin/spark-shell -packages zhzhan:shc:0.0.11-1.6.1-s_2.10

उपयोगकर्ता पैकेज को आपकी SBT फ़ाइल में निर्भरता के रूप में भी शामिल कर सकते हैं। प्रारूप स्पार्क-पैकेज-नाम है:संस्करण

spनिर्भरता +="zhzhan/shc:0.0.11-1.6.1-s_2.10"

सुरक्षित क्लस्टर में चल रहा है

Kerberos सक्षम क्लस्टर में चलने के लिए, उपयोगकर्ता को HBase संबंधित जार को क्लासपाथ में शामिल करना होगा क्योंकि HBase टोकन पुनर्प्राप्ति और नवीनीकरण स्पार्क द्वारा किया जाता है, और कनेक्टर से स्वतंत्र होता है। दूसरे शब्दों में, उपयोगकर्ता को सामान्य तरीके से पर्यावरण की शुरुआत करने की आवश्यकता है, या तो किनिट के माध्यम से या प्रिंसिपल/कीटैब प्रदान करके। निम्नलिखित उदाहरण दिखाते हैं कि यार्न-क्लाइंट और यार्न-क्लस्टर मोड दोनों के साथ एक सुरक्षित क्लस्टर में कैसे चलना है। ध्यान दें कि SPARK_CLASSPATH को दोनों मोड के लिए सेट करना होगा, और उदाहरण जार स्पार्क के लिए सिर्फ एक प्लेसहोल्डर है।

निर्यात SPARK_CLASSPATH=/usr/hdp/current/hbase-client/lib/hbase-common.jar:/usr/hdp/current/hbase-client/lib/hbase-client.jar:/usr/hdp/current/hbase- client/lib/hbase-server.jar:/usr/hdp/current/hbase-client/lib/hbase-protocol.jar:/usr/hdp/current/hbase-client/lib/guava-12.0.1.jar

मान लीजिए hrt_qa एक हेडलेस अकाउंट है, उपयोगकर्ता kinit के लिए निम्न कमांड का उपयोग कर सकता है:

kinit -k -t /tmp/hrt_qa.headless.keytab hrt_qa

/usr/hdp/current/spark-client/bin/spark-submit -class org.apache.spark.sql.execution.datasources.hbase.examples.HBaseSource -मास्टर यार्न-क्लाइंट -पैकेज zhzhan:shc:0.0.11- 1.6.1-s_2.10-संख्या-निष्पादक 4-ड्राइवर-मेमोरी 512m-निष्पादक-मेमोरी 512m-निष्पादक-कोर 1 /usr/hdp/current/spark-client/lib/spark-examples-1.6.1.2.4.2. 0-106-हडूप2.7.1.2.4.2.0-106.जार

/usr/hdp/current/spark-client/bin/spark-submit -class org.apache.spark.sql.execution.datasources.hbase.examples.HBaseSource -मास्टर यार्न-क्लस्टर -फाइल्स /etc/hbase/conf/hbase -site.xml -पैकेज zhzhan:shc:0.0.11-1.6.1-s_2.10 -num-executors 4 -driver-memory 512m -executor-memory 512m -executor-cores 1 /usr/hdp/current/spark- क्लाइंट/लिब/स्पार्क-उदाहरण-1.6.1.2.4.2.0-106-hadoop2.7.1.2.4.2.0-106.jar

सब कुछ एक साथ रखना

हमने अभी एक त्वरित अवलोकन दिया है कि कैसे HBase डेटाफ़्रेम स्तर पर स्पार्क का समर्थन करता है। DataFrame API के साथ स्पार्क एप्लिकेशन HBase तालिका में संग्रहीत डेटा के साथ अन्य डेटा स्रोतों में संग्रहीत किसी भी डेटा के साथ आसानी से काम कर सकते हैं। इस नई सुविधा के साथ, स्पार्क एप्लिकेशन और अन्य इंटरेक्टिव टूल, उदा। उपयोगकर्ता स्पार्क के अंदर एक HBase तालिका के शीर्ष पर एक जटिल SQL क्वेरी चला सकते हैं, डेटाफ़्रेम के विरुद्ध तालिका में शामिल हो सकते हैं, या अधिक जटिल प्रणाली को लागू करने के लिए स्पार्क स्ट्रीमिंग के साथ एकीकृत कर सकते हैं।

आगे क्या है?

वर्तमान में, कनेक्टर को हॉर्टनवर्क्स रेपो में होस्ट किया गया है, और स्पार्क पैकेज के रूप में प्रकाशित किया गया है। यह Apache HBase ट्रंक में माइग्रेट होने की प्रक्रिया में है। माइग्रेशन के दौरान, हमने HBase ट्रंक में कुछ महत्वपूर्ण बग्स की पहचान की, और उन्हें मर्ज के साथ ठीक किया जाएगा। स्कैन और बल्कगेट के लिए अंतर्निहित कंप्यूटिंग आर्किटेक्चर को अनुकूलित करने के लिए HBASE-14795 और HBASE-14796 सहित HBASE-14795 और HBASE-14796, उपयोग में आसानी के लिए JSON यूजर इंटरफेस प्रदान करने के लिए HBASE-14801, HBASE-15336 डेटाफ़्रेम लेखन पथ, एवरो समर्थन के लिए HBASE-15334, जावा आदिम प्रकारों का समर्थन करने के लिए HBASE-15333, जैसे शॉर्ट, इंट, लॉन्ग, फ्लोट, और डबल, आदि, HBASE-15335 समग्र पंक्ति कुंजी का समर्थन करने के लिए, और HBASE-15572 वैकल्पिक टाइमस्टैम्प शब्दार्थ जोड़ने के लिए। हम कनेक्टर के भविष्य के संस्करण को तैयार करने की आशा करते हैं जो कनेक्टर के साथ काम करना और भी आसान बना देता है।

पावती

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

संदर्भ:

एसएचसी:https://github.com/hortonworks/shc-release

स्पार्क-पैकेज:http://spark-packages.org/package/zhzhan/shc

अपाचे HBase: https://hbase.apache.org/

अपाचे स्पार्क:http://spark.apache.org/


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Hadoop Combiner परिचय, कार्य और लाभ

  2. Hadoop HDFS में NameNode स्वचालित विफलता क्या है?

  3. MapReduce में Hadoop रेड्यूसर क्लास क्या है?

  4. MapReduce में Hadoop मैपर क्लास क्या है?

  5. Hadoop Partitioner - MapReduce Partitioner की मूल बातें जानें