首页/数据/数据工程与 ETL 速查/Avro 行式序列化格式
管道基础52 条

Avro 行式序列化格式

Avro 是面向行记录的二进制格式,schema 随数据写入(writer schema),读时按 reader schema 解析,因此在 Kafka 序列化与 schema 演进场景里被广泛采用。

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,消费方必须能访问注册中心才能解析;注册中心不可用会直接影响消费,需要作为依赖项纳入可用性设计。

易错点

  • 丢掉 writer schema 的 Avro 二进制无法反解,归档时要连 schema 一起保存
  • 把小数用 double 存储会有精度问题,金额类字段建议用 decimal 逻辑类型
  • 以为加了字段就一定兼容,缺默认值时读旧数据会直接失败
  • 同一 topic 上混用不同 schema 却没有注册中心约束,消费端只能碰运气解析
  • 把 Avro 当列存用在大范围扫描的分析场景,行式布局的读取放大很明显

数据来源与参考

  • Apache Avro 官方文档:Schema Resolution 与 Specification
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌