您的位置:首页 > 编程语言 > Java开发

Avro通过schema自动生成java代码

2014-11-20 16:18 302 查看
今天早上一来,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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐