Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在avro中存储模式的优势是什么?_Java_Apache_Hadoop_Solr_Avro - Fatal编程技术网

Java 在avro中存储模式的优势是什么?

Java 在avro中存储模式的优势是什么?,java,apache,hadoop,solr,avro,Java,Apache,Hadoop,Solr,Avro,我们需要序列化一些数据,以便放入solr和hadoop中 我正在评估同样的序列化工具 我名单上的前两名是格森和阿夫罗 据我所知,JSON中的Avro=Gson+Schema 如果这是正确的,我不明白为什么Avro在Solr/Hadoop中如此流行 我在网上搜索了很多,但是找不到一个正确的答案 无论它说什么,Avro都是好的,因为它存储模式。我的问题是如何处理该模式 对于Hadoop中的非常大的对象来说,它可能很好,其中单个对象存储在多个文件块中,这样存储每个部分的模式有助于更好地分析它。 但即使

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

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

我名单上的前两名是格森和阿夫罗

据我所知,JSON中的Avro=Gson+Schema

如果这是正确的,我不明白为什么Avro在Solr/Hadoop中如此流行

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

无论它说什么,Avro都是好的,因为它存储模式。我的问题是如何处理该模式

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

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

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

我真的很困惑

  • 演化模式
  • 假设您最初为Employee类设计了这样的模式

    {
    {"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/微服务原则之一,即功能