在一个模式下批量处理Avro消息的好处?

时间:2016-05-25 14:48:22

标签: performance compression schema avro

我想知道将Avro消息批量处理到一个Avro消息中有多么有用(性能和大小)。它将为所有记录设置一个模式,而不是每个记录一个。 (假设模式管理是不可能的,所以每次发送消息时,我们都必须发送模式)

例如,假设我们有一个代表一个人的Avro架构'有高度','重量'和'年龄'假设我们想要在Avro消息中记录10个人。我们可以发送10条单独的Avro消息,每条消息在元数据中占用架构(占用空间),或者使用一组人员和一个架构发送1条Avro消息。

我想知道这种压缩会有多大影响 - 架构的相对大小是多少,是否值得去设计这种压缩?或者它是否最低效,在这种情况下,发送10条单独的消息会更容易?

提前致谢。 丹尼尔

1 个答案:

答案 0 :(得分:0)

TL; DR:您很可能想要批量处理您的消息,否则您最好直接将数据作为JSON发布。

例如,让我们使用类似于您建议的Person记录:

{
  "name": "Person",
  "type": "record",
  "fields": [
    {"name": "height", "type": "float"},
    {"name": "weight", "type": "float"},
    {"name": "age", "type": "int"}
  ]
}

然后,没有压缩:

  • 架构本身约为150个字节。
  • 随机记录(例如{"height": 213.47,"weight": 365.4,"age": 78})是:
      二进制编码时
    • ~10个字节。
    • 当jSON编码时,
    • ~50个字节。

所以,粗略地说,如果你一次批量记录5+,那么它只值得使用二进制编码(需要包括模式)。压缩也可能有利于JSON编码,因此您希望批量更多。

当然,所有这些都取决于您的特定架构和值。例如,如果您的值包含大型数组或字符串,则在每条消息中包含架构的相对成本将会更小。