深入理解Hadoop YARN中的Container概念

2023-11-09

在学习Hadoop  YARN—Hadoop 2.0新引入的通用资源管理系统过程中,总会遇到Container这一概念,由于中文资料的缺乏,很多人对Container这一概念仍非常的模糊。它与Linux Container是什么关系,它是否能像Linux Container那样为任务提供一个隔离环境?它代表计算资源,还是仅仅是一个任务处理进程?本文将尝试介绍Container这一概念。

在学习Container之前,大家应先了解YARN的基本架构、工作流程。比如,大家应该了解一个应用程序的运行过程如下:

步骤1:用户将应用程序提交到ResourceManager上;

步骤2:ResourceManager为应用程序ApplicationMaster申请资源,并与某个NodeManager通信,以启动ApplicationMaster;

步骤3:ApplicationMaster与ResourceManager通信,为内部要执行的任务申请资源,一旦得到资源后,将于NodeManager通信,以启动对应的任务。

步骤4:所有任务运行完成后,ApplicationMaster向ResourceManager注销,整个应用程序运行结束。

上述步骤中,步骤2~3涉及到资源申请与使用,而这正是Container出现的地方。

如果你你还不了解YARN的基本架构和工作原理,可阅读我的以下几篇文章:

YARN基本架构YARN中的基本术语YARN整套分析文章

在YARN中,ResourceManager中包含一个插拔式的组件:资源调度器,它负责资源的管理和调度,是YARN中最核心的组件之一。

当向资源调度器申请资源,需向它发送一个ResourceRequest列表,其中,每个ResourceRequest描述了一个资源单元的详细需求,而资源调度器则为之返回分配到的资源描述Container。每个ResourceRequest可看做一个可序列化Java对象,包含的字段信息(直接给出了Protocol Buffers定义)如下:

message ResourceRequestProto {

optional PriorityProto priority = 1; // 资源优先级

optional string resource_name = 2; // 资源名称(期望资源所在的host、rack名称等)

optional ResourceProto capability = 3; // 资源量(仅支持CPU和内存两种资源)

optional int32 num_containers = 4; // 满足以上条件的资源个数

optional bool relax_locality = 5 [default = true];  //是否支持本地性松弛(2.1.0-beta之后的版本新增加的,具体参考我的这篇文章:Hadoop新特性、改进、优化和Bug分析系列3:YARN-392

}

从上面定义可以看出,可以为应用程序申请任意大小的资源量(CPU和内存),且默认情况下资源是本地性松弛的,即申请优先级为10,资源名称为“node11”,资源量为<2GB, 1cpu>的5份资源时,如果节点node11上没有满足要求的资源,则优先找node11同一机架上其他节点上满足要求的资源,如果仍找不到,则找其他机架上的资源。而如果你一定要node11上的节点,则将relax_locality置为false。

发出资源请求后,资源调度器并不会立马为它返回满足要求的资源,而需要应用程序的ApplicationMaster不断与ResourceManager通信,探测分配到的资源,并拉去过来使用。一旦分配到资源后,ApplicatioMaster可从资源调度器那获取以Container表示的资源,Container可看做一个可序列化Java对象,包含的字段信息(直接给出了Protocol Buffers定义)如下:

message ContainerProto {

optional ContainerIdProto id = 1; //container id

optional NodeIdProto nodeId = 2; //container(资源)所在节点

optional string node_http_address = 3;

optional ResourceProto resource = 4; //container资源量

optional PriorityProto priority = 5; //container优先级

optional hadoop.common.TokenProto container_token = 6; //container token,用于安全认证

}

一般而言,每个Container可用于运行一个任务。ApplicationMaster收到一个或多个Container后,再次将该Container进一步分配给内部的某个任务,一旦确定该任务后,ApplicationMaster需将该任务运行环境(包含运行命令、环境变量、依赖的外部文件等)连同Container中的资源信息封装到ContainerLaunchContext对象中,进而与对应的NodeManager通信,以启动该任务。ContainerLaunchContext包含的字段信息(直接给出了Protocol Buffers定义)如下:

message ContainerLaunchContextProto {

repeated StringLocalResourceMapProto localResources = 1; //Container启动以来的外部资源

optional bytes tokens = 2;

repeated StringBytesMapProto service_data = 3;

repeated StringStringMapProto environment = 4; //Container启动所需的环境变量

repeated string command = 5; //Container内部运行的任务启动命令,如果是MapReduce的话,Map/Reduce Task启动命令就在该字段中

repeated ApplicationACLMapProto application_ACLs = 6;

}

每个ContainerLaunchContext和对应的Container信息(被封装到了ContainerToken中)将再次被封装到StartContainerRequest中,也就是说,ApplicationMaster最终发送给NodeManager的是StartContainerRequest,每个StartContainerRequest对应一个Container和任务。

总结上述可知,Container的一些基本概念和工作流程如下:

(1)  Container是YARN中资源的抽象,它封装了某个节点上一定量的资源(CPU和内存两类资源)。它跟Linux Container没有任何关系,仅仅是YARN提出的一个概念(从实现上看,可看做一个可序列化/反序列化的Java类)。

(2)  Container由ApplicationMaster向ResourceManager申请的,由ResouceManager中的资源调度器异步分配给ApplicationMaster

(3) Container的运行是由ApplicationMaster向资源所在的NodeManager发起的,Container运行时需提供内部执行的任务命令(可以使任何命令,比如java、Python、C++进程启动命令均可)以及该命令执行所需的环境变量和外部资源(比如词典文件、可执行文件、jar包等)。

另外,一个应用程序所需的Container分为两大类,如下:

(1) 运行ApplicationMaster的Container:这是由ResourceManager(向内部的资源调度器)申请和启动的,用户提交应用程序时,可指定唯一的ApplicationMaster所需的资源;

(2) 运行各类任务的Container:这是由ApplicationMaster向ResourceManager申请的,并由ApplicationMaster与NodeManager通信以启动之。

以上两类Container可能在任意节点上,它们的位置通常而言是随机的,即ApplicationMaster可能与它管理的任务运行在一个节点上。

Container是YARN中最重要的概念之一,懂得该概念对于理解YARN的资源模型至关重要,希望本文对学习Container这一概念有所帮助。


Ref:  http://dongxicheng.org/mapreduce-nextgen/understand-yarn-container-concept/

more: http://hadoop.apache.org/docs/r2.0.2-alpha/hadoop-yarn/hadoop-yarn-site/YARN.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解Hadoop YARN中的Container概念 的相关文章

随机推荐

  • LVGL v7 使用心得及工具分享

    1 v7与v8的区别 对于v7来说 并没有v8优化的那么全面和完善 有些好用的功能在v7中也并未实现 但这并不代表v7就不好 在稳定性和兼容性这方面v7做的比v8好很多 虽然现在大多数都能上v8 其次v7与v8是两个大版本变动 很多API都
  • SQLServer与MySQL的一些常用操作加字段、修改字段、重置自增ID

    SQLServer与MySQL的一些常用操作 总结一些SQLServer与MySQL的一些常用操作 添加字段 修改字段 重置自增ID 添加字段 SQLServer 在SQLServer中 我们可以使用ALTER TABLE命令来添加表字段
  • UE4 禁用引擎Runtime模式下的引擎内置按键

    本文内容主要讲解在开发过程中 不想用引擎自带的按键如何禁用它 这些按键类似于一个快捷键工具例如F1 F5之类的按键 但最终打包成发行版的项目会自动禁用这些按键 所以不用担心用户会误触这些按键 1 找到引擎目录下的BaseInput ini文
  • sql中的coalesce函数

    COALESCE函数是一个SQL中的标准函数 它用于返回多个表达式中的第一个非NULL值 它的通常用途是在查询中提供默认值以避免NULL值 COALESCE函数的语法如下 COALESCE expression1 expression2 e
  • Elementui的select怎么获取选中的对象

    今天在开发中碰到了这样一个问题 平常使用select只是获取到他的值就可以了 突然需要获取选中的对象 倒是一下有些无从下手 也看了一些别人的文章 基本都没有很清晰的指出方法 我在这里做一个备注
  • 网站服务器速度快取决于,建站经验 网站打开速度快慢的因素

    判断一个网站打开速度快或者是慢主要取决于以下一些因素 一 网页内容的大小 网页内容所包括的文本 产品的图片 静态的 动态的 视频 flash文件等 这里涉及到浏览器的原理 浏览器的技术原理就是将网页下载到客户本地缓存 然后通过浏览器解析源码
  • 网易2018校园招聘编程题真题集合 (部分)

    第一题 小易准备去魔法王国采购魔法神器 购买魔法神器需要使用魔法币 但是小易现在一枚魔法币都没有 但是小易有两台魔法机器可以通过投入x x可以为0 个魔法币产生更多的魔法币 魔法机器1 如果投入x个魔法币 魔法机器会将其变为2x 1个魔法币
  • hive报metadata.HiveException: Hive Runtime Error while processing row (tag=0)错误

    今天跑一条统计的SQL出现Caused by org apache hadoop hive ql metadata HiveException Hive Runtime Error while processing row tag 0 ke
  • android -------- AES加密解密算法

    AES加密标准又称为高级加密标准Rijndael加密法 是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准 AES的基本要求是 采用对称分组密码体制 密钥长度可以为128 192或256位 分组长度128位 算法应易在各种硬
  • HTML5边玩边学(8):俄罗斯方块就是这么简单 之 数据模型篇

    HTML5边玩边学 8 俄罗斯方块就是这么简单 之 数据模型篇 特别提示 本文中的运行效果需要 Chrome 浏览器或者 Firefox 浏览器 一 从数据出发还是从界面出发 要写一个俄罗斯方块小游戏 我们先来一块考虑一下下面几个问题 1
  • 【运算符重载】日期类实战篇

    学习导航 一 任务清单 二 基本原则 三 功能实现 构造函数 两个对象间比大小 日期对象加减天数 1 加减运算符的重载 2 运算符的重载 3 与 之间的复用 4 前置 与后置加加 两个对象之间的日期差 流插入与流提取运算符的重载 一 任务清
  • 将 debian 安装到 虚拟机中,不需要官方虚拟 tools 的简单办法 (****)

    目录 将 debian 安装到 虚拟机中 不需要官方虚拟 tools 的简单办法 原版 衍生版 debian mxlinux 的一些区别 https blog csdn net ken2232 article details 1325311
  • 国产文档处理控件Spire.Doc WPS Word文档功能上线!快速创建Word指南

    Spire Doc for Java 是一款专业的Java Word组件 开发人员使用它可以轻松地将Word文档创建 读取 编辑 转换和打印等功能集成到自己的Java应用程序中 本文将介绍如何使用Spire Doc for Java加载 操
  • c语言宏定义放置位置,c语言宏定义详解

    1 防止一个头文件被重复包含 ifndefCOMDEF H define COMDEF H 头文件内容 endif2 重新定义一些类型 防止由于各种平台和编译器的不同 而产生的类型字节数 差异 方便移植 typedef unsigned c
  • 使用quagga/zebra的OSPF实验

    报错处理案例 下面是启动zebra的异常 启动ospf的异常也以同样的方式处理 注意 将下面的zebra换乘ospf即可 可进入相应文件夹下查看文件具体名称 Ubuntu下安装Wireshark 添加wireshark的源 sudo apt
  • PFC电路

    一 前言 PFC分无源和有源 无源PFC 也称被动式PFC 有源PFC 也称主动式PFC 无源PFC一般采用电感补偿方法使交流输入的基波电流与电压之间相位差减小来提高功率因数 但无源PFC的功率因数不是很高 只能达到0 7 0 8 有源PF
  • 蓝桥杯真题——组素数——python解析

    素数就是不能再进行等分的数 比如 2 3 5 7 11 等 9 3 3 说明它可以3等分 因而不是素数 我们国家在1949年建国 如果只给你 1 9 4 9 这4个数字卡片 可以随意摆放它们的先后顺序 但卡片不能倒着摆放啊 我们不是在脑筋急
  • 使用JSP完成cookie记住用户名和密码

    2019 10 11 JSP笔记 使用JSP完成cookie记住用户名密码
  • 布局资源(layout)的简单使用

    随时随地阅读更多技术实战干货 获取项目源码 学习资料 请关注源代码社区公众号 ydmsq666 布局资源是Android中最常用的一种资源 Android可以将屏幕中组件的布局方式定义在一个XML中 这有点像Web开发中的HTML页面 我们
  • 深入理解Hadoop YARN中的Container概念

    在学习Hadoop YARN Hadoop 2 0新引入的通用资源管理系统过程中 总会遇到Container这一概念 由于中文资料的缺乏 很多人对Container这一概念仍非常的模糊 它与Linux Container是什么关系 它是否能