网站视频开发平台,个人可以网站备案吗,wordpress post下载,唐山网站制作软件【Avro介绍】Apache Avro是hadoop中的一个子项目#xff0c;也是一个数据序列化系统#xff0c;其数据最终以二进制格式#xff0c;采用行式存储的方式进行存储。Avro提供了#xff1a;丰富的数据结构可压缩、快速的二进制数据格式一个用来存储持久化数据的容器文件远程过程…【Avro介绍】Apache Avro是hadoop中的一个子项目也是一个数据序列化系统其数据最终以二进制格式采用行式存储的方式进行存储。Avro提供了丰富的数据结构可压缩、快速的二进制数据格式一个用来存储持久化数据的容器文件远程过程调用与动态语言的简单集成代码生成不需要读取或写入数据文件也不需要使用或实现RPC协议。代码生成是一种可选的优化只值得在静态类型语言中实现。基于以上这些优点avro在hadoop体系中被广泛使用。除此之外在hudi、iceberg中也都有用到avro作为元数据信息的存储格式。【schema】Avro依赖schema模式来实现数据结构的定义schema通过json对象来进行描述表示具体表现为一个json字符串命名一个定义的类型一个json对象其格式为{type:typeName ...attributes...}其中typeName为原始类型名称或复杂类型名称。一个json数组表示嵌入类型的联合schema中的类型由原始类型也就是基本类型null、boolean、int、long、float、double、bytes和string和复杂类型record、enum、array、map、union和fixed组成。1、原始类型原始类型包括如下几种null没有值boolean布尔类型的值int32位整形long64位整形float32位浮点double64位浮点bytes8位无符号类型stringunicode字符集序列原始类型没有指定的属性值原始类型的名称也就是定义的类型的名称因此schema中的string等价于{type:string}。2、复杂类型Avro支持6种复杂类型records、enums、arrays、maps、unions和fixed。1Recordsreocrds使用类型名称record并支持以下属性name提供记录名称的json字符串必选namespace限定名称的json字符串doc一个json字符串为用户提供该模式的说明可选aliases字符串的json数组为该记录提供备用名称fields一个json数组罗列所有字段必选每个字段又都是一个json对象并包含如下属性name字段的名称必选doc字段的描述可选type一个schema定义如上default字段的默认值order指定字段如何影响记录的排序顺序有效值为ascending默认值、descending和ignore。aliases别名一个简单示例{type: record,name: LongList,aliases: [LinkedLongs],fields, [{name: value, type: long},{name: next, type: [null, LongList]}]
}2EnumsEnum使用类型名称enum并支持以下属性name提供记录名称的json字符串必选namespace限定名称的json字符串aliases字符串的json数组为该记录提供备用名称doc一个json字符串为用户提供该模式的说明可选symbols一个json数组以json字符串的形式列出符号。在枚举中每个符号必须唯一不能重复每个符号都必须匹配正则表达式[A-Za-z_][A-Za-z0-9_]*。default该枚举的默认值。示例{type: enum,name: Suit,symbols: [SPADES, HEARTS, DIAMONDS, CLUBS]
}3 Arraysitem数组中元素的schema一个例子声明一个value为string的array{type: array,items: string,default: []
}4Mapsvaluesmap的值value的schema其key被假定为字符串一个例子声明一个value为long类型key类型为string的map{type: map,values: long,default: {}
}5Unions联合使用json数组表示例如[null, test]声明一个模式它可以是空值或字符串。需要注意的是当为union类型的字段指定默认值时默认值的类型必须与union第一个元素匹配因此对于包含null的union通常先列出null因为此类型的union的默认值通常为空。另外 union不能包含多个相同类型的schema类型为record、fixed和eum除外。6FixedFixed使用类型名称fixed并支持以下属性name提供记录名称的json字符串必选namespace限定名称的json字符串aliases字符串的json数组为该记录提供备用名称doc一个json字符串为用户提供该模式的说明可选size一个整数指定每个值的字节数必须例如16字节的数可以声明为{type: fixed,name: md5,size: 16
}【Avro的文件存储格式】1、数据编码1原始类型对于null类型不写入内容即0字节长度的内容表示对于boolean类型以1字节的0或1来表示false或true对于int、long以zigzag的方式编码写入对于float固定4字节长度先通过floatToIntBits转换为32位整数然后按小端编码写入。对于double固定8字节长度先通过doubleToLongBits转换为64位整型然后按小端编码写入。对于bytes先写入长度采用zigzag编码写入然后是对应长度的二进制数据内容对于string同样先写入长度采用zigzag编码写入然后再写入字符串对应utf8的二进制数据。2复杂类型对于enums只需要将enum的值所在的Index作为结果进行编码即可例如枚举值为[A,B,C,D]那么0就表示”A“3表示D。对于maps被编码为一系列的块。每个块由一个长整数的计数表示键值对的个数采用zigzag编码写入其后是多个键值对计数为0的块表示map的结束。每个元素按照各自的schema类型进行编码。对于arrays与map类似同样被编码为一系列的块每个块包含一个长整数的计数计数后跟具体的数组项内容最后以0计数的块表示结束。数组项中的每个元素按照各自的schema类型进行编码。对于unions先写入long类型的计数表示每个value值的位置序号从零开始然后再对值按对应schema进行编码。对于records直接按照schema中的字段顺序来进行编码。对于fixed使用schema中定义的字节数对实例进行编码。2、存储格式在一个标准的avro文件中同时存储了schema的信息以及对应的数据内容。具体格式由三部分组成魔数固定4字节长度内容为字符Obj以及版本号标识通常为1。元数据信息文件的元数据属性包括schema、数据压缩编码方式等。整个元数据属性以一个map的形式编码存储每个属性都以一个KV的形式存储属性名对应key属性值对应value并以字节数组的形式存储。最后以一个固定16字节长度的随机字符串标识元数据的结束。数据内容而数据内容则由一个或多个数据块构成。每个数据块的最前面是一个long型按照zigzag编码存储的计数表示该数据块中实际有多少条数据后面再跟一个long型的计数表示编码后的N条数据的长度随后就是按照编码进行存储的一条条数据在每个数据块的最后都有一个16字节长度的随机字符串标识块的结束。整体存储内容如下图所示3、存储格式我们通过一个实际例子来对照分析下。首先定义schema的内容具体为4个字段的表名称字符串、年龄整型、技能数组、其他map类型详细如下所示{type:record,name:person,fields: [{name: name,type: string},{name: age,type: int},{name: skill,type: {type:array,items: string}},{name: other,type: {type: map,values: string}}]
}再按照上面的schema定义两条数据person.json{name:hncscwc,age:20,skill:[hadoop,flink,spark,kafka],other:{interests:basketball}}
{name:tom,age:18, skill:[java,scala],other:{}}通过avro-tools可以生成一个avro文件java -jar avro-tools-1.7.4.jar fromjson --schema-file person.avsc person.json person.avro通过二进制的方式查看生成的avro文件内容另外对于一个已存在的文件也可以通过avro-tools工具查看schema内容、数据内容。[rootlocalhost avro]$ java -jar avro-tools-1.7.4.jar getschema ./person.avro
{type : record,name : person,fields : [ {name : name,type : string}, {name : age,type : int}, {name : skill,type : {type : array,items : string}}, {name : other,type : {type : map,values : string}} ]
}
[rootlocalhost avro]$ java -jar avro-tools-1.7.4.jar tojson ./person.avro
{name:hncscwc,age:20,skill:[hadoop,flink,spark,kafka],other:{interests:basketball}}
{name:tom,age:18,skill:[java,scala],other:{}}【小结】本文对avro的格式定义、编码方式、以及实际存储的文件格式进行了详细说明最后也以一个实际例子进行了对照说明。另外 在官网中还涉及rpc的使用、mapreduce的使用这里就没有展开说明有兴趣的可移步官网进行查阅。好了这就是本文的全部内容如果觉得本文对您有帮助请点赞转发如果觉得有不正确的地方也可以拍砖指点最后欢迎加我微信交流