【深入浅出 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日

相关文章

  • SpringBoot+MyBatis实现登录案例

    下面我就详细讲解一下“SpringBoot+MyBatis实现登录案例”的完整攻略。 准备工作 首先,我们需要准备好以下工具和环境: Java开发环境(推荐使用Java 8或以上版本) Maven项目管理工具 IDEA或Eclipse集成开发环境 MySQL数据库 创建Maven工程 使用IDEA或Eclipse创建一个Maven工程,项目结构如下: pro…

    Java 2023年5月20日
    00
  • 浅谈Maven Wrapper

    关于如何使用 Maven Wrapper,我这里提供一份完整攻略,包含以下内容: 什么是 Maven Wrapper Maven Wrapper 是 Maven 内置的一个小型 Maven 版本管理工具,是 Maven 3.5.0 版本中引入的新特性。它的主要作用是帮助使用者对 Maven 进行版本控制,防止出现版本不一致的问题。使用 Maven Wrapp…

    Java 2023年6月2日
    00
  • SpringBoot自动配置与启动流程详细分析

    下面是SpringBoot自动配置与启动流程的详细分析。 1. SpringBoot自动配置流程 1.1 前置知识 在了解SpringBoot自动配置流程之前,需要掌握以下几个核心概念: Spring Framework:Spring Framework是一款非常流行的Java企业级应用开发框架,提供了众多优秀的特性和类库。SpringBoot是在Sprin…

    Java 2023年5月15日
    00
  • java实现电话本系统

    Java实现电话本系统攻略 1. 系统概述 Java实现电话本系统,是指使用Java编程语言和相关的开发框架实现一个方便用户管理联系人信息的系统。系统的目标是支持联系人的增删改查、分组管理、导入导出、备份恢复等功能。具体而言,系统将包括以下模块: 用户登录和注册:为用户提供账号管理功能,增强系统的安全性; 联系人管理:用户可以查看、添加、删除、修改联系人的信…

    Java 2023年5月19日
    00
  • Java新手环境搭建 JDK8安装配置教程

    Java新手环境搭建 JDK8安装配置教程 为了学习和开发Java程序,需要安装和配置Java Development Kit(JDK)。在本文中,将介绍如何在Windows操作系统上安装和配置JDK 8,并配置环境变量。 步骤1: 下载JDK8 首先,需要从Oracle官方网站下载适合的JDK8版本。可以从以下链接下载JDK8文件: JDK8官方下载页面 …

    Java 2023年5月24日
    00
  • SpringBoot+Security 发送短信验证码的实现

    下面详细讲解 Spring Boot 和 Spring Security 实现发送短信验证码的完整攻略 1. 简介 Spring Boot 是一个快速开发和方便配置的 Java Web 开发框架。它可以帮助开发人员快速构建可部署的、生产级别的、面向互联网的应用程序。 Spring Security 是用于保护 Java Web 应用程序的框架。它可以保护 W…

    Java 2023年5月20日
    00
  • Java深入浅出理解快速排序以及优化方式

    Java深入浅出理解快速排序以及优化方式 快速排序简介 快速排序是一种常用的排序算法,它的基本思想是选定一个基准数,通过递归的方式将比基准数小的值放在其左侧,比基准数大的值放在其右侧,最终达到排序的效果。快速排序的时间复杂度为O(nlogn),是一种比较快速有效的排序算法。 快速排序基本流程 选择一个基准数,例如选定数组的最后一个元素作为基准数; 遍历数组,…

    Java 2023年5月19日
    00
  • 微信小程序微信登录的实现方法详解(JAVA后台)

    下面是详细的攻略: 背景介绍 微信小程序微信登录是指用户可以通过微信账号快速登录小程序,无需再次注册账号。实现微信登录的关键在于后台服务器实现微信的登录认证功能。本文将详细讲解如何在Java后台实现微信登录的功能。 实现方法 实现微信登录功能的具体步骤如下: 1.前端页面添加微信登录按钮 <button type="primary"…

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