您的位置:首页 > 其它

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。
Avro 自带了许多 tools来方便的检查 Avro 文件的内容。你可以通过以下命令来将一个 Avro 文件转换成 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*


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: