RPC(Remote Procedure Call, 远程过程调用)主要面对两个问题:

1.对象调用方式;

2.序列/反序列化机制。

Hadoop实现的RPC组件依赖于Hadoop Writable类型支持。Writable接口要求每个实现类能将本类正确序列化与反序列化。

Hadoop RPC使用java动态代理反射机制,来实现对象调用。Client到Server的数据序列化与反序列化由Hadoop框架或用户自定制。

一、RPC实现流程

RPC简单说明就是:Hadoop = 动态代理 +定制二进制流

也就是说,远程对象拥有固定接口,并且对用户可见,但是真正的实现在Server端。用户如果想使用哪个实现,调用过程为:先根据相应接口动态代理生成一个代理对象,调用此代理对象时的请求被RPC捕捉到,然后包装成调用请求,序列化成数据流发送到Server端;Server再从数据流中解析出request,然后根据用户要求调用接口来调用,实现真正的对象,其调用结果返回给Client。

二、RPC实体模型

RPC在Server端的模型为一系列的实体组成,分别负责调用的整个流程。

Listener:监听RPC Server端口,如果Client端有连接请求,就接收连接并把连接转发到某个Reader,然后Reader读取连接的数据。

Reader:从某个Client读取data Stream,把它转化成调用对象(call),然后放到调用队列(callqueue)里。

Handler:处理实体。从callqueue(调用队列)里获取calling info(调用信息),然后反射调用真正的对象得到结果,再把结果放回call queue里

Responder:不断检查responsequeue中是否有calling info(调用信息),如果有就把结果返回给Client。

三、文件读取过程

HDFS都是“一次写入,多次读取”,且读取过程比写入过程要简单。

1.使用HDFS提供的客户端开发库Client向远程的NameNode发起RPC请求;

2.NameNode视情况返回文件的部分或全部Block列表,对于每个Block,NameNode都会返回有该Block副本的DataNode地址;

3.客户端开发库Client会选取离客户端最近的DataNode来读取Block;如果客户端本身为DataNode,就从本地直接获取数据。

4.读取完当前Block数据,关闭与当前DataNode连接,继续寻找下一个DataNode以读取Block;

5.读完列表的Block,且文件读取还未结束,Client会继续向NameNode获取下一批Block列表;

6.读取完一个Block都会进行Checksum验证,如果读取DataNode时出现错误,Client端会通知NameNode,然后从下一个拥有该Block复制的DataNode读取。

四、文件写入过程

1.使用HDFS的客户端开发库Client向远程NameNode发起RPC请求;

2.NameNode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功会为文件创建一个记录,否则会让client端抛出异常;

3.当client端开始写入文件的时候,开发库会将文件切分成多个packet,并在内部以data queue(数据队列)的形式管理这些packet,并向NameNode申请新的Block,获取这个存储replicas的合适的DataNode列表,列表的大小根据在NameNode里对replication的设置而定;

4.以管道(pipeline)的形式将packet写入所有的replicas中,开发库把packet以流的方式写入第一个DataNode,该DataNode把packet存储之后,再将其传递给在此管道中的下一个DataNode,直到最后一个DataNode;

5.最后一个DataNode成功存储之后会返回一个ack packet,在管道里传到client端,在client端的开发库内部维护着ack queue,成功收到DataNode返回的ack packet后会从ack queue移除相应的packet.

6.如果传输过程中有某个DataNode出现了故障,当前pipeline会被关闭,出现故障的DataNode会从当前pipeline中移除,剩余的Block会继续剩下的DataNode中继续以管道形式传输,同时NameNode会分配一个新的DataNode,保持replicas设定的数量。

【Hadoop】HDFS笔记(一):Hadoop的RPC机制的更多相关文章

  1. 【hadoop代码笔记】hadoop作业提交之汇总

    一.概述 在本篇博文中,试图通过代码了解hadoop job执行的整个流程.即用户提交的mapreduce的jar文件.输入提交到hadoop的集群,并在集群中运行.重点在代码的角度描述整个流程,有些 ...

  2. [转帖]hadoop学习笔记:hadoop文件系统浅析

    hadoop学习笔记:hadoop文件系统浅析 https://www.cnblogs.com/sharpxiajun/archive/2013/06/15/3137765.html 1.什么是分布式 ...

  3. 啃掉Hadoop系列笔记(03)-Hadoop运行模式之本地模式

    Hadoop的本地模式为Hadoop的默认模式,不需要启用单独进程,直接可以运行,测试和开发时使用. 在<啃掉Hadoop系列笔记(02)-Hadoop运行环境搭建>中若环境搭建成功,则直 ...

  4. Hadoop学习笔记—3.Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...

  5. [Hadoop] Hadoop学习笔记之Hadoop基础

    1 Hadoop是什么? Google公司发表了两篇论文:一篇论文是“The Google File System”,介绍如何实现分布式地存储海量数据:另一篇论文是“Mapreduce:Simplif ...

  6. Hadoop学习笔记【Hadoop家族成员概述】

    Hadoop家族成员概述 一.Hadoop简介 1.1 什么是Hadoop? Hadoop是一个分布式系统基础架构,由Apache基金会所开发,目前Yahoo!是其最重要的贡献者. Hadoop实现了 ...

  7. hadoop学习笔记:hadoop文件系统浅析

    1.什么是分布式文件系统? 管理网络中跨多台计算机存储的文件系统称为分布式文件系统. 2.为什么需要分布式文件系统了? 原因很简单,当数据集的大小超过一台独立物理计算机的存储能力时候,就有必要对它进行 ...

  8. Hadoop学习笔记(3) Hadoop文件系统二

    1 查询文件系统 (1) 文件元数据:FileStatus,该类封装了文件系统中文件和目录的元数据,包括文件长度.块大小.备份.修改时间.所有者以及版权信息.FileSystem的getFileSta ...

  9. Hadoop学习笔记(3) Hadoop文件系统一

    1. 分布式文件系统,即为管理网络中跨多台计算机存储的文件系统.HDFS以流式数据访问模式来存储超大文件,运行于商用硬件集群上.HDFS的构建思路为:一次写入.多次读取是最高效的访问模式.数据集通常由 ...

  10. 啃掉Hadoop系列笔记(01)-Hadoop框架的大数据生态

    一.Hadoop是什么 1)Hadoop是一个由Apache基金会所开发的分布式系统基础架构 2)主要解决,海量数据的存储和海量数据的分析计算问题. 3)广义上来说,HADOOP通常是指一个更广泛的概 ...

随机推荐

  1. Ionic + AngularJS angular-translate 国际化本地化解决方案

    欢迎访问我们的网站,网站上有更多关于技术性的交流:http://www.ncloud.hk/技术分享/ionic-plus-angularjs-angular-translate-国际化本地化解决方案 ...

  2. API网关如何实现对服务下线实时感知

    上篇文章<Eureka 缓存机制>介绍了Eureka的缓存机制,相信大家对Eureka 有了进一步的了解,本文将详细介绍API网关如何实现服务下线的实时感知. 一.前言 在基于云的微服务应 ...

  3. python pyinotify模块详解

    转载于http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=23504396&id=2929446 1年多前就看过相关内容了, ...

  4. datatable的使用

    学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...

  5. linux的su和sudo(转载)

    来源:http://www.jb51.net/LINUXjishu/12713.html 一. 使用 su 命令临时切换用户身份 1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比 ...

  6. 不为客户连接创建子进程的并发回射服务器( select实现 )

    前言 在此前,我已经介绍了一种并发回射服务器实现( 点此进入 ).它通过调用fork函数为每个客户请求创建一个子进程.同时,我还为此服务器添加了自动消除僵尸子进程的机制.现在请想想,在客户量非常大的情 ...

  7. MongoDB 操作手冊CRUD 事务 两步提交

    运行两步提交 概述 这部分提供了多记录更新或者多记录事务.使用两步提交来完毕多记录写入的模板. 另外.能够扩展此方法来提供rollback-like功能. 背景 MongoDB对于单条记录的操作是原子 ...

  8. 脱了裤子放屁之std::string

    一个天天跟c#奋斗的苦逼c++程序猿 改自己曾经代码的时候发现有例如以下几行. char szPath[MAX_PATH] = {0}; GetModuleFileNameA(NULL,szPath, ...

  9. session自己定义存储,怎样更好地进行session共享;读tomcat7源代码,org.apache.catalina.session.FileStore可知

    session自己定义存储.怎样更好地进行session共享: 读tomcat源代码,org.apache.catalina.session.FileStore可知 一.详见: 方法1 public ...

  10. EasyDarwin开源摄像机访问EasyCamera中海康摄像头语音对讲和云台控制转发实现

    转自:http://blog.csdn.net/yanzhuomin/article/details/52887311 EasyCamera中关于摄像头SDK的调用都集中在EasyCameraSour ...