【Hadoop】HDFS笔记(一):Hadoop的RPC机制

        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设定的数量。

转载于:https://www.cnblogs.com/DianaCody/p/5425663.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值