Avro通过schema自动生成java代码

来源:互联网 发布:js酷炫特效 编辑:程序博客网 时间:2024/05/22 02:04

今天早上一来,leader让我研究Avro和Kafka的集成。 

我:“哦”。

Avro? 什么东西呀? Kafka?还没研究过

怎么办?

先学习Avro呗,然后我就分成了下面几个阶段来完成这个任务。

Task1: 首先用java代码来实现Avro的发消息和受消息的机制,测试通过。

Task2:考虑是消息从MSMQ发出后和Avro集成,再发到Kafka;还是消息从Kafka发出后,用Avro进行处理,再发到Storm呢?

Task3:如果是MSMQ-->Avro-->Kafka-->Storm,我得用java测试kafka怎么接收解析从Avro发过来的消息。

Task4: 如果是MSMQ-->Kafka-->Avro-->Storm.我觉得这个就可以直接在Storm程序里面改一下接收消息的格式,比较简单。


不管怎么说,先把Avro搞清楚怎么回事吧。

搜了半天,资料基本没有,于是就只能从官网的英文文档下手呢。


经过一天的学习,尝试,终于有了一点点小的收获,那就是在实现了通过定义Avro的schema来自动生成java代码。然后运行成功了。

下面总结了方法:(用Avro-1.7.7  Java版本)

1. 首先要下载:avro-1.7.7.jar, avro-tools-1.7.7.jar,core-asl,mapper-asl。 放在C:\Learn_docs\HadoopSoft\Avro

下载网址:http://www.trieuvan.com/apache/avro/avro-1.7.7/java/  和http://wiki.fasterxml.com/JacksonDownload

2. 在Avro文件夹下面建一个target文件夹,我建的是java.


3. 建一个user.avsc 文件,里面定义user的schema.

{"namespace": "example.avro",
 "type": "record",
 "name": "User",
 "fields": [
     {"name": "name", "type": "string"},
     {"name": "favorite_number",  "type": ["int", "null"]},
     {"name": "favorite_color", "type": ["string", "null"]}
 ]
}

这个里面的格式等我完成这个任务后,会详细介绍Avro的东西再说。

4. cmd,进入C:\Learn_docs\HadoopSoft\Avro,执行:java -jar avro-tools-1.7.7.jar compile schema user.avsc java.


这样就在java里面生成了java代码。


5. 在 Eclipse里面建一个java工程Avro Test,把这个User.java拷贝到workspace的Src文件夹下。


6. 刷新Eclipse上Avro Test,可以看到代码可以看到了。


7.写一个Main.java,代码如下:

package example.avro;


import java.io.File;


import org.apache.avro.file.DataFileReader;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.specific.SpecificDatumWriter;


public class Main {


    public static void main(String[] args)throws Exception {


       User user1 = new User();


       user1.setName("Alyssa");


       user1.setFavoriteNumber(256);


       // Leave favorite color null 


       // Alternate constructor


       User user2 = new User("Ben", 7,"red"); 


       // Construct via builder


       User user3 = User.newBuilder()


                    .setName("Charlie")


                   .setFavoriteColor("blue")


                   .setFavoriteNumber(null)


                    .build();      


       // Serialize user1 and user2to disk


       File file = new File("users.avro");


       DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);


       DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);


       dataFileWriter.create(user1.getSchema(),new File("users.avro"));


       dataFileWriter.append(user1);


       dataFileWriter.append(user2);


       dataFileWriter.append(user3);


       dataFileWriter.close();      


       // Deserialize Usersfrom disk


       DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);


       DataFileReader<User> dataFileReader = new DataFileReader<User>(file, userDatumReader);


       User user = null;


       while (dataFileReader.hasNext()) {


       // Reuse user object bypassing it to next(). This saves us from


       // allocating and garbagecollecting many objects for files with


       // many items.


       user = dataFileReader.next(user);


       System.out.println(user);


       }                  


    }


}

8. 把这个Java工程转成Maven工程,bulid成功。 运行Main.java.


0 0