Apache Avro & Avro Schema简介
为什么需要schema registry?
首先我们知道:
- Kafka将字节作为输入并发布
- 没有数据验证
但是:
- 如果Producer发送了bad data怎么办?
- 如果字段被重命名怎么办?
- 如果数据类型改变了怎么办?
这些情况都会导致consumer break
所以:
- 我们需要数据能够自我描述
- 我们需要能够在不破坏下游消费者的情况下演化数据
- 能够拒绝坏数据
为什么不在kafka broker收到消息时验证消息,而是使用schema registry?
由下面两幅图可以看到,schema registry是独立于kafka的一个组件。
Kafka Core:
Confluent Components -Schema Registry:
为什么schema registry不集成在kafka broker,因为这样会打破kafka一些优秀的特性:
- Kafka不解析或读取你的数据(没有使用CPU)
- Kafka将字节作为输入,而不需要事件将它们加载到内存中(称为零拷贝) 。什么是零拷贝,移步至https://www.cnblogs.com/fangjb/p/13271886.html
- 就Kafka而言,它甚至不知道你的数据是否是整数或是字符串。
所以:
- Schema Registry需要是独立的组件
- 生产者和消费者需要能够与之对话
- 必须商定通用的数据格式
- 它需要支持schema
- 它需要支持进化
- 它需要是轻量级的
Solution:
Confluent Schema Registry
Apache Avro as the data format
Apache Avro& Avro Schema介绍
- Apache Avro是一个数据序列化系统。
- 可以将Avro看作是JSON附带一个schema
- Avro schema使用Json来定义
- Avro依赖于schema
Avro优点:
1.丰富的数据结构
2.使用快速的压缩二进制数据格式
3.schema随数据一起出现
4.schema可以以安全的方式随时间进化(schema evolution)
5. Document嵌入到schema中
Avro缺点:
1.某些语言对Avro的支持可能缺乏
2.不使用avro工具就不能“打印”数据(因为压缩了和序列化)
数据类型
Schema 定义了基本数据类型和复杂数据类型,其中复杂数据类型包含不同属性。通过各种数据类型用户可以自定义丰富的数据结构
基本类型:
类型 |
含义 |
null |
没有值 |
boolean |
布尔值 |
int |
32位有符号整数 |
long |
64位有符号整数 |
float |
单精度(32位)的IEEE 754浮点数 |
double |
双精度(64位)的IEEE 754浮点数 |
bytes |
8位无符号字节序列 |
string |
字符串 |
复杂类型
Avro提供了6种复杂类型。分别是Record,Enum,Array,Map,Union和Fixed。
Record类型:
Record类型使用的类型名字是 “record”,还支持其它属性的设置:
- name(必填):record类型的名字
- namespace:命名空间(可选),相当于java中的包名
- doc:这个类型的文档说明(可选)
- aliases:record类型的别名,是个字符串数组(可选)
- fields(必填):record类型中的字段,是个对象数组。每个字段需要以下属性:
- name(必填):字段名字
- doc:字段说明文档(可选)
- type(必填):一个schema的json对象或者一个类型名字
- default:默认值(可选)
- order:排序(可选),只有3个值ascending(默认),descending或ignore
- aliases:别名,字符串数组(可选)
一个record例子:
{
"type": "record",
"namespace": "com.aaa",
"name": "Employee",
"fields": [
{ "name": "id", "type": "string"},
{ "name": "first_name", "type": "string", "default": ""},
{ "name": "last_name", "type": "string", "default":""}
]
}
Enum
枚举类型的类型名字是”enum”,还支持其它属性的设置:
- name:枚举类型的名字(必填)
- namespace:命名空间(可选)
- aliases:字符串数组,别名(可选)
- doc:说明文档(可选)
- symbols:字符串数组,所有的枚举值(必填),不允许重复数据。
一个枚举例子:
{
"type": "enum",
"name": "customer_status",
"symbols": [
"BRONZE",
"SILVER",
"GOLD"
]
}
Array
数组类型的类型名字是”array”并且只支持一个属性:
items:数组元素的schema
一个数组例子:
{
"name": "email",
"type": "array",
"items": "string"
}
Map
Map是一种定义keys和values列表的方法,其中keys是字符串.
Example: secrets questions
- “What’s your
favourite color?”: “green” - “Where were
you born?”: “Tapei” - “Who you love most?”: “My wife”
Map类型的类型名字是”map”并且只支持一个属性:
values:map值的schema
Map的key必须是字符串。
一个Map例子:
{
"name": "secrets",
"type": "map",
"values": "long"
}
Union
组合类型,表示各种类型的组合,使用数组进行组合。比如[“null”,
“string”]表示类型可以为null或者string。
组合类型的默认值是组合类型的第一个元素,因此如果一个组合类型包括null类型,那么null类型一般都会放在第一个位置,这样子的话这个组合类型的默认值就是null。
组合类型中不允许同一种类型的元素的个数不会超过1个,除了record,fixed和enum。比如组合类中有2个array类型或者2个map类型,这是不允许的。
组合类型不允许嵌套组合类型
Apache Avro & Avro Schema简介的更多相关文章
- apache基金会开源项目简介
apache基金会开源项目简介 项目名称 描述 HTTP Server 互联网上首屈一指的HTTP服务器 Abdera Apache Abdera项目的目标是建立一个功能完备,高效能的IETF ...
- cxf 报错:java.lang.NoSuchMethodError: org.apache.ws.commons.schema.XmlSchemaCollection.read(Lorg/w3c/dom/Document;Ljava/lang/String;)
由于没有仔细查看官方提供的文档,由jdk版本不一致导致的出错: http://cxf.apache.org/cxf-316-release-notes.html 自己使用的是jdk1.8. 报Exce ...
- java.lang.IllegalArgumentException: No enum constant org.apache.ws.commons.schema.XmlSchemaForm.
一次系统断电维护之后,apache cxf 的 web service 接口调用一直报错: java.lang.IllegalArgumentException: No enum constant o ...
- apache commons Java包简介
更多信息,请参考:http://commons.apache.org/ 一.Commons BeanUtils说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanU ...
- XML Schema 简介
XML Schema 是基于 XML 的 DTD 替代者. XML Schema 可描述 XML 文档的结构. XML Schema 语言也可作为 XSD(XML Schema Definition) ...
- Json Schema简介
1. 引言 什么是Json Schema? 以一个例子来说明 假设有一个web api,接受一个json请求,返回某个用户在某个城市关系最近的若干个好友.一个请求的例子如下: { "city ...
- [转帖] 学习一下 apache bench 的总结简介 ( LAMP的没用过..)
PS:网站性能压力测试是性能调优过程中必不可少的一环.只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题.Apache中有个自带的,名为ab的程序,可以对Apache或其它类型的服务器进行网 ...
- 转载:Apache commons开源工具简介
Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...
- DTD 和 Schema简介
什么是DTD? DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块. 它使用一系列的合法元素来定义文档结构. DTD例子 <?xml version="1.0"? ...
随机推荐
- 用python做时间序列预测九:ARIMA模型简介
本篇介绍时间序列预测常用的ARIMA模型,通过了解本篇内容,将可以使用ARIMA预测一个时间序列. 什么是ARIMA? ARIMA是'Auto Regressive Integrated Moving ...
- 【JMeter_04】JMeter 插件管理、语言设置
语言设置 JMeter是外来午中,初始默认语言为英文,如果有朋友更倾向于使用中文或者其他语言,那么可以通过以下两种方法来切换,随着JMeter版本的不断升级,会发现程序的汉化支持已经越来越完善了. 1 ...
- Windows 程序设计(4) MFC-02 基本控件-上
1. Button 按钮控件 1.1.按钮控件的基本使用 新建对话框工程,拖拽按钮控件,添加点击事件响应函数! a.双击模版进行添加: b.事件方式进行添加: button的常见事件类型 void C ...
- ConcurrentHashMap源码解析-Java7
目录 一.ConcurrentHashMap的模型图 二.源码分析-类定义 2.1 极简ConcurrentHashMap定义 2.2 Segment内部类 2.3 HashEntry内部类 2.4 ...
- 团队进行Alpha冲刺--冲刺总结
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺--冲刺总结 作业正文 如下 其他参 ...
- 阿里面试官最喜欢问的21个HashMap面试题
1.HashMap 的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点.当链表长度超过 8 时,链表转换为红黑树. transient Node<K,V>\[\ ...
- SpringMVC 学习笔记(四)
41. 尚硅谷_佟刚_SpringMVC_返回JSON.avi SpringMVC中使用@ResponseBody注解标注业务方法,将业务方法的返回值做成json输出给页面 导包: 除了一些sprin ...
- Python表达式与生成式
Python表达式与生成式 前言 本章节中的所有知识点均为在不丧失代码可读性的前提下最大程度精简代码的一系列操作.其中涉及到一些性能问题(微乎其微)可以不做考虑. 三元表达式 三元表达式中有三个重要的 ...
- pikachu靶场-暴力破解(验证码、token)
甲.基于表单的破解 较为简单,直接BurpSuite爆破. 乙.验证码绕过(on server) 打开题目,比第一题多了一个验证码验证,很多初学者遇到验证码就会感觉不知所措.其实这题也较为简单,首先正 ...
- P1131 [ZJOI2007]时态同步【树形dp】
时态同步 从叶子到根节点统计修改次数.树形\(dp\)思想. 题目描述 小\(Q\)在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字\(1,2,3-\). ...