Avro架构进化如何运作?

时间:2016-08-25 01:45:38

标签: hadoop avro

我是Hadoop和编程新手,我对Avro架构演变有点困惑。到目前为止,我将解释我对Avro的理解。

Avro是一个序列化工具,它将json模式存储在顶部,存储二进制数据。架构看起来像这样。

{
    "namespace":"com.trese.db.model",
    "type":"record",
    "doc":"This Schema describes about Product",
    "name":"Product",
    "fields":[
        {"name":"product_id","type": "long"},
       {"name":"product_name","type": "string","doc":"This is the name of the product"},
      {"name":"cost","type": "float", "aliases":["price"]},
      {"name":"discount","type": "float", "default":5}
    ]
}

现在我的问题是为什么我们需要 evolution ?我已经读过,我们可以在架构中使用default来获取新字段;但是如果我们在文件中添加新模式,那么早期的模式将被覆盖。我们不能为单个文件提供两个模式。

另一个问题是,什么是读者和作者模式以及它们如何帮助?

1 个答案:

答案 0 :(得分:23)

如果您有一个avro文件并且想要更改其架构,则可以使用新架构重写该文件。但是,如果您有数TB的avro文件并且想要更改其架构,该怎么办?每次架构更改时,您是否会重写所有数据?

Schema evolution允许您更新用于编写新数据的模式,同时保持与旧数据模式的向后兼容性。然后你可以一起阅读它,好像所有数据都有一个模式。当然,有精确的规则来管理允许的更改,以保持兼容性。这些规则列在Schema Resolution下。

除了进化之外,还有读写器模式的其他用例。您可以使用阅读器作为过滤器。想象一下数百个领域的数据,其中你只对少数领域感兴趣。您可以为少数几个字段创建架构,以便只读取您需要的数据。您可以采用另一种方式创建一个添加默认数据的reader模式,或使用模式连接两个不同数据集的模式。

或者你可以使用一个永不改变的架构来进行读写。这是最简单的情况。