Avro技术应用_1. Schema and Code Generation
2015-11-29 17:10
337 查看
本文涉及的源码地址:GitHub
源码
Avro 依赖模式(Schema)来实现数据结构定义。可以把模式理解为Java的类,它定义每个实例的结构,可以包含哪些属性。可以根据类来产生任意多个实例对象。对实例序列化操作时必须需要知道它的基本结构,也就需要参考类的信息。这里,根据模式产生的Avro对象类似于类的实例对象。每次序列化/反序列化时都需要知道模式的具体结构。
所以,在Avro可用的一些场景下,如文件存储或是网络通信,都需要模式与数据同时存在。Avro数据以模式来读和写(文件或是网络),并且写入的数据都不需要加入其它标识,这样序列化时速度快且结果内容少。由于程序可以直接根据模式来处理数据,所以Avro更适合于脚本语言的发挥。
Avro的模式主要由JSON对象来表示,它可能会有一些特定的属性,用来描述某种类型(Type)的不同形式。Avro支持八种基本类型(Primitive Type)和六种混合类型(Complex Type)。基本类型可以由JSON字符串来表示。每种不同的混合类型有不同的属性(Attribute)来定义,有些属性是必须的,有些是可选的,如果需要的话,可以用JSON数组来存放多个JSON对象定义。在这几种Avro定义的类型的支持下,可以由用户来创造出丰富的数据结构来,支持用户纷繁复杂的数据。
你可以通过以下方法来使用 Avro:
代码生成
通用类
进一步了解 Avro 请参考:http://www.open-open.com/lib/view/open1369363962228.html
在这里,我们将主要探讨以下 Avro Schema 文件的用途以及如何利用 Avro 的代码生成功能:
1. Avro的Schema文件:
这里我们采用两种格式的股票数据,stockavg.avsc 用来球每个股票代码所对应价格的平均值。
stock.avsc
{
"name": "Stock"
"type": "record",
"namespace": "<span style="color:#ff0000;">hip.ch3.avro.gen</span>",
"fields": [
{"name": "symbol", "type": "string"},
{"name": "date", "type": "string"},
{"name": "open", "type": "double"},
{"name": "high", "type": "double"},
{"name": "low", "type": "double"},
{"name": "close", "type": "double"},
{"name": "volume", "type": "int"},
{"name": "adjClose", "type": "double"}
]
}
stockavg.avsc
{
"name": "StockAvg",
"type": "record",
"namespace": "<span style="color:#ff0000;">hip.ch3.avro.gen</span>",
"fields": [
{"name": "symbol", "type": "string"},
{"name": "avg", "type": "double"}
]
}
2. 利用 Avro tool JAR 包为 Schema 文件编译生成 Java Code
Avro 对schema 数据支持代码生成,同样也支持 RPC 通信(会在之后进行涉及),你可以通过 Avro的 Jar工具集来为一个 Schema 生成 JAVA代码
生成的代码将会保存在hip.ch3.avro.gen文件夹下面:
3. 利用 MapReduce 将 文本文件读写成 Avro 文件 并且 读取 avro 文件内容
AvroStockFileWrite :
File inputFile = new File("/home/cloudera/branch-0.21/hiped2/test-data/stocks.txt");
Path outputPath = new Path("/home/cloudera/branch-0.21/hiped2/test-data/stocks.avro");
如您所见,您可以指定应该使用的压缩编解码器压缩数据。
以下代码示例展示了如何 整理/编列 股票对象从输入文件中的一行。正如您可以看到的,生成的股票类是一个POJO和一帮setter(和匹配getter):
AvroStockFileRead & AvroStrockFileWrite : 用来读写 Avro 文件
Path inputFile = new Path("/home/cloudera/branch-0.21/hiped2/test-data/stocks.avro");
GitHub source: https://github.com/Hanmourang/hiped2/tree/master/src/main/java/hip/ch3/avro/AvroStockFileRead.java.
avro 文件读取结果:
AAPL,2009-01-02,85.88,91.04,85.16,90.75,26643400,90.75
AAPL,2008-01-02,199.27,200.26,192.55,194.84,38542100,194.84
AAPL,2007-01-03,86.29,86.58,81.9,83.8,44225700,83.8
AAPL,2006-01-03,72.38,74.75,72.25,74.75,28829800,74.75
AAPL,2005-01-03,64.78,65.11,62.6,63.29,24714000,31.65
AAPL,2004-01-02,21.55,21.75,21.18,21.28,5165800,10.64
AAPL,2003-01-02,14.36,14.92,14.35,14.8,6479600,7.4
AAPL,2002-01-02,22.05,23.3,21.96,23.3,18910600,11.65
AAPL,2001-01-02,14.88,15.25,14.56,14.88,16161800,7.44
AAPL,2000-01-03,104.87,112.5,101.69,111.94,19144400,27.99
CSCO,2009-01-02,16.41,17.0,16.25,16.96,40980600,16.96
CSCO,2008-01-02,27.0,27.3,26.21,26.54,64338900,26.54
CSCO,2007-01-03,27.46,27.98,27.33,27.73,64226000,27.73
CSCO,2006-01-03,17.21,17.49,17.18,17.45,55426000,17.45
CSCO,2005-01-03,19.42,19.61,19.27,19.32,56725600,19.32
CSCO,2004-01-02,24.36,24.53,24.16,24.25,29955800,24.25
CSCO,2003-01-02,13.11,13.69,13.09,13.64,61335700,13.64
CSCO,2002-01-02,18.44,19.3,18.26,19.23,55376900,19.23
CSCO,2001-01-02,38.13,38.5,32.63,33.31,17384600,33.31
CSCO,2000-01-03,109.94,110.25,103.56,108.06,53076000,54.03
GOOG,2009-01-02,308.6,321.82,305.5,321.32,3610500,321.32
GOOG,2008-01-02,692.87,697.37,677.73,685.19,4306900,685.19
GOOG,2007-01-03,466.0,476.66,461.11,467.59,7706500,467.59
GOOG,2006-01-03,422.52,435.67,418.22,435.23,13121200,435.23
GOOG,2005-01-03,197.4,203.64,195.46,202.71,15844200,202.71
MSFT,2009-01-02,19.53,20.4,19.37,20.33,50084000,19.86
MSFT,2008-01-02,35.79,35.96,35.0,35.22,63004200,33.79
MSFT,2007-01-03,29.91,30.25,29.4,29.86,76935100,28.26
MSFT,2006-01-03,26.25,27.0,26.1,26.84,79973000,25.04
MSFT,2005-01-03,26.8,26.95,26.65,26.74,65002900,24.65
MSFT,2004-01-02,27.58,27.77,27.33,27.45,44487700,22.64
MSFT,2003-01-02,52.3,53.75,51.71,53.72,67025200,21.95
MSFT,2002-01-02,66.65,67.11,65.51,67.04,48124000,27.4
MSFT,2001-01-02,44.13,45.0,42.88,43.38,82413200,17.73
MSFT,2000-01-03,117.37,118.62,112.0,116.56,53228400,47.64
YHOO,2009-01-02,12.17,12.85,12.12,12.85,9514600,12.85
YHOO,2008-01-02,23.8,24.15,23.6,23.72,25671700,23.72
YHOO,2007-01-03,25.85,26.26,25.26,25.61,26352700,25.61
YHOO,2006-01-03,39.69,41.22,38.79,40.91,24227700,40.91
YHOO,2005-01-03,38.36,38.9,37.65,38.18,25482800,38.18
YHOO,2004-01-02,45.5,45.83,45.12,45.4,16480000,22.7
YHOO,2003-01-02,16.59,17.66,16.5,17.6,19640400,8.8
YHOO,2002-01-02,18.14,18.69,17.68,18.63,21903600,9.31
YHOO,2001-01-02,30.31,30.37,27.5,28.19,21939200,14.1
YHOO,2000-01-03,442.92,477.0,429.5,475.0,38469600,118.75
4. 利用 Avro 提供的丰富 API Tool 来进行数据交互 (需要利用Schema 生成 avro 文件)
(API) Tools Name | Tool 用途 |
compile | 为给定的模式生成Java代码 |
concat | 连接没有重新压缩的 avro文件 |
fragtojson | 呈现一个二进制编码的Avro基准为JSON。 |
fromjson | 读取JSON和写一个Avro数据文件记录。 |
fromtext | 一个文本文件导入一个avro数据文件。 |
getmeta | 打印出一个Avro数据文件的元数据。 |
getschema | Avro数据文件的打印模式。 |
idl | 生成一个JSON模式从一个Avro IDL文件 |
induce | 诱导模式/协议从Java类/接口通过反射。 |
jsontofrag | 呈现json编码的二进制Avro基准面。 |
recodec | 改变一个数据文件的编解码器。 |
rpcprotocol | 输出RPC服务的协议 |
rpcreceive | 打开一个RPC服务器并监听一个消息。 |
rpcsend | 发送一个RPC消息。 |
tether | 运行一个拴在mapreduce工作。 |
tojson | 转储Avro数据文件作为JSON,每行一条记录。 |
totext | 将一个Avro数据文件转换为文本文件。 |
trevni_random | 创建一个Trevni文件充满随机模式的实例。 |
trevni_tojson | 转储Trevni文件为JSON。 |
$ java -jar $HIP_HOME/lib/avro-tools-1.7.4.jar tojson stocks.avro {"symbol":"AAPL","date":"2009-01-02","open":85.88,"high":91.04,... {"symbol":"AAPL","date":"2008-01-02","open":199.27,"high":200.26,... {"symbol":"AAPL","date":"2007-01-03","open":86.29,"high":86.58,... ...
This assumes that the file exists on the local filesystem. Similarly, you can get a JSON representation of your Avro file with the following command:
$ java -jar $HIP_HOME/lib/avro-tools-1.7.4.jar getschema stocks.avro { "type" : "record", "name" : "Stock", "namespace" : "hip.ch3.avro.gen", "fields" : [ { "name" : "symbol", "type" : "string" }, { "name" : "date", "type" : "string" }, { "name" : "open", "type" : "double" }, { "name" : "high", "type" : "double" }, { "name" : "low", "type" : "double" }, { "name" : "close", "type" : "double" }, { "name" : "volume", "type" : "int" }, { "name" : "adjClose", "type" : "double" } ] }
查看 Avro 可用的 tools:
$ java -jar $HIP_HOME/lib/avro-tools-1.7.4.jar
tojson工具的一个缺点是它不支持在HDFS读取数据。我因此捆绑一个实用程序与这本书的代码称为AvroDump可以转储Avro HDFS数据的文本表示,不久我们将使用检查Avro MapReduce的输出工作:
$ hip hip.util.AvroDump --file stocks.avro
此实用工具支持多个文件(他们需要CSV-delimited)和匹配,所以您可以使用通配符。下面的例子显示了如何倾倒产生Avro MapReduce工作的内容输出到一个名为mr-output-dir的目录:
$ hip hip.util.AvroDump --file mr-output-dir/part*
相关文章推荐
- Win7 64位 VS2013环境编译Lua5.3.1
- hdu 5583 Kingdom of Black and White
- 磨刀不误砍柴工!先想好了再开干
- 7. Spring Security缓存UserDetails
- HDU-计算机学院大学生程序设计竞赛(2015’11)1008 游乐场(贪心)
- 3、TextView的简单实用方法
- java web 插件式开发
- 010ScrollView 滚动条(基础)
- eclipse项目路径设置
- JAVA基础——java动态性之反射
- Lua封装增加Sprite接口
- PHP不使用递归的无限级分类
- 欢迎使用CSDN-markdown编辑器
- 6. Spring Security AuthenticationProvider
- ARIMA(待续。。。)
- 排除两大干扰因素,开始认真学习,认真生活
- linux shell
- C++primer plus第六版课后编程练习答案9.1
- xml文件解析之pull解析
- 安装Django