`

Thrift、protocolbuffer、avro这几种序列化之间的比较

阅读更多

一.概述

        thrift和avro都提供rpc服务和序列化,而protocol buffer只是提供序列化功能。

        thrift是一个跨语言的轻量级RPC消息和数据交换框架,Thrift能生成的语言有: C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, and OCaml。

        Avro是强调一种高效的序列化,标准性的云计算的数据交换和存储的Protocol,Avro的创新之处在于融合了显式,declarative的Schema和高效二进制的数据表达,强调数据的自我描述,克服了以往单纯XML或二进制系统的缺陷。

        Avro对Schema动态加载功能,是Thrift编程接口所不具备的,符合了Hadoop上的Hive/Pig及NOSQL 等既属于ad hoc,又追求性能的应用需求。

 

二.protobuf

        一条消息数据,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一,总体看来ProtoBuf的优势还是很明显的。

        protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,详情访问protobuf的google官方网站。

        protobuf在google中是一个比较核心的基础库,作为分布式运算涉及到大量的不同业务消息的传递,如何高效简洁的表示、操作这些业务消息在google这样的大规模应用中是至关重要的。而protobuf这样的库正好是在效率、数据大小、易用性之间取得了很好的平衡。

1.protobuf简单总结

        a.灵活(方便接口更新)、高效(效率经过google的优化,传输效率比普通的XML等高很多);

        b.易于使用;开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持java、c++、python等语言环境。通过将这些类包含在项目中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作。

        c.语言支持;原生支持c++,java,python

2.个人总结的适用protobuf的场合

        a.需要和其它系统做消息交换的,对消息大小很敏感的。那么protobuf适合了,它语言无关,消息空间相对xml和json等节省很多。

        b.小数据的场合。如果你是大数据,用它并不适合。

        c.项目语言是c++,java,python的,因为它们可以使用google的源生类库,序列化和反序列化的效率非常高。其它的语言需要第三方或者自己写,序列化和反序列化的效率不保证。

        d.总体而言,protobuf还是非常好用的,被很多开源系统用于数据通信的工具,在google也是核心的基础库。

 

三.Thrift和avro比较

1.Schema处理

        a.thrift依赖IDL-->代码的生成,静态的。走代码生成,编译载入的流程。

        b.可以生成代码,后编译执行,但是还必须依赖IDL(meta元数据描述);也可以走动态解释执行IDL

2.序列化的方式

        a.thrift提供多种序列化实现,TCompactProtocol,TBinaryProtocol,每个Field前面都是带Tag的,这个Tag用于标识这个域的类型和顺序ID(IDL中定义,用于Versioning)。在同一批数据里面,这些Tag的信息是完全相同的,当数据条数大的时候这显然就浪费了。


        b.Avro,格式包括--》文件头中有schema+数据records(自描述)


        只对感兴趣的部分反序列化

        schema允许定义数据的排序order

        采用block链表结构,突破了用单一整型表示大小的限制。比如Array或Map由一系列Block组成,每个Block包含计数器和对应的元    素,计数器为0标识结束。

3.RPC的服务

        a.Avro提供了

        HttpServer : 缺省,基于Jetty内核的服务

        NettyServer: 新的基于Netty的服务

        b.Thrift提供了:

        TThreadPolServer: 多线程服务

        TNonBlockingServer: 单线程 non blocking的服务

        THsHaServer: 多线程 non blocking的服务

 

四.总结

        Thrift适用于程序对程序静态的数据交换,要求schema预知并相对固定;

        Avro在Thrift基础上增加了对schema动态的支持且性能上不输于Thrift;

        Avro显式schema设计使它更适用于搭建数据交换及存储的通用工具和平台,特别是在后台;

        目前Thrift的优势在于更多的语言支持和相对成熟;

        PB具有跨平台、解析速度快、序列化数据体积小、扩展性高、使用简单的特点,但是内嵌并没有提供RPC的通讯。

 

PS:Protobuffer和json深度对比http://cxshun.iteye.com/blog/1974498

 

文章来源:

http://blog.csdn.net/angus_17/article/details/8493448

http://blog.csdn.net/yangbutao/article/details/8332505

  • 大小: 9.6 KB
  • 大小: 7.8 KB
分享到:
评论

相关推荐

    protobuf/thrift/avro-序列化性能测试工程

    protobuf(Protocol Buffers)、thrift和avro是三种广泛使用的序列化框架,它们在分布式系统、网络通信以及数据存储中扮演着重要角色。这个名为"protobuf/thrift/avro-序列化性能测试工程"的项目专注于对比这三种...

    Thrift和Avro实例

    Thrift和Avro是两种广泛使用的数据序列化和远程过程调用(RPC)框架,它们在分布式系统中扮演着重要角色。在这个实例中,我们将深入理解这两种技术,并探讨它们各自的特性和应用场景。 Thrift是由Facebook开发的一...

    thrift和avro研究资料1

    Thrift和Avro是两种广泛使用的数据序列化和远程过程调用(RPC)框架,它们在分布式系统中扮演着重要角色。本文将详细介绍这两种技术及其关键特性。 首先,让我们了解Thrift。Thrift是由Facebook开发的一种跨语言的...

    java serializable 序列化与反序列化

    Java的序列化与反序列化是Java开发中的一项重要...在实际应用中,要根据具体需求来选择合适的序列化库,如Google的Protocol Buffers、Facebook的Thrift或Apache Avro等,它们提供了更高效、更灵活的序列化解决方案。

    序列化与反序列化Demo

    此外,Java还提供了其他的序列化库,如Google的Protocol Buffers、Facebook的Thrift和Apache的Avro,它们提供了更高效、跨语言的序列化解决方案。 总结一下,序列化与反序列化是编程中必不可少的技术,它们用于数据...

    Hadoop序列化机制

    Hadoop提供了两种主要的序列化框架:Writable和Protocol Buffers,以及更现代的Apache Avro、Thrift和Kryo。 1. Writable接口:这是Hadoop最初提供的序列化机制,适用于Java对象。所有可序列化的类都需要实现...

    Netty中的java序列化

    因此,Netty还提供了其他高效的序列化方案,如Google的Protocol Buffers、Facebook的Thrift或Apache Avro。这些序列化工具通常能提供更小的序列化后数据大小和更快的序列化/反序列化速度。 总结起来,Netty中的Java...

    js序列化架构师必懂的——七种序列化机制及技术选型.docx

    6. **Avro**:Avro是Apache Hadoop项目的一部分,提供JSON和Binary两种序列化格式。Binary格式在性能和空间上接近Protobuf,且具有自我描述属性,提高了数据解析速度。Avro适用于需要高效、可压缩数据交换的场景。 ...

    avro-doc-1.7.7

    Avro与Protobuf、Thrift等序列化工具相比,更强调Schema,这使得其在数据交换和数据持久化方面有优势。而与JSON相比,Avro的数据文件通常更小,读写速度更快。 7. **集成与使用** Avro可以方便地集成到各种Hadoop...

    Java序列化与反序列化<转>

    6. **替代方案**:除了Java内置的序列化机制,还有许多第三方库如Google的Protocol Buffers、Facebook的Thrift、Apache Avro等,它们提供了更高效、跨语言的序列化解决方案。 通过理解和熟练掌握Java序列化和反序列...

    消息序列化/反序列化的基准和用法

    2. **编码**:在序列化过程中,数据可能需要被编码成特定的格式,例如二进制(如protobuf,Thrift)或文本(如JSON,XML)。 3. **传输**:序列化后的数据可以通过网络发送,或者写入磁盘进行持久化存储。 4. **解码...

    Java对象序列化

    在Java工具方面,有一些库可以帮助简化序列化操作,比如Google的Protocol Buffers、Facebook的Thrift和Apache Avro等。这些工具提供了更高效、更紧凑的序列化格式,适合网络通信和大数据处理场景。 总的来说,Java...

    BaijiSerializer4J:受 Apache Avro 和 Thrift 启发的用于 Java 的 Baiji 序列化器

    BaijiSerializer4J 是一个专为 Java 平台设计的序列化库,其设计理念受到了 Apache Avro 和 Apache Thrift 的启发。这两个开源项目都是为了解决跨语言数据交换的问题,提供了高效的序列化和反序列化机制。...

    java序列化源码-share-generate-sources:Java源码生成以及序列化和反序列化技术:avro|thrift|proto

    源码生成通过指定格式的文本文件进行解析生成以及序列化和反序列化技术:avro|thrift|protobuf 一、avro技术 1.maven配置 &lt;avro&gt;1.8.2&lt;/avro&gt; &lt;groupId&gt;org.apache.avro &lt;artifactId&gt;avro-tools ${avro.version}...

    Apache Hadoop---Avro.docx

    在序列化系统的选择上,Avro 与 Google 的 Protocol Buffers 和 Facebook 的 Thrift 等系统有所不同。虽然这些系统在某些场景下表现出色,但它们各自存在一定的局限性。例如,Protocol Buffers 需要预先定义数据结构...

    快速序列化框架

    本文将对五种常见的快速序列化框架——Google Protobuf、Apache Thrift、Hessian、Avro 和 Kryo 进行详细介绍,并对其性能进行比较。 #### 二、各框架详解 ##### 1. Google Protobuf - **简介**:由Google开发并...

    HadoopCommon包分析1

    除了Hadoop内置的Writable机制,还有其他序列化框架,如Avro、Thrift和Protocol Buffer。Avro提供了一种二进制序列化方式,便于高效处理大量数据,并且对动态语言友好。Thrift是一个跨语言服务开发框架,通过Thrift ...

    序列化与反序列化的通俗解释及主要序列化的方法介绍

    序列化和反序列化是计算机科学中用于处理对象状态的关键技术。它们主要应用于数据存储、网络通信和跨进程通信等领域。简单来说,序列化就是将一个对象的状态转换为可存储或可传输的形式,通常是一个字节序列。而反...

    cpp-serializers:比较各种C ++数据序列化库(节俭,protobuf等)的基准

    `cpp-serializers`项目提供了一个基准测试,用于比较各种C++数据序列化库的性能,其中包括了如Thrift、protobuf、Cap'n Proto、MsgPack、FlatBuffers等知名库。下面将详细介绍这些库及其特点,并探讨它们在性能测试...

    protobuf开源代码

    protobuf(Protocol Buffers)是Google开发的一种数据序列化协议,它允许开发者定义数据结构,然后生成能够轻松地在各种数据流之间序列化和反序列化的代码。protobuf广泛应用于网络通信、数据存储和配置文件等方面,...

Global site tag (gtag.js) - Google Analytics