2012-01-22 9 views
10

मैं एक MapReduce नौकरी कि किसी दिए गए तिथि सीमा में सभी पंक्तियों हो जाता है लिखने के लिए की जरूरत है। यह एक चालक दल था जिसने माई रो कुंजी को तिथि के साथ शुरू किया था। लेकिन मेरे लगातार Hbase प्रश्न कुंजी के मूल्यों को शुरू करने पर हैं।HBase कैसे स्कैन करने के लिए पंक्तियाँ कुशलतापूर्वक

मेरी पंक्ति कुंजी बिल्कुल ए | बी | सी | 20120121 | डी है। जहां तिथि के साथ ए/बी/सी का संयोजन (वर्षमोथडे प्रारूप में) एक अद्वितीय पंक्ति आईडी बनाता है।

मेरे HBase टेबल तक कुछ लाख पंक्तियों हो सकता था। क्या मेरा मैपर सभी टेबल पढ़ता है और प्रत्येक पंक्ति को फ़िल्टर करता है यदि यह दी गई तिथि सीमा में आता है या स्कैन/फ़िल्टर इस स्थिति को संभालने में मदद कर सकता है?

कोई सुझाव है सका (या कोड का एक टुकड़ा) एक प्रभावी ढंग से इस स्थिति से निपटने के लिए एक रास्ता?

धन्यवाद -Panks

+0

आप कुंजी की पुन: व्यवस्थित और पुरानी स्क्रैप के साथ तालिका की सामग्री को एक नए में क्यों कॉपी नहीं करते हैं? – Mario

+0

@ मारियो क्या होगा यदि तालिका में ट्रिलियन कुंजी हों? और उसे अक्सर ऐसा करने की ज़रूरत है? – markg

उत्तर

5

आप एक RegexStringComparator के साथ एक RowFilter उपयोग कर सकते हैं। आपको एक RegEx के साथ आने की आवश्यकता होगी जो आपकी तिथियों को उचित रूप से फ़िल्टर करे। This page में एक उदाहरण है जिसमें MapReduce स्कैनर के लिए फ़िल्टर सेट करना शामिल है।

+1

यदि रोकी आसान है, तो सर्वश्रेष्ठ प्रदर्शन प्राप्त करें। यदि लौटाया गया परिणाम एक पंक्ति के लिए बहुत विशाल है, तो प्राप्त करें और बैच आकार के साथ स्कैन बेहतर/सुरक्षित विकल्प है। –

0

मैं बस हूँ HBase को आरंभ करने में मदद कर सकता है bloom filters

+1

ब्लूम फ़िल्टर यहां तक ​​मदद नहीं करेंगे जब तक कि वह सटीक कुंजी नहीं जानता। –

+0

धन्यवाद क्रिस - ब्लूम फ़िल्टर मेमोरी का उपयोग कुशलतापूर्वक उपयोग करने के लिए वास्तविक डेटा के बजाय डेटा पचाने को संग्रहीत करता है - इसलिए पैटर्न मिलान संभव नहीं होना चाहिए। –

0

आप स्कैन कि आप मैपर में भेज एक फिल्टर शामिल करने के लिए संशोधित कर सकते हैं। यदि आपके तारीख भी रिकॉर्ड टाइमस्टैम्प है, यह आसान है:

Scan scan = new Scan(); 
scan.setTimeRange(minTime, maxTime); 
TableMapReduceUtil.initTableMapperJob("mytable", scan, MyTableMapper.class, 
    OutputKey.class, OutputValue.class, job); 

यदि आपका पंक्ति कुंजी में तारीख अलग है, तो आप अपने स्कैन करने के लिए एक फिल्टर जोड़ने के लिए होगा। यह फ़िल्टर कॉलम या पंक्ति कुंजी पर काम कर सकता है। मुझे लगता है कि यह केवल पंक्ति कुंजी के साथ गन्दा होने जा रहा है। यदि आप दिनांक को कॉलम में डालते हैं, तो आप FilterList बना सकते हैं जहां सभी स्थितियां सत्य हों और CompareOp.GREATER और CompareOp.LESS का उपयोग करें। फिर स्कैन में अपने फ़िल्टर जोड़ने के लिए scan.setFilter(filterList) का उपयोग करें।

+0

टाइमटाइम पर टाइमटाइम रेंज फ़िल्टर, पंक्ति कुंजी नहीं। –

10

एक एक रेगुलर एक्सप्रेशन से फ़िल्टर के साथ RowFilter काम करेगा, लेकिन सबसे इष्टतम समाधान नहीं होगा। वैकल्पिक रूप से आप माध्यमिक अनुक्रमणिका का उपयोग करने का प्रयास कर सकते हैं।

FuzzyRowFIlter को आजमाने का एक और समाधान है। एक FuzzyRowFilter एक प्रकार का फास्ट-फ़ॉरवर्डिंग का उपयोग करता है, इसलिए समग्र स्कैन प्रक्रिया में कई पंक्तियों को छोड़ना और इस प्रकार रोफिल्टर स्कैन से तेज़ होगा। आप इसके बारे में अधिक पढ़ सकते हैं here

वैकल्पिक रूप से ब्लूमफिल्टर आपकी स्कीमा के आधार पर भी मदद कर सकते हैं। यदि आपका डेटा बहुत बड़ा है तो आपको द्वितीयक सूचकांक और ब्लूम फ़िल्टर पर तुलनात्मक विश्लेषण करना चाहिए।

संबंधित मुद्दे