深入理解hadoop(二)

hadoop RPC

  网络通信是hadoop的核心模块之一,他支撑了整个Hadoop的上层分布式应用(HBASE、HDFS、MapReduce), Hadoop RPC具有以下几个特性,透明性(用户本身不应该感觉到跨机器调用的细节)、高性能(高吞吐、高并发)、可控性(轻量级、网络链接、超时、缓冲区设计可定制可扩展)。

  RPC框架实现分为四个层面:

  序列化层

    这里序列化特指将结构化的对象转为字节流以便在网络中传输或者持久化存储、hadoop 实现了自己的序列化框架(hadoop子项目Avro),良好的序列化框架应该有以下特点,压缩,序列化应该压缩数据以便在网络中传输和存储;可扩展性,理论上结构化对象的属性变化,不影响反序列化;良好的兼容性,支持多语言;高效性,序列化或者反序列化速率高效。java本身也有自己的序列化框架,但是java的序列化框架不够灵活,不能控制序列化的整个流程,序列化算法也不标准,没有做一定的压缩,java序列化首先写类名,然后再是整个类的数据,而且成员对象在序列化中只存引用,成员对象的可以出现的位置很随机,既可以在序列化的对象前,也可以在其后面,这样就对随机访问造成影响,一旦出错,整个后面的序列化就会全部错误。

     Avro是个支持多语言的数据序列化框架,支持c,c++,c#,python,java,php,ruby,java。他的诞生主要是为了弥补Writable只支持java语言的缺陷。很多人会问类似的框架还有Thrift和Protocol,那为什么不使用这些框架,而要重新建一个框架呢,或者说Avro有哪些不同。首先,Avro和其他框架一样,数据是用与语言无关的schema描述的,不同的是Avro的代码生成是可选的,schema和数据存放在一起,而schema使得整个数据的处理过程并不生成代码、静态数据类型等,为了实现这些,需要假设读取数据的时候模式是已知的,这样就会产生紧耦合的编码,不再需要用户指定字段标识。

    Avro的schema是JSON格式的,而编码后的数据是二进制格式(当然还有其他可选项)的,这样对于已经拥有JSON库的语言可以容易实现。

    Avro还支持扩展,写的schema和读的schema不一定要是同一个,也就是说兼容新旧schema和新旧客户端的读取,比如新的schema增加了一个字段,新旧客户端都能读旧的数据,新客户端按新的schema去写数据,当旧的客户端读到新的数据时可以忽略新增的字段。

    Avro还支持datafile文件,schema写在文件开头的元数据描述符里,Avro datafile支持压缩和分割,这就意味着可以做Mapreduce的输入。

  函数调用层

    函数调用层的主要功能是定位要调用的函数并执行该函数、Hadoop RPC 采用反射和动态代理来实现函数调用。

  网络传输层

    网络传输层主要描述了server与client之间的消息传输方式、Hadoop RPC 采用了基于TCP/IP的socket调用。

  服务端处理框架

    服务端处理框架可被抽象为网络I/O 模型,他的设计直接影响PRC的处理能力,常见的网路I/O模型分为,阻塞、非阻塞、事件驱动等、Hadoop RPC的服务端处理采用了基于Reactor模式的事件驱动I/O模型。

  

原文地址:https://www.cnblogs.com/LiJianBlog/p/5269410.html