Hadoop总结篇之四---底层通信是怎么做到的
上一篇介绍了一个job的提交过程。期间多次提到通信协议。那么协议是什么?
协议其实就是通信的双方所遵守的一套规范,这套规范规定了通信时传输的数据的固定的格式。
4.1 RPC协议:在hadoop中,我们采用的是RPC协议。
该协议主要包含四个部分:
序列化层:协议中的参数采用Protocol Buffers来序列化/反序列化。
这个Protocol Buffers是一种数据存储格式,可以理解我们按照其语法格式定义一个数据结构类model,然后使用工具(Protocol Buffers编译器)编译为我们所使用的语言,比如java。接下来,就可以使用对应库提供的Api来操作这个java语言的类来存储我们的数据。
网络传输层:序列化好后就需要传输,采用基于Tcp/IP的Socket机制
服务器端处理框架:传输成功后,就要考虑怎么在Server端进行处理。基于Reactor设计模式的事件驱动I/O模型
函数调用层:这里就是最后一步,怎么调用到具体的函数了。采用了反射和动态代理来实现的。
4.2 Hadoop RPC协议主要组成
4.2.1 server 实现细节(主要负责接到消息后的处理过程)

(1)接收请求
接收RPC 请求,封装为Call类型对象
放到一个共享队列(callQueue)中,以便进行后续处理。该阶段内部又分为建立
连接和接收请求两个子阶段,分别由Listener 和Reader 两种线程完成。
整个Server 只有一个Listener 线程,统一负责监听来自客户端的连接请求,一旦有新的请
求到达,它会采用轮询的方式从线程池中选择一个Reader 线程进行处理,而Reader 线程可同
时存在多个,它们分别负责接收一部分客户端连接的RPC 请求,至于每个Reader 线程负责
哪些客户端连接,完全由Listener 决定,当前Listener 只是采用了简单的轮询分配机制。
Listener 和Reader 线程内部各自包含一个Selector 对象,分别用于监听SelectionKey.
OP_ACCEPT 和SelectionKey.OP_READ 事件。对于Listener 线程,主循环的实现体是监听
是否有新的连接请求到达,并采用轮询策略选择一个Reader 线程处理新连接;对于Reader
线程,主循环的实现体是监听(它负责的那部分)客户端连接中是否有新的RPC 请求到
达,并将新的RPC 请求封装成Call 对象,放到共享队列callQueue 中。
(2)处理请求
从共享队列callQueue 中获取Call 对象,执行对应的函数调用,并
将结果返回给客户端,这全部由Handler 线程完成。
Server 端可同时存在多个Handler 线程,它们并行从共享队列中读取Call 对象,经执
行对应的函数调用后,将尝试着直接将结果返回给对应的客户端。但考虑到某些函数调用
返回结果很大或者网络速度过慢,可能难以将结果一次性发送到客户端,此时Handler 将尝
试着将后续发送任务交给Responder 线程。
(3)返回结果
前面提到,每个Handler 线程执行完函数调用后,会尝试着将执行结果返回给客户端,
但对于特殊情况,比如函数调用返回结果过大或者网络异常情况(网速过慢),会将发送任
务交给Responder 线程。
Server 端仅存在一个Responder 线程, 它的内部包含一个Selector 对象, 用于监听
SelectionKey.OP_WRITE 事件。当Handler 没能将结果一次性发送到客户端时, 会向该
Selector 对象注册SelectionKey.OP_WRITE 事件,进而由Responder 线程采用异步方式继续
发送未发送完成的结果。
4.2.2 client 类(主要负责建立连接发送请求)
Call类和Connection类。
Call类是请求的内容定义以及返回值定义
Connection供客户端建立一个通信连接。各种信息,包括Call类内容,都被封装到Connection中。
4.2.3 RPC类 (对服务器端、客户端的定义和管理)
提供一系列方法供调用,比如构建服务,启动服务等,设置基本参数(比如序列化方式)
4.3 Yarn RPC
将序列化部分剥离出来,自身作为一个工厂,可使用第三方的具体实现,比如Protocol Buffers对应的RPCEngine实现。底层的函数调用机制仍采用Hadoop自带的。
4.4 协议都用在哪?
yarn是资源管理系统负责资源的管理和调度。如果要让应用程序在yarn上得到执行,通常需要编写两个组件:
Client 提交应用程序、查询运行状态
ApplicationMaster 申请资源、与NodeManager通信启动Container,监控各个任务运行状态,失败时重新申请资源。
yarn已为我们实现了。这些组件和yarn框架通信,将使用下一节即将介绍的各种协议。
4.5 主要的RPC协议
我们从一个作业提交、执行、结束整个过程开始捋。
4.6.1 提交 ApplicationClientProtocol
Client和ResourceManager通信。提交、查询Application运行状态活杀死应用程序。
4.6.2 申请资源 ApplicationMastertProtocol
MRAppMaster和ResourceManager通信。注册、申请资源,获取任务运行状态。
4.6.3 执行ContainerManagementProtocol
APPMaster和NodeManager通信。启动/撤销Container活查询Container运行状态。
4.6.4 贯穿全局的ResourceTracker
负责ResourceManager和NodeManager之间的通信。定义了两个主主要的RPC函数:
registerNodeManager 向ResourceManager注册
nodeHearbeat 周期性发送心跳信息
4.6.5 MRAPPMaster
APPMaster启动后,Client和APPMaster直接通信,以减轻ResourceManager负担。
Hadoop总结篇之四---底层通信是怎么做到的的更多相关文章
- [老老实实学WCF] 第五篇 再探通信--ClientBase
老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...
- 【深入浅出 Yarn 架构与实现】2-2 Yarn 基础库 - 底层通信库 RPC
RPC(Remote Procedure Call) 是 Hadoop 服务通信的关键库,支撑上层分布式环境下复杂的进程间(Inter-Process Communication, IPC)通信逻辑, ...
- Hadoop总结篇之一------开篇
从今天开始新的系列:Hadoop总结篇 之前的hadoop学习篇由于是学习过程中随手记下来的一些内容,不具有系统性.所以在这个系列中,将凭着这段时间的研究心得,来记录一些自认为比较重要的东西. 本系列 ...
- Scala进阶之路-Spark底层通信小案例
Scala进阶之路-Spark底层通信小案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spark Master和worker通信过程简介 1>.Worker会向ma ...
- Hadoop总结篇之三---一个Job到底被提交到哪去了
我们会定义Job,我们会定义map和reduce程序.那么,这个Job到底是怎么提交的?提交到哪去了?它到底和集群怎么进行交互的呢? 这篇文章将从头讲起. 开发hadoop的程序时,一共有三大块,也就 ...
- Hadoop总结篇之二--yarn的概况
在弄清楚yarn是什么之前,先来看一下MRv1. 它的由编程模型+数据处理引擎(map/reduceTask)+运行时环境组成(JobTracker/TaskTracker).其中JobTracker ...
- hadoop入门篇---超详细hadoop服务器环境配置教程
虚拟机以及Linux系统安装在之前的两篇分享中已经详细的介绍了方法,并且每一步的都配图了.如果有朋友还是看不懂,那我也爱莫能助了.本篇主要就hadoop服务器操作系统配置进行详细说明,hadoop安装 ...
- Hadoop介绍篇
Hadoop详解 1.前言 对于初次接触Hadoop的小伙伴来说,Hadoop是一个很陌生的东西,尤其是Hadoop与大数据之间的关联,写这篇文章之前,我也有许多关于Hadoop与大数据的疑惑,接下来 ...
- Hadoop学习篇 2 初识 Hadoop
在一个全配置的集群上,运行Hadoop意味着在网络分布的不同服务器上运行一组守护进程 (daemons),这些守护进程或运行在单个服务器上,或运行与多个服务器上,他们包括: (1) NameNode( ...
随机推荐
- C#知识体系(二)用案例来理解委托与事件
上一篇博客讲到了LinQ和lambda的常用方法 还有很多我们未知但c#设计团队已经为我们封装好的类和方法.随着我们不断的熟悉C#语言,渐渐的就会接触到其他的知识点,委托.事件.反射.线程.同步,异步 ...
- 测试markdown
总结 写内容:博客重要的是内容,如果要讲形式与技术,应该深入学习html,这不是我的重点. 专注:就是利用MD这个好机会,忘记格式,用最简约的美观,来反衬出思考的清晰,内容的价值性. 今天 既要美国式 ...
- Linux软件的安装方法!!!
1.yum/rpm(*.rpm) 包管理器:直接yum/rpm安装. 优点:是全自动化安装,不需要为依赖问题发愁,缺点是自主性太差,软件的功能.存放位置固定,不易变更. 2.源码包(*.tar.gz) ...
- EMV文档:接收到的ATR不在EMV规定范围,终端需要的操作
Required terminal behaviour in the event that a terminal receives characters outside the range allow ...
- [翻译] LTE/LTE-Advanced for Mobile Broadband-10.4
10.4 下行L1/L2控制信令 上下行信道的数据传输,需要特定的“下行控制信令”提供支持.下行控制信令通常被称为“下行L1/L2控制信令”,这表示该控制信令部分来自物理层(L1),部分来自MAC层( ...
- Servlet---RequestDispatcher.include方法
为了实现代码重用,需要将某些代码和数据放在一个或多个Servlet中,以供其他Servlet使用,提供了RequestDispatcher.include方法,首先通过getServletContex ...
- 【转】JavaScript获取节点类型、节点名称和节点值
DOM节点信息包括节点类型(nodeType).节点名称(nodeName)和节点值(nodeValue). 节点类型 DOM节点中,每个节点都拥有不同的类型.W3C规范中常用的 DOM节点类型有以下 ...
- JS实现HashMap
/** * ********* 操作实例 ************** * var map = new HashMap(); * map.put("key1","Valu ...
- ng-class的用法
最近在学习angular框架,ng-class是angular框架的一个指令,这里是ng-class指令的官方解释: ng-class 指令用于给 HTML 元素动态绑定一个或多个 CSS 类. ng ...
- yii gii自动生成的curd添加批量删除实例
1.在视图中 CGridView中的columns添加,作用是添加多选框 代码如下 复制代码 array( 'selectableRows' => 2, 'foot ...