Hi Johannes,

Thanks for you remind. It's solved after adding mapper key/value schema 
settings.

New mapreduce API is more convenient than mapred's. I love this way.


Best Regards,

Jamin


在 2013-10-6,上午5:30,Johannes Schulte <[email protected]> 写道:

> Hi,
> 
> you should try using the static methods of AvroJob  to configure your map 
> output key and value schemas. This takes care of configuring the right 
> KeyComparators for you. SO instead of writing
> 
> job.setMapOutputKeyClass(AvroKey.class);
>         job.setMapOutputValueClass(AvroValue.class);
> 
> write
> 
> AvroJob.setMapOutputKEySchema(Schema.create(Type.String));
> AvroJob.setMapOutputValueSchema(NetflowRecord.getClassSchema())
> 
> and same for output values
> 
> AvroJob.setOutputKeySchema.
> 
> 
> Cheers,
> Johannes
> 
> 
> 
> On Wed, Oct 2, 2013 at 3:28 PM, Xiaming Chen <[email protected]> wrote:
> Hi there,
> 
> Can u give me some examples or explaination about programming with 
> pure org.apache.avro.mapreduce interfaces??
> 
> -------- Save your time, continue if you know how --------
> 
> All of my programs are writing with hadoop's new MR1 interfaces 
> (org.apache.hadoop.mapreduce), so I want to use new 
> org.apache.avro.mapreduce of avro too. But it doesn't work for me.
> 
> The program takes input of avro data and output the same.
> The main idea behind my program is subclassing hadoop's Mapper 
> and Reducer against avro wrapped key/value.
> 
> Here is a block of my job driver :
> 
>         AvroJob.setInputKeySchema(job, NetflowRecord.getClassSchema());
>         AvroJob.setOutputKeySchema(job, NetflowRecord.getClassSchema());
> 
>         job.setMapperClass(MyAvroMap.class);
>         job.setReducerClass(MyAvroReduce.class);
>         
>         job.setInputFormatClass(AvroKeyInputFormat.class);
>         job.setOutputFormatClass(AvroKeyOutputFormat.class);
> 
>         job.setMapOutputKeyClass(AvroKey.class);
>         job.setMapOutputValueClass(AvroValue.class);
>         
>         job.setOutputKeyClass(AvroKey.class);
>         job.setOutputValueClass(NullWritable.class);
> 
> The definitions of MyAvroMap and MyAvroReduce subclasses respectivly are
> 
>     public static class MyAvroMap extends Mapper<AvroKey<NetflowRecord>, 
> NullWritable,
>                       AvroKey<CharSequence>, AvroValue<NetflowRecord>>{ ... }
> 
>     public static class MyAvroReduce extends Reducer<AvroKey<CharSequence>, 
> AvroValue<NetflowRecord>, 
>                       AvroKey<NetflowRecord>, NullWritable>{ ... }
> 
> The methioned NetflowRecord is my avro record class. And I got running 
> exception
> 
>     java.lang.ClassCastException: class org.apache.avro.hadoop.io.AvroKey
> 
> By reading hadoop's and avro's source code,
> I found that the exception was thrown by JobConf to make sure
> the map key is a subclass of WritableComparable, like this (hadoop1.2.1, 
> line759)
> 
>     
> WritableComparator.get(getMapOutputKeyClass().asSubclass(WritableComparable.class));
> 
> But the avro shows that AvroKey and AvroValue are just a simple wrapper 
> **without** subclassing Writable* interfaces of hadoop.
> I believe that, even without testing, I can get through that using old mapred 
> interfaces, 
> but its not what I want.
> 
> 
> Sincerely,
> 
> Jamin
> 
> 
> 

Reply via email to