Avro 是什么
Avro 是面向行记录的二进制序列化格式:数据本身紧凑,结构由 schema 描述,读取时按字段名解析而不是按位置。Avro 容器文件(.avro)会把写入方的 schema 存在文件头里,所以单个文件自解释;而在 Kafka 这类消息场景中通常不内嵌 schema,而是通过 Schema Registry 用 schema ID 引用,消费方据此取回 schema 再反序列化。这种「写入时带 schema、读取时按名字解析」的设计,正是它被广泛用于消息管道的原因。
基本信息
| 格式特点 | 行式、二进制、schema 内嵌或按 ID 引用、支持演进 |
|---|---|
| 读取前提 | 拿到 writer schema 才能正确反序列化 |
| 常见场景 | Kafka 消息序列化 + Schema Registry 管理 |
| 解析规则 | 按字段名称匹配,缺失字段取默认值 |
| 不兼容变更 | 类型变更、字段重命名(除非用别名) |
| 逻辑类型 | timestamp-millis、decimal 等由 schema 声明 |
Avro schema 示例
Avro schema 示例
{
"type": "record",
"name": "Order",
"namespace": "com.example.orders",
"fields": [
{"name": "order_id", "type": "string"},
{"name": "amount", "type": "double"},
{"name": "ts", "type": "long", "logicalType": "timestamp-millis"}
]
}典型使用场景
- Kafka 消息体:体积比 JSON 小、又保留字段名,适合高频写入
- 数据落湖:与 Parquet 相比更适合流式逐条追加
- 跨语言交换:Java、Python、Go 等语言都有成熟的读写库
- schema 治理:配合注册中心对不兼容变更做拦截
- 历史归档:连 schema 一起保存,未来任何时间都能解析
- 与列存配合:热数据用 Avro 承载写入,冷数据转成列存供分析
与其他格式对比
| 格式 | 存储布局 | 字段定位 | 典型用途 |
|---|---|---|---|
| Avro | 行式 | 字段名 | Kafka 消息、流式写入 |
| Parquet | 列式 | 字段名 | 分析查询、批量落地 |
| JSON | 文本 | 字段名 | 接口调试、低频交换 |
| CSV | 文本 | 位置(无表头时) | 人工导出、简单交换 |
字段按名称匹配而非顺序,新增带默认值的字段通常可向后兼容;类型变更(如 string 改 int)属于不兼容变更。
Kafka 中的 Avro 消息一般不内嵌完整 schema,而是带一个 schema ID,消费方必须能访问注册中心才能解析;注册中心不可用会直接影响消费,需要作为依赖项纳入可用性设计。