2012-07-19 12 views
5

एक एसक्यूओपी क्वेरी एक जावा फ़ाइल उत्पन्न करती है जिसमें एक कक्षा होती है जिसमें प्रत्येक पंक्ति के लिए कॉलम डेटा पर मैप्रिडस में पहुंच प्राप्त करने के लिए कोड होता है। (स्क्वाओप आयात --as-sequencefile विकल्प के बिना पाठ में किया गया था, और कॉलम के बीच प्रति रिकॉर्ड और कॉमा के साथ 1 लाइन) लेकिन हम वास्तव में इसका उपयोग कैसे करते हैं?MapReduce में sqoop जेनरेट क्लास का उपयोग कैसे करें?

मुझे इस कक्षा में एक सार्वजनिक विधि पार्स() मिला जो टेक्स्ट के रूप में टेक्स्ट लेता है और कक्षा के सभी सदस्यों को पॉप्युलेट करता है, इसलिए अभ्यास करने के लिए मैंने मैडपर में TextInputFormat से टेक्स्ट की एक पंक्ति को रूपांतरित करने के लिए वर्डकाउंट एप्लिकेशन को संशोधित किया वर्ग द्वारा उत्पन्न कक्षा के एक instnace में। लेकिन जब मैं पार्स() विधि को कॉल करता हूं तो "एक अपरिवर्तित अपवाद.com .cloudera.sqoop.lib.RecordParser.ParseError; पकड़ा जाना चाहिए या फेंक दिया जाना चाहिए"।

क्या यह इस तरह से किया जा सकता है या प्रत्येक रिकॉर्ड से डेटा के साथ वर्ग को पॉप्युलेट करने के लिए आवश्यक कस्टम इनपुटफॉर्मैट है?

उत्तर

4

ठीक है यह पता लगने के बाद यह स्पष्ट लगता है लेकिन एक जावा शुरुआत के रूप में इसमें समय लग सकता है।

पहले अपनी प्रोजेक्ट को कॉन्फ़िगर करें: बस अपने स्रोत फ़ोल्डर में sqoop जेनरेट की गई .java फ़ाइल जोड़ें। मैं अपने वर्ग स्रोत फ़ोल्डर में आयात करने के लिए ग्रहण का उपयोग करता हूं।

तो बस सुनिश्चित करें कि आप के लिए कॉन्फ़िगर अपने प्रोजेक्ट की जावा का निर्माण पथ सही ढंग से:

परियोजना के गुणों में निम्नलिखित जार फ़ाइलें जोड़ें/जावा का निर्माण पथ/पुस्तकालयों/जोड़ने बाहरी जार: (के लिए Hadoop cdh4 +):

/usr/lib/hadoop/hadoop-common.jar 
/usr/lib/hadoop-[version]-mapreduce/hadoop-core.jar 
/usr/lib/sqoop/sqoop-[sqoop-version]-cdh[cdh-version].jar 

फिर अपने mapreduce स्रोत कोड अनुकूलन: पहले कॉन्फ़िगर यह:

public int run(String [] args) throws exception 
{ 
Job job = new Job(getConf()); 
job.setJarByClass(YourClass.class); 
job.setMapperClass(SqoopImportMap.class); 
job.setReducerClass(SqoopImprtReduce.class); 

FileInputFormat.addInputPath((job,"hdfs_path_to_your_sqoop_imported_file")); 
FileOutputFormat.setOutputPath((job,"hdfs_output_path")); 

// I simply use text as output for the mapper but it can be any class you designed 
// as long as you implement it as a Writable 
job.setMapOutputKeyClass(Text.Class); 
job.setMapOutputValueClass(Text.Class); 

job.setOutputKeyClass(Text.Class); 
job.setOutputValueClass(Text.Class); 
... 

नहीं अपने मैपर वर्ग को विन्यस्त करें। के अपने sqoop आयातित जावा फ़ाइल मान लेते हैं Sqimp.java कहा जाता है: और मेज आप आयातित निम्नलिखित कॉलम था: आईडी, नाम, उम्र अपने नक्शाकार वर्ग इस तरह दिखना चाहिए:

public static class SqoopImportMap 
extends Mapper<LongWritable, Text, Text, Text> 
{ 

public void map(LongWritable k, Text v, Context context) 
{ 
    Sqimp s = new Sqimp(); 
    try 
    { 
    // this is where the code generated by sqoop is used. 
    // it automatically casts one line of the imported data into an instance of the generated class, 
    // to let you access the data inside the columns easily 
    s.parse(v); 
    } 
    catch(ParseError pe) {// do something if there is an error.} 

    try 
    { 
    // now the imported data is accessible: 
    // e.g 
    if (s.age>30) 
    { 
    // submit the selected data to the mapper's output as a key value pair. 
    context.write(new Text(s.age),new Text(s.id)); 
    } 
    } 
    catch(Exception ex) 
    {//do something about the error} 
} 
} 
संबंधित मुद्दे