2012-07-19 15 views
5

Bir sqoop sorgusu, her satırın sütun verilerine veriyle eşlemek için kod içeren bir sınıf içeren bir java dosyası oluşturur. (Sqoop içe aktarma, --as-sequencefile seçeneği olmaksızın metinde gerçekleştirildi ve sütun başına 1 satır ve kayıtlar arasında virgül) Ancak bunu gerçekten nasıl kullanıyoruz?MapReduce'da sqoop oluşturulan sınıf nasıl kullanılır?

Bu sınıfta bir giriş olarak Metin alan ve sınıfın tüm üyelerini dolduran bir ortak yöntem parse() buldum, bu yüzden mapdate'de TextInputFormat öğesinden bir metin satırını dönüştürmek için wordcount uygulamasını değiştirdim. sqoop tarafından üretilen sınıfın bir instnace içine. Ancak bu, parse() yöntemini çağırdığımda "bildirilmemiş exception.com.cloudera.sqoop.lib.RecordParser.ParseError; yakalanmalı veya atılmak üzere bildirilmelidir" neden olur.

Bu şekilde yapılabilir mi yoksa sınıfa her bir kayıttaki verilerle doldurmak için özel bir InputFormat gerekli midir?

cevap

4

Bunu anladıktan sonra, bu bir java acemi olarak görülebilir.

İlk önce projenizi yapılandırın: kaynak klasörünüzde sqoop üretilmiş .java dosyasını ekleyin. Sınıf kaynak klasörüme aktarmak için eclipse kullanıyorum.

Sonra sadece emin olun yapılandırılmış doğru projenizin java inşa yolu:

projenin özelliklerinde şu kavanoz dosyaları ekleyin/java build yolu/libraries/eklemek dış kavanoz: (Hadoop cdh4 + için):

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

Ardından mapreduce kaynak kodunu adapte: İlk yapılandırmak o:

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); 
... 

yok mapper sınıfınızı yapılandırın. senin sqoop ithal java dosyasını varsayalım Sqimp.java denir: ve ithal tablo aşağıdaki sütunları vardı: id, isim, yaş senin mapper sınıfı aşağıdaki gibi görünmelidir:

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} 
} 
} 
İlgili konular