DBInputFormat SQL से NoSQL डेटाबेस में डेटा ट्रांसफर करने के लिए



इस ब्लॉग का उद्देश्य यह सीखना है कि SQL डेटाबेस से डेटा को HDFS में कैसे स्थानांतरित किया जाए, SQL डेटाबेस से NoSQL डेटाबेस में डेटा कैसे स्थानांतरित किया जाए।

इस ब्लॉग में हम Hadoop तकनीक यानी MapReduce के सबसे महत्वपूर्ण घटकों में से एक की क्षमताओं और संभावनाओं का पता लगाएंगे।

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





Hadoop ढांचे में सबसे शक्तिशाली घटक MapReduce है जो डेटा और इसके संरचना पर नियंत्रण अपने अन्य समकक्षों की तुलना में बेहतर प्रदान कर सकता है। यद्यपि इसके लिए सीखने की अवस्था और प्रोग्रामिंग जटिलता की अधिकता की आवश्यकता होती है, यदि आप इन जटिलताओं को संभाल सकते हैं तो आप निश्चित रूप से किसी भी प्रकार के डेटा को हडोप के साथ संभाल सकते हैं।

MapReduce ढांचा मूल रूप से दो चरणों में अपने सभी प्रसंस्करण कार्यों को तोड़ता है: मानचित्र और घटाना।



इन चरणों के लिए अपने कच्चे डेटा को तैयार करने के लिए कुछ बुनियादी वर्गों और इंटरफेस की समझ की आवश्यकता होती है। इन पुनरावृत्ति के लिए सुपर क्लास है इनपुट प्रारूप।

इनपुट प्रारूप वर्ग Hadoop MapReduce API में मुख्य वर्गों में से एक है। यह वर्ग दो मुख्य चीजों को परिभाषित करने के लिए जिम्मेदार है:

  • डेटा विभाजन
  • रीडर को रिकॉर्ड करें

डेटा विभाजन Hadoop MapReduce ढांचे में एक मौलिक अवधारणा है जो व्यक्तिगत मानचित्र कार्यों और इसके संभावित निष्पादन सर्वर दोनों के आकार को परिभाषित करता है। द रिकॉर्ड रीडर इनपुट फ़ाइल से वास्तविक पढ़ने के रिकॉर्ड और उन्हें मैपर के लिए कुंजी (मूल्य जोड़े के रूप में) के लिए जिम्मेदार है।



विभाजन की संख्या के आधार पर मैपर्स की संख्या तय की जाती है। यह विभाजन बनाने के लिए InputFormat का काम है। अधिकांश समय विभाजन आकार ब्लॉक आकार के बराबर होता है, लेकिन यह हमेशा नहीं होता है कि एचडीएफएस ब्लॉक आकार के आधार पर विभाजन बनाए जाएंगे। यह पूरी तरह से इस बात पर निर्भर करता है कि आपके इनपुटफ़ॉर्मैट के getSplits () विधि को कैसे ओवरराइड किया गया है।

एमआर विभाजन और एचडीएफएस ब्लॉक के बीच एक बुनियादी अंतर है। एक ब्लॉक डेटा का एक भौतिक हिस्सा है जबकि एक विभाजन सिर्फ एक तार्किक हिस्सा है जो एक मैपर पढ़ता है। एक विभाजन में इनपुट डेटा नहीं होता है, यह केवल डेटा का एक संदर्भ या पता रखता है। एक विभाजन में मूल रूप से दो चीजें होती हैं: बाइट्स में एक लंबाई और भंडारण स्थानों का एक सेट, जो सिर्फ तार हैं।

इसे बेहतर ढंग से समझने के लिए, आइए एक उदाहरण लेते हैं: एमआर का उपयोग करके आपके MySQL में संग्रहीत डेटा संसाधित करना। चूंकि इस मामले में ब्लॉकों की कोई अवधारणा नहीं है, सिद्धांत: 'विभाजन हमेशा एचडीएफएस ब्लॉक के आधार पर बनाए जाते हैं'विफल रहता है। एक संभावना आपके MySQL तालिका में पंक्तियों की श्रेणियों के आधार पर विभाजन बनाने की है (और यह DBInputFormat एक रिलेशनल डेटाबेस से डेटा पढ़ने के लिए एक इनपुट प्रारूप है)। हमारे पास n पंक्तियों से मिलकर विभाजन की संख्या हो सकती है।

यह केवल FileFputFormat (फ़ाइलों में संग्रहीत डेटा को संभालने के लिए एक InputFormat) पर आधारित InputFormats के लिए है कि विभाजन, कुल आकार के आधार पर, बाइट्स में, इनपुट फ़ाइलों के आधार पर बनाए जाते हैं। हालाँकि, इनपुट फ़ाइलों की फ़ाइलसिस्टम ब्लॉकशीट को इनपुट विभाजन के लिए एक ऊपरी बाध्य के रूप में माना जाता है। यदि आपके पास HDFS ब्लॉक आकार से छोटा फ़ाइल है, तो आपको उस फ़ाइल के लिए केवल 1 मैपर मिलेगा। यदि आप कुछ अलग व्यवहार करना चाहते हैं, तो आप mapred.min.split.size का उपयोग कर सकते हैं। लेकिन यह फिर से आपके InputFormat के getSplits () पर निर्भर करता है।

हमारे पास संकुल org.apache.hadoop.mapreduce.lib.input के तहत पहले से मौजूद इनपुट प्रारूप उपलब्ध हैं।

CombineFileInputFormat.html

CombineFileRecordReader.html

CombineFileRecordReaderWrapper.html

CombineFileSplit.html

कॉम्बीनेशनेसफाइलइन्फोर्मोफार्मैट। Html

कैसे जावा में एक कार्यक्रम को समाप्त करने के लिए

CombineTextInputFormat.html

FileInputFormat.html

FileInputFormatCounter.html

FileSplit.html

FixedLengthInputFormat.html

InvalidInputException.html

KeyValueLineRecordReader.html

KeyValueTextInputFormat.html

एकाधिकइंस्पेक्ट्स। Html

NLineInputFormat.html

SequenceFileAsBinaryInputFormat.html

SequenceFileAsTextInputFormat.html

SequenceFileAsTextRecordReader.html

SequenceFileInputFilter.html

SequenceFileInputFormat.html

SequenceFileRecordReader.html

TextInputFormat.html

डिफ़ॉल्ट जा रहा है TextInputFormat।

इसी तरह, हमारे पास बहुत सारे आउटपुट प्रारूप हैं जो डेटा को रीड्यूसर से पढ़ते हैं और इसे एचडीएफएस में संग्रहीत करते हैं:

FileOutputCommitter.html

FileOutputFormat.html

FileOutputFormatCounter.html

FilterOutputFormat.html

LazyOutputFormat.html

MapFileOutputFormat.html

मल्टिपल ऑउटपुट। Html

NullOutputFormat.html

PartialFileOutputCommitter.html

PartialOutputCommitter.html

SequenceFileAsBinaryOutputFormat.html

SequenceFileOutputFormat.html

TextOutputFormat.html

डिफ़ॉल्ट जा रहा है TextOutputFormat।

जब तक आप इस ब्लॉग को पढ़ना समाप्त करते हैं, तब तक आप सीख चुके होते हैं:

  • मैप कम करने का प्रोग्राम कैसे लिखें
  • Mapreduce में उपलब्ध विभिन्न प्रकार के InputFormats के बारे में
  • InputFormats की क्या आवश्यकता है
  • कस्टम InputFormats कैसे लिखें
  • SQL डेटाबेस से HDFS में डेटा ट्रांसफर कैसे करें
  • SQL (यहां MySQL) डेटाबेस से NoSQL डेटाबेस (यहां Hbase) में डेटा ट्रांसफर कैसे करें
  • SQL डेटाबेस में एक SQL डेटाबेस से दूसरी तालिका में डेटा कैसे स्थानांतरित करें (शायद यह उतना महत्वपूर्ण नहीं हो सकता है अगर हम एक ही SQL डेटाबेस में ऐसा करते हैं। हालांकि, उसी का ज्ञान होने में कुछ भी गलत नहीं है। आप कभी नहीं जानते हैं। यह कैसे उपयोग में आ सकता है)

शर्त:

  • Hadoop पहले से स्थापित है
  • SQL पूर्व-स्थापित
  • Hbase पूर्व-स्थापित
  • जावा मूल समझ
  • MapReduce ज्ञान
  • Hadoop ढांचा बुनियादी ज्ञान

समस्या के कथन को समझने दें, जिसे हम यहाँ हल करने जा रहे हैं:

हम अपने संबंधपरक डेटाबेस Edureka में MySQL DB में एक कर्मचारी तालिका रखते हैं। अब व्यावसायिक आवश्यकता के अनुसार हमें रिलेशनल DB में उपलब्ध सभी डेटा को Hadoop फाइल सिस्टम यानी HDFS, NoSQL DB में Hbase के रूप में जाना जाता है।

इस कार्य को करने के लिए हमारे पास कई विकल्प हैं:

  • सकप
  • फुलाना
  • मानचित्र छोटा करना

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

ध्यान दें:

  • हमें MySQL टेबल से टेबल लाने के लिए Hadoop के classpath में MySQL कनेक्टर को डाउनलोड करने और डालने की आवश्यकता है। इसे करने के लिए कनेक्टर com.mysql.jdbc_5.1.5.jar डाउनलोड करें और इसे Hadoop_home / share / Hadoop / MaPreduce / lib निर्देशिका के अंतर्गत रखें।
cp डाउनलोड / com.mysql.jdbc_5.1.5.jar $ HADOOP_HOME / share / hadoop / mapreduce / lib /
  • इसके अलावा, अपने MR प्रोग्राम को Hbase तक पहुँच बनाने के लिए Hadoop classpath के अंतर्गत सभी Hbase जार रखें। ऐसा करने के लिए, निम्न कमांड निष्पादित करें :
cp $ HBASE_HOME / lib / * $ HADOOP_HOME / share / hadoop / mapreduce / /

सॉफ्टवेयर संस्करण जो मैंने इस कार्य के निष्पादन में उपयोग किए हैं, वे हैं:

  • हडूप-2.3.0
  • HBase 0.98.9-Hadoop2
  • ग्रहण का चंद्रमा

किसी भी संगतता मुद्दे में कार्यक्रम से बचने के लिए, मैं अपने पाठकों को समान वातावरण के साथ कमांड चलाने के लिए लिखता हूं।

कस्टम DBInputWritable:

पैकेज com.inputFormat.copy इंपोर्ट java.io.DataInput इंपोर्ट java.io.DataOutput इंपोर्ट java.io.ioException इंपोर्ट java.sql.ResultSet इंपोर्ट java.sql.reparedStatement इंपोर्ट java.sql.SQLException इंपोर्ट org.apache.hadoop.iooff .Writable आयात org.apache.hadoop.mapreduce.lib.db.DBWritable सार्वजनिक वर्ग DBInputWritable अनुलिपि लेखन योग्य, DBWritable {निजी int id निजी स्ट्रिंग नाम, सार्वजनिक शून्य रीड रीडफ़िल्ड (DataInput) फेंकता IOException {} सार्वजनिक शून्य रीडफ़ील्ड (परिणाम) फेंकता SQLException // Resultset ऑब्जेक्ट SQL कथन से लौटाए गए डेटा का प्रतिनिधित्व करता है {id = rs.getInt (1) नाम = rs.getString (2) dept = rs.getString (3)} सार्वजनिक शून्य लिखना (DataOutput out) IOException { } public void लिखना (ReadyedStatement ps) फेंकता है SQLException {ps.setInt (1, id) ps.setString (2, नाम) ps.setString (3, dept)} सार्वजनिक int getd () {रिटर्न आईडी} सार्वजनिक स्ट्रिंग getName () {रिटर्न नाम} सार्वजनिक स्ट्रिंग getDept () {रिटर्न विभाग}}

कस्टम DBOutputWritable:

पैकेज com.inputFormat.copy इंपोर्ट java.io.DataInput इंपोर्ट java.io.DataOutput इंपोर्ट java.io.ioException इंपोर्ट java.sql.ResultSet इंपोर्ट java.sql.reparedStatement इंपोर्ट java.sql.SQLException इंपोर्ट org.apache.hadoop.iooff .Writable आयात org.apache.hadoop.mapreduce.lib.db.DBWritable सार्वजनिक वर्ग DBOutputWritable अनुलिपि लिखने योग्य, DBWritable {निजी स्ट्रिंग नाम निजी int id निजी निजी स्ट्रिंग Stpt सार्वजनिक DBOutputWritable (स्ट्रिंग नाम, int id, String dept) {thisname} name.id = id this.dept = dept} public void readFields (DataInput in) फेंकता IOException {} public void readFields (ResultSet rs) फेंकता है SQLException {सार्वजनिक शून्य लिखना (DataOutput out) फेंकता IOException {} public void write (तैयारी शून्य) ps) SQLException {ps.setString (1, नाम) ps.setInt (2, id) ps.setString (3, dept)}} फेंकता है

इनपुट तालिका:

डेटाबेस edureka बनाएँ
टेबल एंपायर बनाएं (एम्पिड इंट नॉट नल, नेम वेरचर (30), डिप्टी वर्चर (20), प्राइमरी की (एम्पिड))
एम्पायर वैल्यू में डालें (1, 'अभय', 'डिवेलपमेंट'), (2, 'ब्रूंडेश', 'टेस्ट')
एम्पायर से * सेलेक्ट करें

केस 1: MySQL से HDFS में ट्रांसफर

पैकेज com.inputFormat.copy आयात java.net.URI आयात org.apache.hadoop.conf.Configuration आयात org.apache.hadoop.fs.FileSystem आयात org.apache.hadoop.fs.Path आयात org.apache.hadoop.mapreduce .Job आयात org.apache.hadoop.mapreduce.lib.db.DBConfiguration import org.apache.hadoop.mapreduce.lib.db.DBInputFormat आयात org.apache.hadoop.mapreduce.lib.ileput.ileOutputFormat आयात org.apache.hadache .io.Text आयात org.apache.hadoop.io.IntWritable सार्वजनिक वर्ग MainDbtohdfs {सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] args) अपवाद {कॉन्फ़िगरेशन कॉन्फ़िडेंस = नया कॉन्फ़िगरेशन () DBCfigiguration.configureDB (conf, 'com.mysql.jdbcc) .ड्राइवर ', // ड्राइवर वर्ग' jdbc: mysql: // localhost: 3306 / edureka ', // db url' root ', // यूजर नेम' root ') // पासवर्ड जॉब जॉब = नई नौकरी (आत्मविश्वास) .setJarByClass (MainDbtohdfs.class) job.setMapperClass (Map.class) job.setMapOutputKeyClass (Text.class) job.setMapOutVVueueClass (IntWritable.class) job.setInputFormatClass (DBI) (DBI) नया पथ (args [0])) DBInputFormat.setInput (नौकरी, DBInputWritable.class, 'emp', // इनपुट टेबल नाम null, null, new String [] {empid], 'name', 'dept'} / / / तालिका स्तंभ) पथ p = नया पथ (args [0]) FileSystem fs = FileSystem.get (नया URI (args [0]), conf) fs.delete (p) System.exit (job.waFForCompletion (true)) 0: 1)}}

कोड का यह टुकड़ा हमें अपने स्रोत SQL DB तक पहुंचने के लिए इनपुटफॉर्म को तैयार या कॉन्फ़िगर करने देता है। पैरामीटर में ड्राइवर वर्ग शामिल है, URL में SQL डेटाबेस, उसके उपयोगकर्ता नाम और पासवर्ड का पता है।

DBConfiguration.configureDB (conf, 'com.mysql.jdbc.Driver', // ड्राइवर वर्ग 'jdbc: mysql: // localhost: 3306 / edureka', // db url 'root', // यूजर नेम 'root')) //पारण शब्द

इस कोड का टुकड़ा हमें डेटाबेस में तालिकाओं के विवरण को पारित करने और नौकरी की वस्तु में सेट करने देता है। मापदंडों में निश्चित रूप से नौकरी का उदाहरण, कस्टम लिखने योग्य वर्ग शामिल है जो DBWritable इंटरफ़ेस, स्रोत तालिका का नाम, यदि कोई और अशक्त, किसी भी छँटाई मापदंडों और अन्य अशक्त, तालिका स्तंभों की सूची क्रमशः लागू करना चाहिए।

DBInputFormat.setInput (job, DBInputWritable.class, 'emp', // input table name null, null, new String [] {'empid', 'name', 'dept'} // table column)

मैपर

पैकेज com.inputFormat.copy इंपोर्ट java.io.IOException इंपोर्ट org.apache.hadoop.mapreduce.Mapper इंपोर्ट org.apache.hadoop.io.ongWritable इंपोर्ट org.apache.hadoop.io.Text इंपोर्ट org.apache.hadoop.io .IntWritable सार्वजनिक वर्ग का नक्शा मैपर {
संरक्षित शून्य मानचित्र (दीर्घायु कुंजी, DBInputWritable मान, संदर्भ ctx) {प्रयास {स्ट्रिंग नाम = value.getName () IntWritable id = new IntWritable (value.getdd ()) स्ट्रिंग विभाग = value.getDept ()
ctx.write (नया पाठ (नाम + '+ आईडी +' '+ विभाग), आईडी)
} पकड़ (IOException e) {e.printStackTrace ()} catch (InterruptedException e) {e.printStackTrace ()}}}

Reducer: पहचान Reducer प्रयुक्त

चलाने की आज्ञा:

हडॉप जार dbhdfs.jar com.inputFormat.copy.MainDbtohdfs / dbhohofs

आउटपुट: MySQL टेबल HDFS को हस्तांतरित

हडूप dfs -ls / dbtohdfs / *

केस 2: MySQL में एक टेबल से दूसरे में ट्रांसफर

MySQL में आउटपुट टेबल बनाना

टेबल कर्मचारी 1 (नाम varchar (20), id int, dept varchar (20)) बनाएँ

पैकेज com.inputFormat.copy इंपोर्ट org.apache.hadoop.conf.Configuration इंपोर्ट org.apache.hadoop.mapreduce.Job import org.apache.hadoop.mapreduce.lib.b.DBConfiguration इम्पोर्ट org.apache.mapoop.mapreduce.lib. .db.DBInputFormat आयात org.apache.hadoop.mapreduce.lib.db.DBOutputFormat आयात org.apache.hadoop.io.Text आयात org.apache.hadoop.io.ntWritable आयात org.apache.io.NullWritable सार्वजनिक वर्ग। Mainonetable_to_other_table {सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] args) थ्रेड अपवाद {कॉन्फ़िगरेशन मान = नया कॉन्फ़िगरेशन () DBConfiguration.configureDB (conf, 'com.mysql .jdbc.Driver', // ड्राइवर वर्ग 'jdbc: mysql: // localhost : 3306 / edureka ', // db url' root ', // यूजर नेम' root ') // पासवर्ड जॉब job = new Job (conf) job.setJarByClass (Mainonetable_to_other_table_table_class) job.setMapperClass (Map.class) जॉब .setReducerClass (Reduce.class) job.setMapOutputKeyClass (Text.class) job.setMapOutputValueClass (IntWritable.class) job.setOutputKeyClass (DBOutputWritable.class) job.setOutputValueClass। lWritable.class) job.setInputFormatClass (DBInputFormat.class) job.setOutputFormatClass (DBOutputFormat.class) DBInputFormat.setInput (कार्य, DBInputWritable.class, 'emp, // इनपुट टेबल'), // n टेबल नाम। ',' नाम ',' विभाग '} // टेबल कॉलम) DBOutputFormat.setOutput (नौकरी,' कर्मचारी 1 ', // आउटपुट टेबल का नाम नया स्ट्रिंग [] {' नाम ',' आईडी ',' विभाग ') // टेबल कॉलम) System.exit (job.waitForCompletion (सत्य)) 0: 1)}}

कोड का यह टुकड़ा हमें आउटपुट तालिका नाम को SQL DB में कॉन्फ़िगर करने देता है। पैरामीटर क्रमशः जॉब इंस्टेंस, आउटपुट टेबल नाम और आउटपुट कॉलम नाम हैं।

DBOutputFormat.setOutput (कार्य, 'कर्मचारी 1', // आउटपुट तालिका नाम नया स्ट्रिंग [] {'नाम', 'आईडी', 'विभाग'} // तालिका कॉलम)

मैपर: केस 1 के समान

Reducer:

पैकेज com.inputFormat.copy इंपोर्ट java.io.IOException इंपोर्ट org.apache.hadoop.mapreduce.Reducer इंपोर्ट org.apache.hadoop.io.Text इंपोर्ट org.apache.hadoop.io.IWWritable इंपोर्ट org.apache.hadoop.io .NullWritable पब्लिक क्लास रिड्यूसर Reducer {संरक्षित शून्य कम (टेक्स्ट की, इरिटेबल वैल्यूज़, कॉन्टेक्ट ctx) {int sum = 0 स्ट्रिंग लाइन [] = key.toString () (स्प्लिट ’()) try {ctx.write (नया DBOutputWritable) को बढ़ाता है। (लाइन [0] .toString (), Integer.parseInt (लाइन [1] .toString ()), लाइन [2] .toString ()), NullWritable.get ())} पकड़ (IOException e) {e.printStackTrace ()} कैच (InterruptedException e) {e.printStackTrace ()}}}

चलाने के लिए आदेश:

हडॉप जार dbhdfs.jar com.inputFormat.copy.Mainonetable_to_other_table

आउटपुट: MySQL में EMP टेबल से दूसरी तालिका Employee1 में स्थानांतरित डेटा MySQL में

केस 3: MySQL में तालिका से NoSQL (Hbase) तालिका में स्थानांतरण

SQL तालिका से आउटपुट को समायोजित करने के लिए Hbase तालिका बनाना:

'कर्मचारी' बनाएं, 'official_info'

चालक वर्ग:

पैकेज Dbtohbase import org.apache.hadoop.conf.Configuration import org.apache.hadoop.mapreduce.Job import org.apache.hadoop.mapreduce.lib.db.BConfiguration इंपोर्ट org.apache.mapup.mapreduce.lib.db.DBInputFputForm import org.apache.hadoop.hbase.mapreduce.TableOutputFormat import org.apache.hadoop.hbase.HBaseConfiguration import org.apache.hadoop.hbase .client.HTable इंपोर्ट org.apache.hbase.client.HTableInterap पर आयात करें। .hadoop.hbase.io.ImmutableBytesWritable आयात org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil आयात org.apache.hadoop.io.Text श्रेणी वर्ग MainDbToHbase {सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] आर्स) थ्रेड्स एक्सफ़ोलिएशन। HBaseConfiguration.create () HTableInterface mytable = नया HTable (conf, 'emp') DBConfiguration.configureDB (conf, 'com.mysql.jdbc.Dverver', // ड्राइवर वर्ग 'jdbc: mysql: // localhost / edureka) , // db url 'root', // यूजर नेम 'root') // पासवर्ड जॉब जॉब = नई नौकरी (conf, 'dbtohbase') job.setJarByClass (MainDbToHbase.class): job.s etMapperClass (Map.class) job.setMapOutputKeyClass (ImmutableBytesWritable.class) job.setMapOutputValueClass (Text.class) TableSReduceUtil.initTableReducerJob ('एंप्लॉयी), Reduce.class, जॉब, जॉब, जॉब, जॉब्स, जॉब। वर्ग) DBInputFormat.setInput (कार्य, DBInputWritable.class, 'emp', // इनपुट टेबल नाम null, null, New String [] {'empid', 'name', 'dept'} // table column) System.exit (job.waitForCompletion (सच)? 0: 1)}}

कोड का यह टुकड़ा आपको आउटपुट कुंजी वर्ग को कॉन्फ़िगर करने देता है जो hbase के मामले में ImmutableBytesWritable है

job.setMapOutputKeyClass (ImmutableBytesWritable.class) job.setMapOutputValueClass (Text.class)

यहां हम टेबल पर कार्य करने के लिए hbase तालिका नाम और reducer पारित कर रहे हैं।

TableMapReduceUtil.initTableReducerJob ('कर्मचारी', Reduce.class, नौकरी)

मैपर:

पैकेज Dbtohbase आयात java.io.IO.ception आयात आयात org.apache.hadoop.mapreduce.Mapper आयात org.apache.hadoop.hbase.io.mmutableBytesWritable आयात org.apache.hbase.util.Bytes आयात org.apache.hadoff.io .LongWritable आयात org.apache.hadoop.io.Text आयात org.apache.hadoop.io.IntWritable सार्वजनिक वर्ग मानचित्र Mapper {निजी IntWritable एक = नया IntWritable (1) संरक्षित शून्य मानचित्र (LongWritable आईडी, DBInputWritable मान, संदर्भ संदर्भ) का विस्तार करता है {प्रयास {स्ट्रिंग लाइन = value.getName () स्ट्रिंग cd = value.getId () + '' स्ट्रिंग विभाग = मान.getDept () संदर्भ.लेखित करें (नया ImmutableBytesWritable (Bytes.toBytes (सीडी)), नया पाठ (लाइन + ') '+ dept))} पकड़ (IOException e) {e.printStackTrace ()} catch (InterruptedException e) {e.printStackTrace ()}}}

इस कोड के कोड में हम DBinputwritable class के getters से मान ले रहे हैं और फिर उन्हें पास कर रहे हैं
ImmutableBytesWritable ताकि वे बायट्रिएब्रल रूप में रेड्यूसर तक पहुंचें जो कि Hbase समझता है।

स्ट्रिंग लाइन = value.getName () स्ट्रिंग cd = value.getId () + '' स्ट्रिंग विभाग = value.getDept () संदर्भ.लेख (नया ImmutableBytesWritable (बाइट्स .toBytes) (सीडी)), नया पाठ (लाइन + '' '+ विभाग) ))

Reducer:

पैकेज Dbtohbase आयात java.io.IOException आयात आयात org.apache.hadoop.hbase.client.Put आयात org.apache.hadoop.hbase.io.mmutableBytesWrase आयात org.apache.hbase.mapreduce.TableReducer आयात org.apache .hbase.util.Bytes आयात org.apache.hadoop.io.Text सार्वजनिक वर्ग Reduce TableReducer का विस्तार करता है {सार्वजनिक शून्य कम करें (ImmutableBytesWritable कुंजी, Iterable मान, प्रसंग संदर्भ) IOException, InterruptedException {String [] कारण = null लूप मानों को कम करता है। for (पाठ वैल: मान) {कारण = val.toString ()। विभाजन ('')} // // HBase Put में डालिए = new Put (key.get ()) put.add (Bytes.toBytes ('official -info') ), Bytes.toBytes ('नाम'), Bytes.toBytes (कारण [0]) put.add (Bytes.toBytes ('official_info'), Bytes.toBytes ('विभाग'), Bytes.toBytes (कारण [1] ])) Reference.write (कुंजी, पुट)}}

कोड का यह टुकड़ा हमें सटीक पंक्ति और स्तंभ तय करने देता है जिसमें हम reducer से मान संचयित करेंगे। यहां हम प्रत्येक एम्पिड को अलग-अलग पंक्ति में संग्रहीत कर रहे हैं क्योंकि हमने पंक्ति कुंजी के रूप में एम्पिड बनाया है जो अद्वितीय होगा। प्रत्येक पंक्ति में हम कॉलम 'नाम' और 'विभाग' के तहत क्रमशः कॉलम परिवार 'आधिकारिक_इनफो' के तहत कर्मचारियों की आधिकारिक जानकारी संग्रहीत कर रहे हैं।

Put put = new Put (key.get ()) put.add (Bytes.toBytes ('official_info'), Bytes.toBytes ('name'), Bytes.toBytes (कारण [0 [)) put.add (बाइट्स)। toBytes ('official_info'), बाइट्स .toBytes ('डिपार्टमेंट'), बाइट्स .toBytes (कारण [1])) reference.write (कुंजी, पुट)

Hbase में स्थानांतरित डेटा:

कर्मचारी को स्कैन करें

शुरुआती के लिए pl sql डेवलपर ट्यूटोरियल

जैसा कि हम देखते हैं कि हम अपने व्यावसायिक डेटा को रिलेशनल SQL DB से NoSQL DB में सफलतापूर्वक स्थानांतरित करने के कार्य को पूरा करने में सक्षम थे।

अगले ब्लॉग में हम सीखेंगे कि अन्य इनपुट और आउटपुट प्रारूपों के लिए कोड कैसे लिखें और निष्पादित करें।

अपनी टिप्पणी, प्रश्न या कोई प्रतिक्रिया पोस्ट करते रहें। मैं आपसे सुनना पसंद करूँगा।

क्या आप हमसे कोई प्रश्न पूछना चाहते हैं? कृपया टिप्पणी अनुभाग में इसका उल्लेख करें और हम आपके पास वापस आ जाएंगे।

संबंधित पोस्ट: