在 avro 中存储模式有啥好处?

Posted

技术标签:

【中文标题】在 avro 中存储模式有啥好处?【英文标题】:What is the advantage of storing schema in avro?在 avro 中存储模式有什么好处? 【发布时间】:2013-12-31 14:54:20 【问题描述】:

我们需要序列化一些数据以放入 solr 和 hadoop。

我正在评估相同的序列化工具。

我列表中的前两个是 Gson 和 Avro。

据我了解,Avro = Gson + Schema-In-JSON

如果这是正确的,我不明白为什么 Avro 在 Solr/Hadoop 中如此受欢迎?

我在互联网上搜索了很多,但找不到一个正确的答案。

到处都说,Avro 很好,因为它存储模式。我的问题是如何处理该架构?

这可能适用于 Hadoop 中非常大的对象,其中单个对象存储在多个文件块中,这样存储每个部分的模式有助于更好地分析它。 但即使在这种情况下,模式也可以单独存储,仅对它的引用就足以描述模式。我看不出为什么架构应该成为每个部分的一部分。

如果有人能给我一些很好的用例,Avro 如何帮助他们,而 Gson/Jackson 不足以达到目的,那将非常有帮助。

此外,Avro 网站上的官方文档说我们需要为 Avro 提供一个模式,以帮助它生成 Schema+Data。 我的问题是,如果输入模式并且将模式与数据的 JSON 表示一起发送到输出,那么 Avro 还能实现什么额外功能?我不能自己通过使用 JSON 序列化对象、添加我的输入模式并将其称为 Avro 来做到这一点吗?

我真的很困惑!

【问题讨论】:

【参考方案1】:
    不断发展的架构

假设您最初为 Employee 类设计了这样的架构


"name": "emp_name", "type":"string",
"name":"dob", "type":"string",
"name":"age", "type":"int"

后来您意识到年龄是多余的,并将其从架构中删除。


"name": "emp_name", "type":"string",
"name":"dob", "type":"string"

在此架构更改之前已序列化和存储的记录会怎样。你将如何读回这些记录?

这就是 avro 阅读器/反序列化器要求阅读器和编写器模式的原因。它在内部进行架构解析,即。它试图使旧模式适应新模式。

转到此链接 - http://avro.apache.org/docs/1.7.2/api/java/org/apache/avro/io/parsing/doc-files/parsing.html - “使用动作符号解决”部分

在这种情况下,它会跳过动作,即忽略“年龄”。它还可以处理字段从 int 变为 long 等情况。

这是一篇很好的文章,解释了模式演变 - http://martin.kleppmann.com/2012/12/05/schema-evolution-in-avro-protocol-buffers-thrift.html

    对于单个文件中的多条记录,架构只存储一次。

    大小,以极少字节编码。

【讨论】:

我不明白这有什么帮助。如果模式发生变化,对象语义是否也可能发生变化?自动化系统如何可靠地确定如何解释语义冲突字段等内容? 另外应该注意的是,跳过过时的字段是其他 IDL 的标准做法(至少是我熟悉的 protobuf)。 这是很好的信息“架构在一个文件中只存储一次,用于多个记录。”,但找不到此信息的参考,请分享。【参考方案2】:

我认为模式演变解决的关键问题之一在任何地方都没有明确提及,这就是为什么它会给新手带来如此多的困惑。

一个例子将阐明这一点:

假设一家银行存储其所有交易的审计日志。日志具有特定的格式,需要至少保存 10 年。保存这些日志的系统也非常希望能够适应这 10 年来不断发展的格式。

此类条目的架构不会经常更改,假设平均每年两次,但每个架构都会有大量条目。如果我们不跟踪模式,那么一段时间后,我们将需要查阅非常古老的代码来找出当时存在的字段,并继续添加 if-else 语句来处理不同的格式。使用所有这些格式的模式存储,我们可以使用模式演变功能自动将一种格式转换为另一种格式(如果您提供旧模式和新模式,Avro 会自动执行此操作)。这使应用程序免于在其代码中添加大量 if-else 语句,并使其更易于管理,因为我们通过查看存储的模式集很容易知道我们拥有的所有格式(模式通常存储在单独的存储中,并且数据只有一个 ID 指向其架构)。

模式演化的另一个优点是新格式的生产者可以安全地生产具有新模式的对象,而无需等待下游消费者首先更改。下游消费者可以拥有内置的逻辑来简单地暂停处理,除非他们能够看到与新格式关联的新模式。这种自动暂停非常适合保持系统在线并根据新模式调整处理逻辑。

因此,总而言之,架构演变通过使用自动格式转换帮助新客户读取旧格式,还帮助旧客户以优雅的方式暂停处理,直到他们能够理解新格式。

【讨论】:

但是假设您有日志监控系统,您更改了应用程序/服务/组件生成的数据格式的架构......但同时您的监控系统将无法处理这些并将成为事实上的不可用。从我的角度来看,这同样适用于您的银行交易用例。好的,我有新格式进来,但没有人可以处理它...:-)) 如果 Avro 让仍然使用旧模式版本并准备迁移的消费者使用生成的新格式,这将很有用.这样就不会出现中断,但你所说的没有帮助。 我同意一个事实,消费者可以产生新的模型并与消费者的验证解耦,否则在 SOA/微服务架构中会拒绝,从而阻止消费者。所以我可以独立改变消费者/生产者。 Avro 并不是所有的求解器,而是从根本上应用了老式和主要 SOA/微服务原则之一,即功能解耦。

以上是关于在 avro 中存储模式有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

在星型模式表设计中包含关系有啥好处?

android中ViewHolder模式有啥好处?

桥接模式有啥好处[关闭]

工厂模式有啥好处? [复制]

这种开关/模式匹配的想法有啥好处吗?

闭包存储属性初始化有啥好处?