`
daoger
  • 浏览: 531522 次
  • 性别: Icon_minigender_1
  • 来自: 山东济南
社区版块
存档分类
最新评论

hbase相关的thrift 分析

阅读更多
 
转载:http://www.cnblogs.com/tekkaman/p/3279533.html

[Thrift分析]

   Thrift定义一套IDL(Interface Definition Language)用于描述接口,通常后缀名为.thrift,通过thrift程序把.thrift文件导出成各种不一样的代码的协议定义。除此之 外,Thrift自定了一套C/S交互的框架,帮助开发者免去人工解包/打包协议的工作。下面会按文件从里到外仔仔细细地分析Thrift整个框架体系。

  Thrift定义的数据没有构造函数,导致有些情况下不方便。无法定义list成员变量,有些情况下也很不方便。C++ coder的硬伤。

  

[Common]

   公共文件放置于根目录下,下面一一介绍。

  1、config.h:此文件是thrift的configure脚本检测出的你的操作系统环境头文件。此文件为configure脚本生成。是一堆宏命令,例如可能有个宏,如果有某个头文件则定义为1,否则为0,以此来提供代码中感知开发者操作系统环境的能力。

  2、Thrift.h、Thrift.cpp:此文件提供2个类,TOutput、TException。TOutput用于输出,默认输出到 stderr,提供了print,(),perror()三个函数用于输出,有一个全局变量GlobalOutput,其它地方的输出都通过此变量控制。 TException继承于std::exception,提供what方法。

  3、TProcessor.h:此文件为特定功能类,只因此类功能只有1个文件,所以放在在根目录下。此类 提供process函数接口,一个虚函数是用于开发者继承,另一个提供一个入口。构造函数为protected,所以显示不能生成此类的的实例,只能生成 此类子类的实例。Auto-Gen的processor会把调用dispatch到相应的service接口。

  4、TLogging.h:此文件提供各种log宏,大至分3类,debug、log、erro,但是与TOutput无关。

  5、TApplicationException.h/.cpp:此文件类为继承于TException。提供了type字段,type用于分类错误类型。此类提供了对protocol的write和read的支持,即提供了RPC能力。

    6、TReflectionLocal.h:暂未知,后续补充。

protocol

  1、TProtocol.h:定义到协议类TProtocol和TProtocolFactory基类,这2个类本身无作用,是个基类,提供操作协议的统一接口。

  2、TProtocolException.h:和TApplicationException类似,继承于TException。提供了TProtocolExceptionType字段,以分类protocol错误类型。

  3、TOneWayProtocol.h:内含TWriteOnlyProtocol、TReadOnlyProtocol,均继承于TProtocol。TWriteOnlyProtocl把所有的read方法都抛出异常,TReadOnlyProtocl同理。

  4、TProtocolTap.h:内含TProtocolTap类,此类实现监听功能,即若B对象需要监 听A对象,则生成TProtocolTap对象,以A、B为参数,以后要读A的时候,通过TProtocolTap对象读取,TProtocolTap会 把读取请求传递给A,拿到结果后把结果写入到B。即完成B对A的监听。

  5、TBase64Utils.h/.cpp:内含base64方法。

  6、TBinaryProtocol.h/.cpp:把数据类型的内存二进制直接写入到transport里面。

  7、TJSONProtocol.h/.cpp:把数据以JSON的形式写入到transport,例如一个字符串会加上""。

  8、TCompactProtocol.h/.cpp:把根据thrift-110,实现数据的紧缩协议。

  9、TDebugProtocol、TDenseProtocol:thrift0.5版本中这2个类正在实验中,推荐不用。

  So,开发者直接使用的高频protol内容为:TBinaryProtocol、TJSONProtocol、TProtocolTap、TBase64Utils。

transport

  1、TTransport.h:Transport基类,提供的接口大致可按如下分类:open/close、read/write、peek。transport的目的只有2个,一个是read指定长度数据,一个是write指定长度数据。

  2、TServerTransport.h:服务端transport基类,主要是为监听的socket提供功能(Client总不需要listen、accept吧)。接口分类:listen()、accept()、interrupt()。

  3、TShortReadTransport.h:测试用,对读取采用随机长度读取,开发者不应该使用。

  4、TSocket.h/.cpp:客户端的socket transport实现。通过指定host、port,通过TTransport中的方法即可实现数据的发送。

  5、TSocketPool.h/.cpp:继承于TSocket,此类提供管理多个server的能力,server的host&port聚合为TSocketPoolServer对象,存储在TSocketPool中。

  6、TTransportException.h/.cpp:与TProtocolException类似,提供transport的错误类型。

  7、TServerSocket.h/.cpp:实现了TServerTransport,accept后会返回一个TSocket。常用方法为listen()、accept()、interrupt()。

  8、TBufferTransports.h/.cpp:

    1)TBufferBase类提供对buffer的抽象操作,四个指针:rBase_、rBound_、wBase_、wBound_。

    2)TUnderlyingTransport提供buffer的生成,四个变量:rBuf_、rBufSize_、wBuf_、wBufSize_,以及集成了一个trans_。

    3)TBufferedTransport完成从transport读取数据到buf的操作,buffer长度固定。

    4)TBufferedTransportFactory工厂类。

    5)TFramedTransport,与TBufferedTransport相比,buf会变,不调用flush的数据就不会发到transport。

    6)TFramedTransportFactory工厂类。

    7)TMemoryBuffer类继承于TBufferBase,数据存储在内存,没有也不会通过trans_发送。

    黑体加粗部分为对开发者暴露类。

  9、TFDTransport.h/.cpp:直接从文件中read/write,FD就是file description的缩写。

  10、TSimpleFileTransport.h/.cpp:继承于TFDTransport,添加根据文件名打开FD的功能。

  11、……

processor

  1、StatsProcessor.h:用于输出RPC调用LOG,此类用于调试。

  2、PeekProcessor.h/.cpp:

concurrency

  1、Thread.h:提供Runnable,用于开发者实现一个可供Thread调用的任务。Thread绑定一个Runnable,通过start方法开启线程调用Runnable。ThreadFactory根据Runnable产生Thread。

  2、Monitor.h:提供条件变量功能。

  3、Exception.h:提供一些继承于TException的子类,用于标记异常。

  4、Mutex.h/.cpp:提供一般锁/读写锁,以及相应的Guard。

  5、ThreadManager.h/.cpp:工作线程(Worker)和任务管理器(Task)。类似于Cocoa中的GCD,可设置N个执行线程,M个Task。另外还有许多可配置项。

  6、PosixThreadFactory.h/.cpp:一个线程工厂。

  7、Util.h/.cpp:提供些有用的辅助方法。

  8、FunctionRunner.h:提供把函数包装成Runnable的功能。

  9、TimerManager.h/.cpp:类似于ThreadManager。Dispatcher为唯一的工作线程,当有task时,从task_list中取出到时间的task以执行。单线程。

server

   1、TServer.h:

    1)TEventHanlder是服务端实现功能的地方,实现preServe,clientBegin,clientEnd方法。 preServe()在listen成功后只调用一次。每接受一个新Client,clientBegin和clientEnd就调用一次。

    2)TServer是一个虚基类,绑定一个TProcessor,用于处理数据,个TServerTransport用于处理数据发送与连 接,一个eventHanlder用于将数据dispatch到服务端自己的逻辑代码中。提供serve()=0方法,是开启服务的入口。此类只是一个基 类。实现了Runnable接口,可以被线程TThread唤起。

  2、TSimpleServer.h:是TServer的一个子类,实现单线程阻塞的服务器。循环调用process处理数据。

   3、TThreadedServer.h:继承于TServer(提供serve入口)。每新到一个請 求,则新建一个Task对象(Runnable),TThreadFactory根据Task对象生成一个线程,然后运行。所以此类与 TSimpleServer的单线程阻塞式不一样,此类对每一个請求开启一个新线程处理。

   4、TThreadedPoolServer.h/.cpp:内部使用ThreadManager来管理线程和任务,TThreadedPoolServer只是实现了TServer的相关内容,核心都在ThreadManager中。

   5、TNonblockingServer.h/.cpp:使用了libevent的异步模型。非阻塞服务器。libevent性能有待研究。内部也可以使用ThreadManager,如果使用ThreadManager则上TThreadedMangePoolServer一样了。

 

分享到:
评论

相关推荐

    php-hbase-thrift

    4. 可能还有相关的配置文件,如HBase的配置文件和Thrift的配置文件。 总结起来,"php-hbase-thrift"项目是一个利用Thrift作为通信桥梁,使PHP应用程序能够高效地操作HBase数据库的解决方案。它涵盖了分布式数据库、...

    hbase-sdk是基于hbase-client和hbase-thrift的原生API封装的一款轻量级的HBase ORM框架

    hbase-sdk是基于hbase-client和hbase-thrift的原生API封装的一款轻量级的HBase ORM框架。 针对HBase各版本API(1.x~2.x)间的差异,在其上剥离出了一层统一的抽象。并提供了以类SQL的方式来读写HBase表中的数据。对...

    java代码使用thrift2操作hbase示例

    在本文中,我们将深入探讨如何使用Java通过Thrift2接口操作HBase数据库。HBase是一个分布式、可扩展的大数据存储系统,它构建于Hadoop之上,支持实时读写。Thrift是一个轻量级的框架,用于跨语言服务开发,允许不同...

    Hbase Thrift Manul

    HBase Thrift是HBase提供的一个非Java客户端接口,允许用户使用除Java之外的语言与HBase进行交互。HBase本身是用Java编写的,因此它提供了一个基于Java的客户端API,但这对于不使用Java或者不希望运行JVM(Java...

    hbase thrift python

    总之,HBase、Thrift和Python的结合提供了在Python环境中便捷访问HBase的能力,尤其适合需要进行复杂数据分析或实时查询的项目。通过理解这些技术的原理和交互方式,开发者可以有效地利用它们构建分布式数据处理解决...

    thrift1 查询hbase

    例如,在大数据分析中,Python可能用于数据预处理和分析,而HBase则用于存储海量数据,Thrift1接口就成为两者之间的桥梁。 7. **优化与注意事项**:在实际应用中,需要考虑性能优化,如批量操作、合理的数据模型...

    Python3通过thrift连接hbase库_修改版,个人已验证

    python3通过thrift连接hbase模块修改版,其中hbase-python3,里面的path,根据实际实际路径修改.

    HBASE_thrift_cpp.rar

    综上所述,"HBASE_thrift_cpp.rar"中的内容可能包括了使用C++通过Thrift接口与HBase交互所需的所有组件,如客户端库、示例代码、配置文件等,帮助开发者构建能够对HBase数据库执行各种操作的应用程序。深入理解和...

    golang connect hbase thrift2

    在本文中,我们将深入探讨如何使用Golang连接到HBase数据库,特别是在最新的Thrift2协议下。Thrift是一种跨语言的服务开发工具,它允许我们定义服务接口,然后自动生成多种编程语言的代码,使得不同语言之间可以进行...

    thrift操作Hbase数据库

    首先,我们需要在Hbase服务器上安装并配置Thrift服务,然后在客户端(这里是C#应用)中引用Thrift生成的Hbase接口库。Thrift的IDL(Interface Description Language)文件定义了与Hbase交互的协议,包括表的操作、行...

    python thrift2 connect hbase

    Python Thrift2与HBase的交互是大数据领域中常见的操作,尤其在分布式系统中,为了高效地访问HBase存储的数据,开发者通常会采用Thrift2作为通信协议。Thrift是一种跨语言的服务框架,它允许不同编程语言之间的高效...

    C#使用Thrift2操作HBase数据库

    这个文件定义了HBase服务和相关的数据类型。 3. **生成C#代码**: 使用Thrift编译器将HBase的Thrift IDL文件转换为C#代码。这将生成一个包含HBase服务客户端类的C#项目,你可以导入到你的解决方案中。 4. **连接...

    通过thrift使用c++访问hbase

    【标题】: "通过Thrift使用C++访问HBase" 【描述】: "本文档详述了如何在Linux和Windows环境下配置Thrift环境并使用HBase的C++客户端。" 【标签】: "hadoop hbase thrift boost" 在IT领域,特别是大数据处理中,...

    VS2017_Hbase thrift C++接口测试

    **VS2017_Hbase thrift C++接口测试** 在这个项目中,我们主要探讨如何在Visual Studio 2017(VS2017)环境下,利用C++语言通过Thrift库来与HBase数据库进行交互。Thrift是一种跨语言的服务开发框架,它允许我们...

    java 通过thrift-0.9.1读取hbase表数据

    在HBase的conf目录下,需要配置thrift的相关设置,比如开启Thrift服务器,并指定使用的Thrift版本(这里是0.9.1)。 2. **生成Thrift客户端代码**:使用Thrift编译器将HBase的thrift IDL文件(通常是`hbase.thrift`...

    python3使用thrift操作hbase hbase-thirft报错解决

    python连接hbase需要用到hbase-thirft类库,但是hbase-thirft只在python2下能正常使用,如果在python3下,会报错,主要有一下几个错误 except IOError, io: SyntaxError: invalid syntax ModuleNotFoundError: No ...

    python通过thrift访问hbase.docx

    "Python 通过 Thrift 访问 HBase" 在大数据时代,HBase 作为一个分布式的、面向列的 NoSQL 数据库,广泛应用于大规模数据存储和处理中。Python 作为一门流行的编程语言,也提供了多种方式来访问 HBase。其中,...

    C#通过thrift连接hbase过程

    【C#通过Thrift连接Hbase过程】 在分布式大数据存储领域,Apache Hbase是一个流行的NoSQL数据库,它基于Google的Bigtable设计,并运行在Apache Hadoop之上。为了在不同的编程语言环境中与Hbase进行交互,Thrift(一...

    藏经阁-HBase多语言访问.pdf

    HBase.thrift文件是HBase的Thrift IDL文件,用于定义HBase的Thrift接口。HBase.thrift文件包括多个定义,例如HBase、Table和Admin等。这些定义用于描述HBase的Thrift接口,例如HBase::Get用于获取HBase表的数据,而...

    python操作hbase

    Python操作HBase是一种常见的情景,特别是在大数据处理和分析领域。HBase是一个分布式、高性能、基于列族的NoSQL数据库,它构建在Hadoop文件系统之上,提供了对大规模数据的实时访问。Python作为一门易学易用的编程...

Global site tag (gtag.js) - Google Analytics