CopyTable एक साधारण Apache HBase उपयोगिता है, जो आश्चर्यजनक रूप से, HBase क्लस्टर के भीतर या एक HBase क्लस्टर से दूसरे में अलग-अलग तालिकाओं की प्रतिलिपि बनाने के लिए उपयोग की जा सकती है। इस ब्लॉग पोस्ट में, हम इस बारे में बात करेंगे कि यह टूल क्या है, आप इसका उपयोग क्यों करना चाहेंगे, इसका उपयोग कैसे करें, और कुछ सामान्य कॉन्फ़िगरेशन चेतावनियां।
उपयोग के मामले:
CopyTable इसके मूल में एक Apache Hadoop MapReduce जॉब है जो एक व्यक्तिगत तालिका से रिकॉर्ड पढ़ने के लिए मानक HBase स्कैन रीड-पथ इंटरफ़ेस का उपयोग करता है और मानक HBase पुट राइट-पाथ इंटरफ़ेस का उपयोग करके उन्हें दूसरी तालिका (संभवतः एक अलग क्लस्टर पर) पर लिखता है। इसका उपयोग कई उद्देश्यों के लिए किया जा सकता है:
- तालिका की आंतरिक प्रति (गरीब व्यक्ति का स्नैपशॉट)
- रिमोट HBase इंस्टेंस बैकअप
- वृद्धिशील HBase तालिका प्रतियां
- आंशिक HBase तालिका प्रतियां और HBase तालिका स्कीमा परिवर्तन
मान्यताएं और सीमाएं:
कॉपीटेबल टूल की कुछ बुनियादी मान्यताएं और सीमाएं हैं। सबसे पहले, यदि बहु-क्लस्टर स्थिति में उपयोग किया जा रहा है, तो दोनों क्लस्टर ऑनलाइन होने चाहिए और लक्ष्य उदाहरण के लिए स्रोत तालिका के रूप में परिभाषित समान स्तंभ परिवारों के साथ लक्ष्य तालिका मौजूद होनी चाहिए।
चूंकि उपकरण मानक स्कैन और पुट का उपयोग करता है, इसलिए लक्ष्य क्लस्टर में समान संख्या में नोड्स या क्षेत्र नहीं होते हैं। वास्तव में, इसमें अलग-अलग संख्या में टेबल, अलग-अलग संख्या में क्षेत्र सर्वर हो सकते हैं, और पूरी तरह से अलग क्षेत्र विभाजित सीमाएं हो सकती हैं। चूंकि हम संपूर्ण तालिकाओं की प्रतिलिपि बना रहे हैं, आप अधिक दक्षता के लिए बड़े स्कैनर कैशिंग मान सेट करने जैसी प्रदर्शन अनुकूलन सेटिंग्स का उपयोग कर सकते हैं। पुट इंटरफ़ेस का उपयोग करने का अर्थ यह भी है कि विभिन्न छोटे संस्करणों के समूहों के बीच प्रतियां बनाई जा सकती हैं। (0.90.4 -> 0.90.6, CDH3u3 -> CDH3u4) या ऐसे संस्करण जो वायर संगत हैं (0.92.1 -> 0.94.0)।
अंत में, HBase केवल पंक्ति-स्तरीय ACID गारंटी प्रदान करता है; इसका मतलब है कि जब एक कॉपीटेबल चल रहा है, नई सम्मिलित या अद्यतन पंक्तियाँ हो सकती हैं और ये समवर्ती संपादन या तो पूरी तरह से शामिल किए जाएंगे या पूरी तरह से बाहर किए जाएंगे। जबकि पंक्तियाँ सुसंगत होंगी, अन्य पंक्तियों पर निरंतरता, कार्य-कारण या क्रम के क्रम के बारे में कोई गारंटी नहीं है।
तालिका की आंतरिक प्रति (गरीब व्यक्ति का स्नैपशॉट)
HBase के नवीनतम 0.94.x संस्करणों तक के संस्करण तालिका स्नैपशॉटिंग का समर्थन नहीं करते हैं। HBase की ACID सीमाओं के बावजूद, CopyTable का उपयोग एक भोले स्नैपशॉट तंत्र के रूप में किया जा सकता है जो किसी विशेष तालिका की भौतिक प्रतिलिपि बनाता है।
मान लें कि हमारे पास कॉलम-परिवार cf1 और cf2 के साथ एक टेबल, टेबलऑरिग है। हम इसके सभी डेटा को टेबलकॉपी में कॉपी करना चाहते हैं। हमें पहले एक ही कॉलम वाले परिवारों के साथ टेबलकॉपी बनाने की जरूरत है:
srcCluster$ echo "create 'tableOrig', 'cf1', 'cf2'" | hbase shell
फिर हम उसी HBase इंस्टेंस पर एक नए नाम के साथ टेबल बना और कॉपी कर सकते हैं:
srcCluster$ hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=tableCopy tableOrig
यह एक MR कार्य शुरू करता है जो डेटा को कॉपी करेगा।
रिमोट HBase इंस्टेंस बैकअप
मान लीजिए कि हम डेटा को दूसरे क्लस्टर में कॉपी करना चाहते हैं। यह एक बार का बैकअप हो सकता है, एक आवधिक कार्य हो सकता है या क्रॉस-क्लस्टर प्रतिकृति के लिए बूटस्ट्रैपिंग के लिए हो सकता है। इस उदाहरण में, हमारे पास दो अलग-अलग क्लस्टर होंगे:srcCluster और dstCluster।
इस बहु-क्लस्टर मामले में, CopyTable एक पुश प्रक्रिया है — आपका स्रोत HBase इंस्टेंस होगा जिसे आपका वर्तमान hbase-site.xml संदर्भित करता है और जोड़े गए तर्क गंतव्य क्लस्टर और तालिका को इंगित करते हैं। यह भी मानता है कि सभी MR टास्कट्रैकर्स गंतव्य क्लस्टर में सभी HBase और ZK नोड्स तक पहुंच सकते हैं। कॉन्फ़िगरेशन के लिए इस तंत्र का अर्थ यह भी है कि आप किसी भी सुलभ दूरस्थ क्लस्टर से सेटिंग्स का उपयोग करने के लिए hbase/mr कॉन्फ़िगरेशन को ओवरराइड करके दूरस्थ क्लस्टर पर नौकरी के रूप में इसे चला सकते हैं और गंतव्य क्लस्टर में ZK नोड्स निर्दिष्ट कर सकते हैं। यह उपयोगी हो सकता है यदि आप कम SLA वाले HBase क्लस्टर से डेटा कॉपी करना चाहते हैं और सीधे उन पर MR जॉब नहीं चलाना चाहते हैं।
आप -peer.adr सेटिंग का उपयोग गंतव्य क्लस्टर के ZK एन्सेम्बल (उदा. जिस क्लस्टर में आप कॉपी कर रहे हैं) को निर्दिष्ट करने के लिए करेंगे। इसके लिए हमें अपने HBase उदाहरण के लिए ZK कोरम के IP और पोर्ट के साथ-साथ HBase रूट ZK नोड की आवश्यकता है। मान लें कि इनमें से एक मशीन srcClusterZK (hbase.zookeeper.quorum में सूचीबद्ध) है और हम डिफ़ॉल्ट zk क्लाइंट पोर्ट 2181 (hbase.zookeeper.property.clientPort) और डिफ़ॉल्ट ZK znode पैरेंट /hbase (zookeeper.znode.) का उपयोग कर रहे हैं। माता-पिता)। (नोट:यदि आपके पास एक ही ZK का उपयोग करने वाले दो HBase इंस्टेंस हैं, तो आपको प्रत्येक क्लस्टर के लिए एक अलग zookeeper.znode.parent की आवश्यकता होगी।
# create new tableOrig on destination cluster dstCluster$ echo "create 'tableOrig', 'cf1', 'cf2'" | hbase shell # on source cluster run copy table with destination ZK quorum specified using --peer.adr # WARNING: In older versions, you are not alerted about any typo in these arguments! srcCluster$ hbase org.apache.hadoop.hbase.mapreduce.CopyTable --peer.adr=dstClusterZK:2181:/hbase tableOrig
ध्यान दें कि आप –new.name तर्क का उपयोग –peer.adr के साथ dstCluster पर किसी भिन्न नाम वाली तालिका में कॉपी करने के लिए कर सकते हैं।
# create new tableCopy on destination cluster dstCluster$ echo "create 'tableCopy', 'cf1', 'cf2'" | hbase shell # on source cluster run copy table with destination --peer.adr and --new.name arguments. srcCluster$ hbase org.apache.hadoop.hbase.mapreduce.CopyTable --peer.adr=dstClusterZK:2181:/hbase --new.name=tableCopy tableOrig
यह srcCluster पर टेबलऑरिग से डेटा को dstCluster की टेबलकॉपी टेबल पर कॉपी कर देगा।
वृद्धिशील HBase तालिका प्रतियां
एक बार जब आपके पास गंतव्य क्लस्टर पर एक तालिका की एक प्रति हो जाती है, तो आप नए डेटा की प्रतिलिपि कैसे बनाते हैं जो बाद में स्रोत क्लस्टर में लिखा जाता है? स्वाभाविक रूप से, आप कॉपीटेबल जॉब को फिर से चला सकते हैं और पूरी टेबल पर कॉपी कर सकते हैं। हालांकि, CopyTable एक अधिक कुशल वृद्धिशील प्रतिलिपि तंत्र प्रदान करता है जो समय की एक विंडो में निर्दिष्ट srcCluster से बैकअप dstCluster में अद्यतन पंक्तियों की प्रतिलिपि बनाता है। इस प्रकार, प्रारंभिक प्रतिलिपि के बाद, आपके पास आवधिक क्रॉन जॉब हो सकता है जो केवल पिछले घंटे से डेटा को srcCluster से dstCuster में कॉपी करता है।
यह -स्टार्टटाइम और -एंडटाइम तर्कों को निर्दिष्ट करके किया जाता है। यूनिक्स युग के समय से समय को दशमलव मिलीसेकंड के रूप में निर्दिष्ट किया जाता है।
# WARNING: In older versions, you are not alerted about any typo in these arguments! # copy from beginning of time until timeEnd # NOTE: Must include start time for end time to be respected. start time cannot be 0. srcCluster$ hbase org.apache.hadoop.hbase.mapreduce.CopyTable ... --starttime=1 --endtime=timeEnd ... # Copy from starting from and including timeStart until the end of time. srcCluster$ hbase org.apache.hadoop.hbase.mapreduce.CopyTable ... --starttime=timeStart ... # Copy entries rows with start time1 including time1 and ending at timeStart excluding timeEnd. srcCluster$ hbase org.apache.hadoop.hbase.mapreduce.CopyTable ... --starttime=timestart --endtime=timeEnd
आंशिक HBase तालिका प्रतियां और HBase तालिका स्कीमा परिवर्तन
डिफ़ॉल्ट रूप से, CopyTable सभी कॉलम परिवारों को मेल खाने वाली पंक्तियों से कॉपी करेगा। कॉपीटेबल केवल विशिष्ट कॉलम-परिवारों से डेटा कॉपी करने के विकल्प प्रदान करता है। यह मूल स्रोत डेटा की प्रतिलिपि बनाने और व्युत्पन्न डेटा कॉलम परिवारों को बाहर करने के लिए उपयोगी हो सकता है, जिन्हें फॉलो ऑन प्रोसेसिंग द्वारा जोड़ा जाता है।
इन तर्कों को जोड़कर हम केवल निर्दिष्ट कॉलम परिवारों से डेटा कॉपी करते हैं।
- –परिवार=srcCf1
- –परिवार=srcCf1,srcCf2
0.92.0 से शुरू करके आप कॉलम परिवार का नाम बदलते समय कॉपी कर सकते हैं:
- –परिवार=srcCf1:dstCf1
- srcCf1 से dstCf1 में कॉपी करें
- –परिवार=srcCf1:dstCf1,dstCf2,srcCf3:dstCf3
- srcCf1 से destCf1 में कॉपी करें, dstCf2 को dstCf2 में कॉपी करें (कोई नाम नहीं), और srcCf3 को dstCf3 में कॉपी करें
कृपया ध्यान दें कि dstCf* dstCluster तालिका में मौजूद होना चाहिए!
0.94.0 से शुरू करके हटाए गए मार्करों की प्रतिलिपि बनाने और सीमित संख्या में अधिलेखित संस्करणों को शामिल करने के लिए नए विकल्प पेश किए जाते हैं। पहले, यदि स्रोत क्लस्टर में कोई पंक्ति हटा दी जाती है, तो हटाए जाने की प्रतिलिपि नहीं बनाई जाएगी - इसके बजाय उस पंक्ति का एक पुराना संस्करण गंतव्य क्लस्टर में रहेगा। यह 0.94.0 रिलीज़ की कुछ उन्नत सुविधाओं का लाभ उठाता है।
- –संस्करण=बनाम
- जहां वर्स कॉपी करने के लिए सेल संस्करणों की संख्या है (डिफ़ॉल्ट केवल 1 उर्फ नवीनतम है)
- –all.cells
- हटाए गए मार्कर और हटाए गए सेल को भी कॉपी करें
आम नुकसान
0.90.x, 0.92.x, और 0.94.x संस्करणों में HBase क्लाइंट हमेशा चिड़ियाघर का उपयोग करता है। यह "सुविधा" CDH3 HBase में एक सामान्य समस्या का कारण बनती है क्योंकि इसके पैकेज एक निर्देशिका को शामिल करने के लिए डिफ़ॉल्ट होते हैं जहां चिड़ियाघर.cfg HBase के क्लासपाथ में रहता है। CopyTable (HBASE-4614) का उपयोग करने का प्रयास करते समय इससे निराशा हो सकती है और हो सकती है। इसका समाधान यह है कि आपके HBase के क्लासपाथ से Zoo.cfg फ़ाइल को बाहर रखा जाए और आपकी hbase-site.xml फ़ाइल में ZooKeeper कॉन्फ़िगरेशन गुण निर्दिष्ट किए जाएं। http://hbase.apache.org/book.html#zookeeper
निष्कर्ष
CopyTable HBase 0.90.x (CDH3) परिनियोजन के लिए सरल लेकिन प्रभावी आपदा वसूली बीमा प्रदान करता है। CDH4 के HBase 0.92.x आधारित HBase में मिली और समर्थित प्रतिकृति सुविधा के संयोजन के साथ, CopyTable की वृद्धिशील विशेषताएं कम मूल्यवान हो जाती हैं, लेकिन प्रतिकृति तालिका को बूटस्ट्रैप करने के लिए इसकी मुख्य कार्यक्षमता महत्वपूर्ण है। जबकि अधिक उन्नत सुविधाएँ जैसे कि HBase स्नैपशॉट (HBASE-50) आपदा पुनर्प्राप्ति में सहायता कर सकती हैं, जब इसे लागू किया जाता है, तब भी CopyTable HBase व्यवस्थापक के लिए एक उपयोगी उपकरण होगा।