上一篇介绍了一个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总结篇之四---底层通信是怎么做到的的更多相关文章

  1. [老老实实学WCF] 第五篇 再探通信--ClientBase

    老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...

  2. 【深入浅出 Yarn 架构与实现】2-2 Yarn 基础库 - 底层通信库 RPC

    RPC(Remote Procedure Call) 是 Hadoop 服务通信的关键库,支撑上层分布式环境下复杂的进程间(Inter-Process Communication, IPC)通信逻辑, ...

  3. Hadoop总结篇之一------开篇

    从今天开始新的系列:Hadoop总结篇 之前的hadoop学习篇由于是学习过程中随手记下来的一些内容,不具有系统性.所以在这个系列中,将凭着这段时间的研究心得,来记录一些自认为比较重要的东西. 本系列 ...

  4. Scala进阶之路-Spark底层通信小案例

    Scala进阶之路-Spark底层通信小案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spark Master和worker通信过程简介 1>.Worker会向ma ...

  5. Hadoop总结篇之三---一个Job到底被提交到哪去了

    我们会定义Job,我们会定义map和reduce程序.那么,这个Job到底是怎么提交的?提交到哪去了?它到底和集群怎么进行交互的呢? 这篇文章将从头讲起. 开发hadoop的程序时,一共有三大块,也就 ...

  6. Hadoop总结篇之二--yarn的概况

    在弄清楚yarn是什么之前,先来看一下MRv1. 它的由编程模型+数据处理引擎(map/reduceTask)+运行时环境组成(JobTracker/TaskTracker).其中JobTracker ...

  7. hadoop入门篇---超详细hadoop服务器环境配置教程

    虚拟机以及Linux系统安装在之前的两篇分享中已经详细的介绍了方法,并且每一步的都配图了.如果有朋友还是看不懂,那我也爱莫能助了.本篇主要就hadoop服务器操作系统配置进行详细说明,hadoop安装 ...

  8. Hadoop介绍篇

    Hadoop详解 1.前言 对于初次接触Hadoop的小伙伴来说,Hadoop是一个很陌生的东西,尤其是Hadoop与大数据之间的关联,写这篇文章之前,我也有许多关于Hadoop与大数据的疑惑,接下来 ...

  9. Hadoop学习篇 2 初识 Hadoop

    在一个全配置的集群上,运行Hadoop意味着在网络分布的不同服务器上运行一组守护进程 (daemons),这些守护进程或运行在单个服务器上,或运行与多个服务器上,他们包括: (1) NameNode( ...

随机推荐

  1. Baskets of Gold Coins_暴力

    Problem Description You are given N baskets of gold coins. The baskets are numbered from 1 to N. In ...

  2. 安装Python2.7环境

    1.下载并根据提示安装python_2.7.10_x64 2.将安装目录配置到环境变量path中 3.在命令后台中输入Python,出现下图中信息表示安装成功

  3. jquery jqPlot API 中文使用教程

    jqPlot是一个灰常强大的图表工具,曲线,柱状,饼图,应该有尽有,更要命的是,调用方便~~ 官网:http://www.jqplot.com/ 这里贡献上中文教程,基本上所有的api都很齐全,供有需 ...

  4. Keepalived双机热备

    一,Keepalived双机热备的应用场景 1,网站流量不高,压力不大,但是对服务器的可靠性要求极其高,例如实时在线OA系统,政府部门网站系统,医院实时报医系统,公安局在线报案系统,股市后台网站系统等 ...

  5. redis-cluster 单个节点不可用

    背景: 公司的音视频 盗版检测业务,使用redis-cluster作为 key-value 数据库, 使用张图片的 特征hash值作key.因为数据量太大,机器有限,集群内没有slaver 问题描述 ...

  6. Angularjs scope

    $scope: var myapp = angular.module('myapp', []); myapp .controller('parent', function ($scope,$timeo ...

  7. linux 公社的网友出品的 Qt5.5 安装脚本,copy过来了

    http://www.linuxdiyf.com/linux/13046.html Qt5.5已经发布了,前两天PyQt也很快推出了一个5.5的对应版本.试验了一下(花了个周末啊!),真是越来越好用了 ...

  8. netezza 数据库 取 季初 季末 时间

    -- 取季初那一天 select date_trunc( 'quarter',cast('20150820' as date)) -- 取季末那一天 select add_months(date_tr ...

  9. uva 10820

    /* 交表 _________________________________________________________________________________ #include < ...

  10. Getting Real 开发宝典

       此书是管理者.程序员或设计师必学的宝典.它以更小的规模,更快的速度,更高的质量来完成软件开发,使产品更简单.粗暴(精致).      近百条精炼总结,不要奢望一次全部记住或理解,只要能理解或做到 ...