【深入浅出 Yarn 架构与实现】6-3 NodeManager 分布式缓存

不要跳过这部分知识,对了解 NodeManager 本地目录结构,和熟悉 Container 启动流程有帮助。

一、分布式缓存介绍

主要作用就是将用户应用程序执行时,所需的外部文件资源下载缓存到各个节点。
YARN 分布式缓存工作流程如下:

  1. 客户端将应用程序所需的文件资源 (外部字典、JAR 包、二进制文件) 提交到 HDFS 上。
  2. 客户端将应用程序提交到 RM 上。
  3. RM 将与某个 NM 进行通信,启动应用程序 AM,NM 收到命令后,首先从 HDFS 上下载文件 (缓存),然后启动 AM。
  4. AM 与 RM 通信,以请求和获取计算资源。
  5. AM 收到新分配到的计算资源后,与对应的 NM 通信,以启动任务。
  6. 如果应用程序第一次在该节点上启动任务,NM 首先从 HDFS 上下载文件缓存到本地,然后启动任务。
  7. NM 后续收到启动任务请求后,如果文件已在本地缓存,则直接执行任务,否则等待文件缓存完成后再启动。
  8. 各个节点上的缓存文件由对应的 NM 管理和维护。在 Hadoop 中,分布式缓存并不是将文件缓存到集群中各个节点的内存中,而是将文件缓存到各个节点的磁盘上,以便执行任务时直接从磁盘上读取文件。

image.png

二、特性介绍

一)资源可见性和分类

分布式缓存机制是由各个 NM 实现的,主要功能是将应用程序所需的文件资源缓存到本地,以便后续任务的使用。
资源缓存是使用时触发的,也就是第一个用到该资源的任务触发。后续任务无需再进行缓存,直接使用即可。
根据可见性,NM将资源分为三类:

  • Public:节点上所有的用户都可以共享该资源,只要有一个用户的应用程序将着这些资源缓存到本地,其他所有用户的所有应用程序都可以使用;
  • Private:节点上同一用户的所有应用程序共享该资源,只要该用户其中一个应用程序将资源缓存到本地,该用户的所有应用程序都可以使用;
  • Application:节点上同一应用程序的所有Container共享该资源。

YARN是通过比较 resource、type、timestamp 和 pattern四个字段是否相同来判断两个资源请求是否相同的。如果一个已经被缓存到各个节点上的文件被用户修改了,则下次使用时会自动触发一次缓存更新,以重新从HDFS上下载文件。
分布式缓存完成的主要功能是文件下载,涉及大量的磁盘读写,因此整个过程采用了异步并发模型加快文件下载速度,以避免同步模型带来的性能开销。

二)分布式缓存实现

NodeManager 采用轮询的分配策略将这三类资源存放在 yarn.nodemanager.local-dirs 指定的目录列表中,在每个目录中,资源按照以下方式存放:

  • PUBLIC 资源:存放在 ${yarn.nodemanager.local-dirs}/filecache/ 目录下,每个资源将单独存放在以一个随机整数命名的目录中,且目录的访问权限均为 0755。
  • PRIVATE 资源:存放在 ${yarn.nodemanager.local-dirs}/usercache/${user}/filecache/ 目录下,每个资源将单独存放在以一个随机整数命名的目录中,且目录的访问权限均为 0710。
  • APPLICATION 资源:存放在 ${yarn.nodemanager.local-dirs}/usercache/${user}/${appcache}/${appid}/filecache/ 目录下,每个资源将单独存放在以一个随机整数命名的目录中,且目录的访问权限均为 0710。

其中 Container 的工作目录位于 ${yarn.nodemanager.local-dirs}/usercache/${user}/${appcache}/${appid}/${containerid} 目录下,其主要保存 jar 包文件、字典文件对应的软链接。
目录结构如下所示:

./nm-local-dir/
|-- filecache		// PUBLIC资源
|   `-- 10			// 每个资源将单独存放在以一个随机整数命名的目录中
|-- nmPrivate
|   |-- application_xxxx_xxx
|   |   |-- container_xxx_xxx_xxx_xx_xxxx
|   |   |-- container_xxx_xxx_xxx_xx_xxxx	// 私有目录数据(执行脚本、token文件、pid文件)
|   |   |   |-- container_xxx_xxx_xxx_xx_xxxx.pid
|   |   |   |-- container_xxx_xxx_xxx_xx_xxxx.tokens
|   |   |   `-- launch_container.sh
|   |-- application_xxxx_xxx
|   `-- application_xxxx_xxx
`-- usercache
    |-- userXxx
    |   |-- appcache		// APPLICATION资源
    |   `-- filecache		// PRIVATE资源
    |-- userXxx
    |   |-- appcache
    |   `-- filecache

image.png

三、清理策略

1、Container 运行结束清理
2、清理过期缓存
NodeManager 为了避免缓存的文件过多导致磁盘「撑爆」,其会定期清理过期的缓存文件,具体方法如下:

  • 每隔一定时间 yarn.nodemanager.localizer.cache.cleanup.interval-ms(单位是毫秒,默认值是 10×60×1000,即 10 分钟)启动一次清理工作,确保每个缓存目录中文件容量小于 yarn.nodemanager.localizer.cache.target-size-mb(单位是 MB,默认是 10240,即 10GB)
  • 如果超过该值,则采用 LRU(Least Recently Used)算法清除已不再使用的缓存文件,直至文件容量低于设定值。

四、小结

本篇介绍了 NodeManager 分布式缓存,当你需要看 NM 本地目录,需要了解各目录中存储内容时,本篇提供了对应的帮助。同时也对 Container 启动流程做了简要的讲解,对后面了解 Container 生命周期提供了一定的前置知识。

原文链接:https://www.cnblogs.com/shuofxz/p/17383011.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【深入浅出 Yarn 架构与实现】6-3 NodeManager 分布式缓存 - Python技术站

(0)
上一篇 2023年5月8日
下一篇 2023年5月8日

相关文章

  • 使用AngularJS来实现HTML页面嵌套的方法

    使用AngularJS来实现HTML页面嵌套是AngularJS的基本用法之一。下面是实现过程的完整攻略。 环境配置 首先需要准备好配置AngularJS的环境。可以通过以下步骤在本地搭建环境: 下载并安装nodejs环境; 利用npm命令安装angularjs,命令为:npm install angular; 嵌套HTML页面 1. 创建HTML页面 首先…

    Java 2023年6月15日
    00
  • 关于jsp版ueditor1.2.5的部分问题解决(上传图片失败)

    关于jsp版ueditor1.2.5的部分问题解决(上传图片失败)攻略可以按照以下步骤进行: 1. 修改配置文件 打开ueditor.config.js文件,将serverUrl修改为你后端处理上传请求的路径。例如: window.UEDITOR_CONFIG = { …, serverUrl: ‘uploadImage.jsp’ } 其中,upload…

    Java 2023年5月20日
    00
  • Java实现的简单掷骰子游戏示例

    Java实现的简单掷骰子游戏示例 概述 本篇攻略是介绍如何使用Java语言实现一个简单的掷骰子游戏。在游戏中,玩家通过投掷骰子来获得随机的点数,点数越高则胜率越大。游戏规则简单,适合初学者进行练手。 实现步骤 创建一个名为Dice的类,该类代表一个骰子,有如下属性: 点数:int类型,用来存储掷出骰子的点数; 面数:int类型,用来存储骰子的面数。 在Dic…

    Java 2023年5月18日
    00
  • java之使用stream对日期排序方式

    下面是对Java中使用Stream对日期排序的攻略。 1. 准备数据 在讲解如何使用Stream对日期排序之前,我们需要准备一些数据。假设我们有一个List集合,其中包含多个日期对象。如下所示: List<LocalDate> dates = Arrays.asList( LocalDate.of(2021, 8, 1), LocalDate.o…

    Java 2023年5月20日
    00
  • java用户管理注册功能 含前后台代码

    下面是Java用户管理注册功能的完整攻略。 1. 前期准备 在编写Java用户管理注册功能的程序前,我们需要准备以下几个方面的内容:数据库、Java Web框架和IDE。 1.1 数据库 Java用户管理与注册功能需要使用到数据库进行用户信息存储。常用的数据库有MySQL、Oracle、SQL Server等。在本教程中,我们使用MySQL数据库。 我们需要…

    Java 2023年5月19日
    00
  • MySQL五步走JDBC编程全解读

    MySQL五步走JDBC编程全解读是一篇介绍如何使用Java连接MySQL数据库的文章。全文分为5个步骤,包括加载驱动、创建连接、创建语句、执行语句和处理结果集。下面将详细讲解每一步的操作流程和注意事项。 1. 加载驱动 在使用JDBC访问MySQL之前,需要先导入MySQL的驱动。MySQL提供了JDBC驱动包,我们可以从官网或Maven仓库中下载相应的驱…

    Java 2023年5月20日
    00
  • java中封装的实现方法详解

    Java中封装的实现方法详解 1. 什么是Java中的封装 封装是面向对象编程的三大特征之一,它指的是将数据和方法封装在一个类中,隐藏类的具体实现细节,只向外部暴露必要的接口,来保证程序的安全性、健壮性和可维护性。封装的实现可以通过访问控制修饰符、Getter/Setter方法等方式来进行。 2. Java中使用访问控制修饰符实现封装 访问控制修饰符包括pu…

    Java 2023年5月18日
    00
  • spring-spring容器中bean知识点总结

    Spring 容器中 Bean 知识点总结 Spring 是一个开源的框架,它解决了企业级应用中复杂性规模的问题。其中最常用的就是 Spring 容器中的 Bean,本文将详细讲解 Spring 容器中 Bean 的知识点总结。 什么是 Spring 容器? Spring 容器是一个管理 Bean 的运行环境,它负责创建 Bean 对象、配置 Bean 属性…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部