`

YARN/MRv2 RPC框架深入剖析—引入Protocal Buffer的好处

 
阅读更多
Hadoop2.0中已经将Protocol buffer(以面简称PB ,http://code.google.com/p/protobuf/ )作为默认的序列化/反序列化框架,原来的自己实现的基于Writable的方式已经被淘汰了。来自Cloudera的Aaron T. Myers在邮件中这样说的“since PB can provide support for evolving protocols in a compatible fashion”,本文将尝试以实例的形式解释Aaron T. Myers这句话的含义,即引入PB的好处。

PB是Google开源的一种轻量级的结构化数据存储格式,可以用于结构化数据的序列化/反序列化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。简单理解,它的作用就是一个进程把一些结构化数据通过网络通信的形式传递给另外一个进程(进程间通信);或者某个进程要把某些结构化数据持久化存储到磁盘上(存储格式)。优点是序列化/反序列化速度快,网络或者磁盘IO传输的数据少,支持向后兼容,这在可扩展地数据密集型应用中是非常重要的。

通常而言,一个完整的RPC框架由两部分组成:序列化/反序列化和RPC实现。对于Protocal Buffer而言,它仅包含序列化/反序列化功能,未提供RPC函数相关机制,这一部分需要由用户自己实现,而对应到YARN的设计中,则可以概括为:PB仅代替了Hadoop原来那套自己实现的序列化/反序列化机制(Writable接口和Comparable接口以及实现),而进程间的RPC通信机制仍由YARN自己实现。谈到PB,很多人就会想到Facebook开源的Thrift(http://thrift.apache.org/),与PB相比,Thrift同时提供了序列化/反序列化和RPC实现,但仅从序列化/反序列化方面比较,PB性能要比Thrift好很多。由于Doug Cutting从Hadoop设计之初就强调不会引入一个不可控的核心模块,这意味着,Hadoop不会引入一个不可控的RPC实现,因此,选择了PB而未选择Thrift。

YARN之所以在引入Protocal buffer,最直接的原因是提高Hadoop的向后兼容性,即不同版本的Client、ResourceManager、NodeManager和ApplicationMaster之间通信。在Hadoop 1.0中,如果新版本的通信接口参数定义被修改了,则无法与旧版本进行通信。下面举例进行说明。在YARN中,Client与ResourceManager之间的通信协议是ClientRMProtocol,该协议中有一个RPC函数为:

public SubmitApplicationResponse submitApplication(

SubmitApplicationRequest request)

一看名字大家就能猜到,该函数用于Client向RM提交一个应用程序,其中参数SubmitApplicationRequest中的ApplicationSubmissionContext字段描述了应用程序的一些属性,主要包括以下几个方面:

(1) application_id //application ID

(2) application_name //application

(3) user //application owner

(4) queue//queue that application submits to

(5) priority //application priority

(6) am_container_spec //AM所需资源描述

(7) cancel_tokens_when_complete

(8) unmanaged_am

如果采用Java,ApplicationSubmissionContext定义可能如下:

public class SubmitApplicationRequest implements Writable {

  private ApplicationId application_id;
  private String application_name;
  private String user;
  private String queue;
  private Priority priority;
  private ContainerLaunchContext am_container_spec;
  private bool cancel_tokens_when_complete;
  private bool unmanaged_am;
  ……

  @Override

  public void readFields(DataInput in) throws IOException {
    ……
  }

  @Override
  public void writeFields(DataInput in) throws IOException {
    ……
  }

}

如果在一个新的YARN版本中,需要在ApplicationSubmissionContext中添加一个新的属性,比如deadline(期望应用程序在deadline时间内运行完成),则所有旧的Client将无法与升级后的ResourceManager通信,原因是接口不兼容,即客户端发送的ApplicationSubmissionContext请求包中多出了deadline字段导致ResourceManager无法对其进行反序列化。这意味着所有客户端必须升级,不然无法使用。这是客户端与ResourceManager之间的一个例子,同样,对于NodeManager与ResourceManager,ApplicationMaster与ResourceManager,ApplicationMaster与NodeManager之间的通信也是类似的,一旦一端修改了通信协议内容(RPC函数名不能改),则另外一端必须跟着改,不然对方与之通信(反序列化失败),这可能导致a.b.0版本的NodeManager,无法与a.b.a版本的ResourceManager通信。

为了解决该问题,可使用Protocal Buffer,在PB中,可以采用如下的规范定义ApplicationSubmissionContext:

message ApplicationSubmissionContextProto {

optional ApplicationIdProto application_id = 1;

optional string application_name = 2 [default = "N/A"];

optional string user = 3;

optional string queue = 4 [default = "default"];

optional PriorityProto priority = 5;

optional ContainerLaunchContextProto am_container_spec = 6;

optional bool cancel_tokens_when_complete = 7 [default = true];

optional bool unmanaged_am = 8 [default = false];

}

当需要增加一个新的deadline字段时,可直接在最后面添加一个optional字段即可,即:

message ApplicationSubmissionContextProto {

……

optional bool cancel_tokens_when_complete = 7 [default = true];

optional bool unmanaged_am = 8 [default = false];

optional int deadline=9[default=-1];

}

在Protocal Buffer中,optional字段是可有可无的,你不仅可以加上一个新的optional字段,也可以删除一个旧的optional字段,Protocal Buffer可以自动实现向后兼容。

经过这样修改后,旧的客户端无需升级,ResourceManager仍能反序列化成功。原理可简单解释为:由于旧的客户端请求中没有deadline这一字段,ResourceManager端进行反序列化时会跳过该字段,直接赋予该值为默认值-1。

至此,本文已经解释了引入Protocal Buffer的一个最大好处—满足向后兼容性,在后面几章中,我将详细介绍Protocal Buffer在YARN中的应用。

分享到:
评论

相关推荐

    YARN(MRv2)搭建

    YARN(MRv2)搭建

    yarn-v0.23.2.tar.gz

    yarn-v0.23.2.tar.gz 在安装ambari,源码编译的时候下载的文件有问题 手动下载 地址 https://github.com/yarnpkg/yarn/releases/download/v0.23.2/yarn-v0.23.2.tar.gz

    Flink on Yarn_K8S原理剖析及实践.pdf

    Apache Flink是一个开源的分布式流处理框架,用于在无界和有界数据流上进行有状态的计算。Flink设计用来提供高吞吐量、低延迟的处理能力,并能保证一次性和精确的状态一致性。Flink可以在YARN(Yet Another Resource...

    yarn-v1.22.5.tar.gz

    Yarn 的使用方法基本与 npm 类似,比如 `yarn init` 创建新项目,`yarn add` 添加依赖,`yarn remove` 移除依赖,`yarn upgrade` 升级依赖,`yarn install` 安装项目依赖等。然而,由于 Yarn 的特性,这些操作的执行...

    YARN框架代码详细分析

    2. 支持多计算模型:YARN通过引入ApplicationMaster抽象,可以支持除MapReduce之外的多种计算模型,例如Spark, Tez, Flink等。因此,YARN不仅仅局限于批处理作业,还可以支持交互式、迭代式作业以及数据流处理。 在...

    Yarn框架代码详细分析V0.5

    Hadoop的2.0版本的yarn的框架介绍啊 Hadoop yarnYARN 本身框架的优势是扩展性与支持多计算模型。对于扩展性目前主要体现在计算节点规模上,以前 JobTracker-TaskTracker 模型下最多大约在 5000 台机器左右,对于 ...

    Hadoop的yarn详解

    Hadoop的YARN架构是Hadoop版本2.x引入的一个重要组件,它负责处理资源管理和作业调度,而核心的计算任务处理则交给了MapReduce、Tez、Spark等计算框架。YARN的出现是为了解决Hadoop早期版本中的可扩展性问题,它通过...

    Yarn框架代码详细分析

    YARN(Yet Another Resource Negotiator)是Apache Hadoop的一个子项目,它是下一代MapReduce的框架,旨在解决原有Hadoop MapReduce在可扩展性、资源利用率、多计算模型支持等方面的局限性。YARN的设计目标是实现一...

    YARN应用开发与核心源码剖析.pdf

    ### YARN应用开发与核心源码剖析 #### 1. YARN概述 Hadoop YARN(Yet Another Resource Negotiator)是Hadoop生态系统中的一种新型资源管理框架,它为上层应用提供了一个统一的资源管理和调度平台。YARN的引入极大...

    HadoopYARN大数据计算框架及其资源调度机制研究

    为了解决这些问题,Hadoop 2.0版本引入了一种新的资源管理系统YARN,即MRv2。YARN是一种通用的资源调度体系,它支持多种计算框架(如MapReduce、Spark、Storm等),让它们能够在同一个集群上运行。YARN的核心是资源...

    rpc架构与hadoop分享

    - **YARN架构**:YARN是Hadoop 2.0引入的新一代资源管理系统,它将资源管理和作业调度分离,提高了集群资源利用率和灵活性。 - **性能优化**:通过参数调整、数据压缩、内存管理等方式提升Hadoop系统的整体性能。 ...

    使用yarn create umi安装Ant Design Pro时报错TypeError: self.env.emit is not a function

    TypeError: self.env.emit is not a function at /usr/local/share/.config/yarn/global/node_modules/yeoman-generator/lib/index.js:653:22 at processTicksAndRejections (internal/process/task_queues.js:97:5)...

    Hadoop技术内幕深入解析YARN架构设计与实现原理PDF

    《Hadoop技术内幕深入解析YARN架构设计与实现原理》这本书深入探讨了Hadoop生态系统中的核心组件YARN(Yet Another Resource Negotiator),它是Hadoop 2.x版本中的关键改进,旨在解决早期Hadoop MapReduce的资源...

    YARN Essentials.PDF

    YARN 在 Hadoop 2.x 版本中被引入,取代了 Hadoop 1.x 中的 MapReduce v1 框架。 **1. 重新设计的理念:** - **解决 MapReduce v1 的局限性:** 原始的 MapReduce 设计仅限于支持 Map 和 Reduce 这两种操作,这限制...

    Hadoop Reduce Join及基于MRV2 API 重写

    MRV2,也称为YARN(Yet Another Resource Negotiator),是Hadoop 2.x引入的新一代MapReduce框架,旨在提高资源管理和应用程序的灵活性。在MRV2中,MapReduce任务被分解为两个独立的组件:ApplicationMaster和...

    09丨为什么我们管Yarn叫作资源调度框架?.html

    09丨为什么我们管Yarn叫作资源调度框架?.html

    yarn 1.6 WIN安装文件

    - 安装依赖:使用`yarn add [package]`命令安装新的npm包,例如`yarn add express`将安装Express框架。 - 更新依赖:如果需要更新某个包,可以使用`yarn upgrade [package]`命令。 - 移除依赖:使用`yarn remove ...

    Hadoop YARN 基本架构和发展趋势 - d.pdf

    Hadoop YARN(Yet Another Resource Negotiator)是Apache Hadoop项目中的一个核心组件,它的设计目标是解决早期Hadoop 1.x版本中MapReduce(MRv1)存在的问题,包括扩展性限制、单点故障以及对其他计算框架支持不足...

Global site tag (gtag.js) - Google Analytics