avroの使用詳細

7107 ワード

一、avroの紹介
1、要約
avroはデータの順序付けシステムであり、提供されている.
  • 豊富なデータ構造
  • 高速圧縮可能なバイナリデータ形式
  • 耐久データを格納するファイルコンテナ
  • リモートプロセスは、RPC
  • を呼び出します.
  • 簡単な動的言語結合機能
  • 2、タイプ
    二、avroのhadoopでの使用
    1、モード確定
      :{"namespace": "example.avro",
            "type": "record",
            "name": "User",
            "fields": [
            {"name": "name", "type": "string"},
            {"name": "favorite_number",  "type": ["int", "null"]},
            {"name": "favorite_color", "type": ["string", "null"]}
            ]
        }
    
    その中のnamespaceはパッケージ名で、nameはクラス名です.
    2、textデータを入力とします.
    2.1プラグインの順序なし
    //      
    Schema schema = new Schema.Parser().parse(new File("user.avsc"));
    GenericRecord user1 = new GenericData.Record(schema);
    user1.put("name", "Alyssa");
    user1.put("favorite_number", 256);
    // Leave favorite color null
    
    GenericRecord user2 = new GenericData.Record(schema);
    user2.put("name", "Ben");
    user2.put("favorite_number", 7);
    user2.put("favorite_color", "red");
    
    //   
    // Serialize user1, user2 and user3 to disk
    DatumWriter userDatumWriter = new SpecificDatumWriter(User.class);
    DataFileWriter dataFileWriter = new DataFileWriter(userDatumWriter);
    dataFileWriter.create(user1.getSchema(), new File("users.avro"));
    dataFileWriter.append(user1);
    dataFileWriter.append(user2);
    dataFileWriter.append(user3);
    dataFileWriter.close();
    
    //    
    // Deserialize Users from disk
    DatumReader userDatumReader = new SpecificDatumReader(User.class);
    DataFileReader dataFileReader = new DataFileReader(file, userDatumReader);
    User user = null;
    while (dataFileReader.hasNext()) {
        // Reuse user object by passing it to next(). This  saves us from
        // allocating and garbage collecting many objects for   files with
        // many items.
        user = dataFileReader.next(user);
        System.out.println(user);
    }
    
    2.2プラグインの順序付けがあります.
    2.2.1プラグインの導入
    
      org.apache.avro
      avro-maven-plugin
      1.8.2
      
        
          generate-sources
          
            schema
          
          
            ${project.basedir}/../
            ${project.basedir}/target/generated-sources/
          
        
      
    
    
    2.2.2 schemaファイルをコンパイルする
    注意schemaファイルは指定されたファイルの中に置いて、ideaでこのファイルをコンパイルして、ディレクトリの中でクラスファイルを生成させます.
    2.2.3一般使用
    DatumWriter userDatumWriter = new SpecificDatumWriter(User.class);
    DataFileWriter dataFileWriter = new DataFileWriter(userDatumWriter);
    dataFileWriter.create(user1.getSchema(), new File("users.avro"));
    dataFileWriter.append(user1);
    dataFileWriter.append(user2);
    dataFileWriter.append(user3);
    dataFileWriter.close();
    
    //   
    // Deserialize Users from disk
    DatumReader userDatumReader = new SpecificDatumReader(User.class);
    DataFileReader dataFileReader = new DataFileReader(file, userDatumReader);
    User user = null;
    while (dataFileReader.hasNext()) {
        // Reuse user object by passing it to next(). This saves us from
        // allocating and garbage collecting many objects for files with
        // many items.
        user = dataFileReader.next(user);
        System.out.println(user);
    }
    
    3、例(プラグインがある方式を使う)
    MapReduceColorCount:
    
    package example;
    
    import java.io.IOException;
    
    import org.apache.avro.Schema;
    import org.apache.avro.mapred.AvroKey;
    import org.apache.avro.mapred.AvroValue;
    import org.apache.avro.mapreduce.AvroJob;
    import org.apache.avro.mapreduce.AvroKeyInputFormat;
    import org.apache.avro.mapreduce.AvroKeyValueOutputFormat;
    import org.apache.hadoop.conf.Configured;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.NullWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.Mapper;
    import org.apache.hadoop.mapreduce.Reducer;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    import org.apache.hadoop.util.Tool;
    import org.apache.hadoop.util.ToolRunner;
    
    import example.avro.User;
    
    public class MapReduceColorCount extends Configured implements Tool {
    
      public static class ColorCountMapper extends
      Mapper, NullWritable, Text, IntWritable> {
    
        @Override
        public void map(AvroKey key, NullWritable value, Context context)
            throws IOException, InterruptedException {
    
          CharSequence color = key.datum().getFavoriteColor();
          if (color == null) {
            color = "none";
          }
          context.write(new Text(color.toString()), new IntWritable(1));
          }
        }
    
        public static class ColorCountReducer extends
      Reducer, AvroValue> {
    
        @Override
        public void reduce(Text key, Iterable values,
            Context context) throws IOException, InterruptedException {
    
          int sum = 0;
          for (IntWritable value : values) {
            sum += value.get();
          }
          context.write(new AvroKey(key.toString()), new AvroValue(sum));
        }
        }
    
      public int run(String[] args) throws Exception {
        if (args.length != 2) {
          System.err.println("Usage: MapReduceColorCount  ");
          return -1;
        }
    
        Job job = new Job(getConf());
        job.setJarByClass(MapReduceColorCount.class);
        job.setJobName("Color Count");
    
        FileInputFormat.setInputPaths(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
    
        job.setInputFormatClass(AvroKeyInputFormat.class);
        job.setMapperClass(ColorCountMapper.class);
        AvroJob.setInputKeySchema(job, User.getClassSchema());
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
    
        job.setOutputFormatClass(AvroKeyValueOutputFormat.class);
        job.setReducerClass(ColorCountReducer.class);
        AvroJob.setOutputKeySchema(job, Schema.create(Schema.Type.STRING));
        AvroJob.setOutputValueSchema(job, Schema.create(Schema.Type.INT));
    
        return (job.waitForCompletion(true) ? 0 : 1);
      }
    
      public static void main(String[] args) throws Exception {
        int res = ToolRunner.run(new MapReduceColorCount(), args);
        System.exit(res);
      }
    }
    
    注意:プラグインを使わない方式を採用した場合、mapのコードは@Override public void map(AvroKey key、Null Writable value、Contect context)throws IOException、InterrupteException{}コードはAvroKeyのschemaを知らないので、maをmaで指定します.