Java 在avro中存储模式的优势是什么?
我们需要序列化一些数据,以便放入solr和hadoop中 我正在评估同样的序列化工具 我名单上的前两名是格森和阿夫罗 据我所知,JSON中的Avro=Gson+Schema 如果这是正确的,我不明白为什么Avro在Solr/Hadoop中如此流行 我在网上搜索了很多,但是找不到一个正确的答案 无论它说什么,Avro都是好的,因为它存储模式。我的问题是如何处理该模式 对于Hadoop中的非常大的对象来说,它可能很好,其中单个对象存储在多个文件块中,这样存储每个部分的模式有助于更好地分析它。 但即使在这种情况下,模式也可以单独存储,仅对该模式的引用就足以描述模式。我看不出为什么模式应该成为每一部分的一部分 如果有人能给我一些好的用例,说明Avro是如何帮助他们的,而Gson/Jackson不足以达到这个目的,那将非常有用 另外,Avro站点的官方文档说,我们需要为Avro提供一个模式,以帮助它生成schema+数据。 我的问题是,如果输入模式,并将其与数据的JSON表示一起发送到输出,那么Avro将实现什么额外功能?我自己不能通过使用JSON序列化对象、添加输入模式并将其命名为Avro来实现这一点吗 我真的很困惑Java 在avro中存储模式的优势是什么?,java,apache,hadoop,solr,avro,Java,Apache,Hadoop,Solr,Avro,我们需要序列化一些数据,以便放入solr和hadoop中 我正在评估同样的序列化工具 我名单上的前两名是格森和阿夫罗 据我所知,JSON中的Avro=Gson+Schema 如果这是正确的,我不明白为什么Avro在Solr/Hadoop中如此流行 我在网上搜索了很多,但是找不到一个正确的答案 无论它说什么,Avro都是好的,因为它存储模式。我的问题是如何处理该模式 对于Hadoop中的非常大的对象来说,它可能很好,其中单个对象存储在多个文件块中,这样存储每个部分的模式有助于更好地分析它。 但即使
{
{"name": "emp_name", "type":"string"},
{"name":"dob", "type":"string"},
{"name":"age", "type":"int"}
}
后来,您意识到年龄是多余的,并将其从模式中删除
{
{"name": "emp_name", "type":"string"},
{"name":"dob", "type":"string"}
}
在该架构更改之前序列化和存储的记录如何。你将如何读回那些记录
这就是为什么avro读写器/反序列化器要求读写器模式。它在内部进行模式解析,即尝试将旧模式适应新模式
转到此链接-“使用动作符号解决”部分
在这种情况下,它会跳过动作(省略“年龄”一词)。它还可以处理字段从int变为long等情况
这是一篇很好的文章,解释了模式的演变-
我认为模式演化所解决的一个关键问题在任何地方都没有明确提到,这就是为什么它会给新手带来如此多的困惑 举例说明: 假设一家银行存储了其所有交易的审计日志。日志具有特定的格式,需要存储至少10年。保存这些日志的系统应适应这10年来不断发展的格式,这也是非常可取的 这些条目的模式不会经常更改,比如说平均每年更改两次,但每个模式都会有大量条目。如果我们不跟踪模式,那么过一段时间后,我们将需要参考非常旧的代码来找出当时存在的字段,并继续添加If-else语句来处理不同的格式。使用所有这些格式的模式存储,我们可以使用模式演化功能自动将一种格式转换为另一种格式(如果您为Avro提供较旧和较新的模式,它会自动执行此操作)。这避免了应用程序在其代码中添加大量if-else语句,也使其更易于管理,因为我们通过查看存储的模式集(模式通常存储在单独的存储中,数据只有一个指向其模式的ID)就可以很容易地知道我们拥有的所有格式 模式演化的另一个优点是,新格式的生产者可以安全地使用新模式生成对象,而无需等待下游消费者首先进行更改。下游消费者可以内置逻辑来简单地暂停处理,除非他们能够看到与新格式相关联的新模式。这种自动暂停非常有助于保持系统在线,并使处理逻辑适应新模式
总之,schema evolution通过使用自动格式转换帮助较新的客户端读取较旧的格式,还帮助较旧的客户端以优雅的方式暂停处理,直到它们能够理解较新的格式。我不明白这有什么帮助。如果模式改变了,对象语义不也会改变吗?自动化系统如何可靠地确定如何解释语义冲突的字段?还应该注意,跳过过时的字段是其他IDL的标准做法(至少是protobuf,我很熟悉)。这是一个很好的信息“对于单个文件中的多条记录,模式只存储一次。”,但无法找到此信息的参考,请共享。但假设您有日志监控系统,您更改了应用程序/服务/组件生成的数据格式的架构。。。但同时,您的监控系统将无法处理这些问题,并且实际上将无法使用。从我的角度来看,这同样适用于您的银行交易用例。好的,我有了新的格式,但是没有人可以处理它…:-))如果Avro允许生成的新格式被仍然使用旧模式版本并准备迁移的消费者使用,这将非常有用。我同意一个事实,消费者可以产生新的模型,并从消费者的验证中分离出来,而在SOA/微服务体系结构中,消费者只会拒绝验证,所以停止消费者。所以我可以独立地改变消费者/生产者。Avro并不是所有的解算器,而是从根本上应用了旧时尚和主要的SOA/微服务原则之一,即功能