在使用 Flink 的生产实践中,我们发现采用 Flink on YARN 的部署方式时,将大量用户依赖的 JAR 包和其他文件上传到对应的容器中是从用户发送部署请求到应用实际运行起来的重要耗时操作。其中,不少文件例如 Flink 框架本身的依赖对于每个应用来说都是一样的,如果能采用一个统一的缓存将会显著减少所需上传的文件大小;此外,许多用户依赖的 JAR 包只在运行时需要,而这些依赖可能本身是存储在 YARN 集群上的,在提交之前先将依赖拉取下来再上传上去将会带来额外无谓的开销。本文首先介绍 YARN 上资源本地化的基础知识,随后介绍利用这一技术减少 Flink 在 YARN 上部署时间的几个具体工作

YARN 上的资源本地化

关于 YARN 上的资源本地化,Cloudera 的这篇文章是个很好的介绍,本节内容基本是链接文章的一个翻译和简单的演绎。

YARN 上的资源本地化主要涉及以下几个概念

  • 本地化(Localization) - 本地化是一个将远端资源下载或复制到本地文件系统的过程,通过本地化的过程,在访问文件时就不再需要每次都从远端拉资源,只需要读取本地的资源
  • 本地资源(LocalResource) - 本地资源代表运行一个容器所需的文件或者库。NodeManager 会负责在启动容器之前先本地化所需的资源。对于每个本地资源,应用可以指定资源的以下属性
  • URL - 下载资源所需的远端地址
  • 大小(Size) - 本地资源的大小,以字节(Byte)为单位
  • 资源在远端文件系统上创建时的时间戳
  • 本地资源类型(LocalResourceType) - 指定 NodeManager 本地化的资源的类型,包括 FILE、ARCHIVE 和 PATTERN
  • 模式(Pattern) - 解析文件的模式(仅当本地资源类型为 PATTERN 是有效)
  • 本地资源可见性(LocalResourceVisibility) - 指定 NodeManager 本地化的资源的可见性,包括 PUBLIC、PRIVATE 和 APPLICATION
  • 资源本地化服务(ResourceLocalizationService) - NodeManager 中负责本地化的服务
  • 删除服务(DeletionService) - NodeManager 中负责接受请求并删除本地路径的服务
  • 本地化器(Localizer) - 实际进行本地化的线程或进程。本地化器有两种类型,为 PUBLIC 资源进行本地化的 PublicLocalizer 以及为 PRIVATE 和 APPLICATION 资源进行本地化的 ContainerLocalizers
  • 本地缓存(LocalCache) - NodeManager 管理并维护了好几种本地缓存,这些缓存包括了所有下载下来的文件。其中的资源由被拉取时指定的远端 URL 唯一确定

YARN 上的资源本地化的运行过程根据不同的本地资源类型有所不同,我们在 Flink 的优化中采用不同的本地资源类型进行不同方向的优化

PUBLIC 资源的本地化相关流程如下

  • PublicLocalizers 运行在 NodeManager 的地址空间中
  • PublicLocalizers 线程的数量由配置项 yarn.nodemanager.localizer.fetch.thread-count 指定,这是下载 PUBLIC 资源是的最大并行度
  • 本地化 PULBIC 资源时,本地化器会校验所有需要的资源在远端文件系统上有正确的权限,不满足这个条件的资源将被拒绝本地化
  • PublicLocalizer 采用 ContainerLaunchContext 中配置的证书拉取资源以保证访问远端文件系统时的安全性需求

PRIVATE/APPLICATON 资源的本地化相关流程如下

  • ContainerLocalizer 运行在一个隔离进程当中,即和 NodeManager 运行在不同线程当中
  • 每个 ContainerLocalizer 进程都由 NodeManager 中的一个线程管理,称之为 LocalizerRunner。每个容器在启动时,如果发现有任何还没下载的资源,就会启动一个 LocalizerRunner
  • 同时,本地化的过程还会包括一个称为 LocalResourcesTracker 的对象。这个对象对应一个用户或者一个应用,会记录所有对应用户或应用的本地资源
  • 当容器第一次请求 PRIVATE/APPLICATION 资源时,如果资源在 LocalResourcesTracker 上没找到(或者出于 INITIALIZED 状态),这个资源就会被加入到 pending-resources 列表上。根据是否需要下载资源,LocalizerRunner 将按需创建
  • 具体本地化的过程如下
  • 在容器启动时,ContainerLocalizer 建立起和 NodeManager 之间的心跳
  • 每次心跳,LocalizerRunner 选择向 ContainerLocalizer 请求本地化一份资源或者通知它关闭;ContainerLocalizer 向 LocalizerRunner 汇报资源下载的状态
  • 如果资源下载失败,那么这个资源将从 LocalResourcesTracker 中被移除并最终被标记为本地化失败。一旦下载失败,LocalizerRunners 将关闭 ContainerLocalizer 后退出
  • 如果资源下载成功,LocalizerRunner 会向 ContainerLocalizer 不断地提出新的下载请求,直到所有资源都成功下载

资源本地化之后,根据本地资源类型的不同将会被下载到不同的目录

  • PUBLIC <local-dir>/filecache
  • PRIVATE <local-dir>/usercache//filecache
  • APPLICATION <local-dir>/usercache//appcache/<app-id>/

Flink 在 YARN 上的部署开销的优化

支持直接指定远端资源为作业依赖

某些运行时依赖本身就在 YARN 集群上作为公共资源存在,我们可以在部署之前通过设置 YARN 的 LocalResource 指定远端 URL 等属性,在应用启动时直接从 YARN 上拉取资源。这样我们可以省去目前 Flink 流程中先将资源下载到本地之后再上传到 YARN 上的临时目录的开销,同时减少了退出时清理临时目录下资源的开销

对于某些公共依赖,我们甚至可以在此之上将资源指定为 PUBLIC 类型的。这样,YARN 在本地化的时候会将资源保存到 <local-dir>/filecache 目录下,对于这个 NodeManager 上的所有 Application 都能共享这份材料。此后,对于新的应用,我们仍然指定本地化资源,但是从 YARN 的角度则只会在 appcache 中简单地建立一个到 filecache 的软连接。通过这种方式我们能进一步减少不同 Application 下载公共依赖的开销

支持指定远端的 Flink 框架 JAR 包

思路和上面的类似,只是 Flink 框架 JAR 包作为必选项需要单独处理,同时有 classpath 组装的问题,不好直接放进作业依赖的加载里。目前 Flink 只支持本地文件系统的 Flink 框架 JAR 包,这是一个实现上没啥道理的限制。直接解开这个限制并在 Flink 框架 JAR 为远端资源时(通过 scheme 判断)指定 LocalResource 而不是拉取并上传

其他和 YARN 本地化相关的优化,包括目前发布的 Flink 版本会在 TM 上部署一份专门的配置文件,这是由于 TM 的配置根据运行时信息和 JM 上的配置文件有出入。但是这部分的差别并不大,社区近期的修改将差别编码到 dynamicPropoties 中,即一个字符串,随容器启动。这样可以减少部署配置文件的开销

ideal 本地jar依赖_通过 YARN 的资源本地化技术减少 Flink 在 YARN 上的部署时间相关推荐

  1. 60-124-340-源码-运行模式-Yarn-通过 YARN 的资源本地化技术减少 Flink 在 YARN 上的部署时间

    1.美图 2.概述 在使用 Flink 的生产实践中,我们发现采用 Flink on YARN 的部署方式时,将大量用户依赖的 JAR 包和其他文件上传到对应的容器中是从用户发送部署请求到应用实际运行 ...

  2. eclipemaven本地仓库依赖_【Maven】解决本地jar依赖

    背景 最近有一个非常古老的JavaEE项目(外包公司给做的,我都想放弃了),使用Maven管理的.突然有一天,同事在本地运行时,发现下载依赖慢如蜗牛,究竟是什么东东在作祟呢?让我一一道来. 抽丝剥茧 ...

  3. eclipemaven本地仓库依赖_只用一招,让你Maven依赖下载速度快如闪电

    一.背景 众所周知,Maven对于依赖的管理让我们程序员感觉爽的不要不要的,但是由于这货是国外出的,所以在我们从中央仓库下载依赖的时候,速度如蜗牛一般,让人不能忍,并且这也是大多数程序员都会遇到的问题 ...

  4. outlook本地存储设置_商务文档为什么要存储在OneDrive for business 上?

    近两年培训了N多场次office 365培训,对于培训过的客户而言,OneDrive for business有的用的很好很熟练:有的用户真不是很情愿用:更有很多用户搞不清楚我的文档在本地好好的文档随 ...

  5. flink on yarn集群搭建

    环境需求 CentOS7.5.1804.jdk1.8.0_181.zookeeper3.6.2.hadoop3.2.2.flink1.12.2 关于hadoop的安装细节请查看<hadoop3. ...

  6. Flink on yarn 集群HA 配置

    1. HA 集群环境规划     flink on yarn 的HA 其实是利用yarn 自己的恢复机制.在这需要用到zk,主要是因为虽然flink-on-yarn cluster HA 依赖于Yar ...

  7. SpringBoot项目依赖本地jar包

    1.问题来源 我们在搭建项目时,常常需要用到本地jar包,相信大家在网上找到很多maven依赖本地jar包的写法,也很成功的启动了.但是,我们将项目打成jar包或者war包部署到服务器上启动时可能就会 ...

  8. java配置pom安装依赖包,Maven pom.xml 添加本地jar包依赖以及打包方法

    Maven项目打包时,如果遇到需要添加本地jar包依赖的时候,可以选择两种方法: 1. 安装到本地仓库 第一种方法比较常规,适用于需要添加的jar包也是由maven项目导出,含有pom文件的时候.只需 ...

  9. eclipse手动pom本地包_(转)如何在maven的pom.xml中添加本地jar包

    1 maven本地仓库认识 maven本地仓库中的jar目录一般分为三层:图中的1 2 3分别如下所示: 1 groupId 2 artifactId 3 version 4 jar包的依赖 如果要将 ...

最新文章

  1. 张高兴的 UWP 开发笔记:横向 ListView
  2. jsp中静态include和动态include的区别
  3. jQuery Mobile数据属性
  4. 《Head First Python》第四章--持久存储
  5. 如何找到status group里定义的所有status value
  6. C++ 创建文件夹的四种方式
  7. 在新的固态硬盘只装ubuntu16.04系统,重启后无启动项解决方案
  8. CMS模板引擎:XHtmlAction
  9. 十二 Spring的AOP开发入门,整合Junit单元测试(AspectJ的XML方式)
  10. 有关UITableviewCell 重用内存 内部解析
  11. ANSI C和Glib C区别(二)
  12. 能打开2D、3D图文件的小工具abviewer
  13. 阿里 delphi java_DelphiCodeToDoc--像JavaDoc一样的Delphi源码文档生成工具
  14. 高德地图web服务api反坐标查询/逆地理编码
  15. netbean java_netbean 生成 Java 桌面数据库应用程序
  16. 加入域的计算机如何本地用户登录,关于本地缓存登陆和域用户将计算机加入域的问题(转)...
  17. 基于Fuzzy Logic的人群疏散模型(考虑攻击者的情况)
  18. 第一章 如何学习单片机
  19. Python123 货币转换Ⅰ
  20. Tableau——方向图标的应用

热门文章

  1. 矩阵乘法的本质(线性空间篇,知乎:马同学)
  2. ubuntu下安装MySQL8.0
  3. ios捕捉键盘view
  4. cocos编译java时改变使用的javac的版本
  5. 大数据之-Hadoop3.x_Yarn_公平调度器---大数据之hadoop3.x工作笔记0146
  6. axios_的请求响应结果的结构---axios工作笔记006
  7. k8s集群部署项目_容器交付流程介绍---K8S_Google工作笔记0059
  8. python数据结构剑指offer-反转链表
  9. ibatis 如何直接执行sql语句
  10. win下mysql数据库双机配置_[数据库]windows下使用mysql双机热备功能