flink架构设计与运行流程剖析

一、架构设计

架构设计

 

 

各层及相关术语说明

  • 物理层
    • 解决flink的部署模式的问题
    • 支持多种部署模式:本地,集群,云及k8s
    • 用户可以根据不同的场景选择不同的部署模式
  • 核心层
    • 是flink的核心实现层,负责为上层的接口提供服务
    • Runtime
      • flink的核心计算
    • Optimizer
      • 负责任务的优化
    • Stream Buider
      • 负责对任务进行DAG优化
  • API层
    • 面向用户,负责更好的用户开发体验
    • 提供了流计算和批处理的接口,同时在这个基础上又开发了不同的组件库
      • 基于流处理的CEP(Complex event process,复杂事件处理)
      • Table和SQL
      • 基于批处理的机器学习库flinkML
      • 图处理库Gelly
    • API层包括两部分
      • 流处理应用的DataStream API
      • 批处理应用的DataSet API
      • 统一的API,包括直接操作状态和时间等底层数据

二.运行模式

  •  运模模式核心区分点
    • 集群生命周期和资源隔离保证
    • 应用程序的main()方法是在客户端还是在集群上执行
  • 所有模式分类说明
    • 本地运行模式-local
    • standalone模式-独立Flink集群
    • 集群运行模式
      • 经常是指flink on yarn集群模式,yarn也可以换成mesos,Kubernetes(k8s)等资源管理平台替换。
      • 共3种
        • session模式
        • per-job模式
        • application模式
  • 本地运行模式
    • 运行过程:一个机器启动一个进程的多线程来模拟分布式计算。
    • 主要用于代码测试
  • standalone模式
    • 运行过程:完全独立的Flink集群的模式,各个环节均Flink自己搞定。并没有yarn、mesos的统一资源调度平台。
    • 主要是只有纯Flink纯计算的场景,商用场景极少。
  • 集群运行模式
    • Flink Session 集群(会话模式)
    • 集群生命周期:
      • 在 Flink Session 集群中,客户端连接到一个预先存在的、长期运行的集群,该集群可以接受多个作业提交。即使所有作业完成后,集群(和 JobManager)仍将继续运行直到手动停止 session 为止。因此,Flink Session 集群的寿命不受任何 Flink 作业寿命的约束。
    • 资源隔离:
      • TaskManager slot 由 ResourceManager 在提交作业时分配,并在作业完成时释放。由于所有作业都共享同一集群,因此在集群资源方面存在一些竞争 — 例如提交工作阶段的网络带宽。此共享设置的局限性在于,如果 TaskManager 崩溃,则在此 TaskManager 上运行 task 的所有作业都将失败;再比如,如果 JobManager 上发生一些致命错误,它将影响集群中正在运行的所有作业。
    • 其他注意事项:
      • 拥有一个预先存在的集群可以节省大量时间申请资源和启动 TaskManager。有种应用场景很重要,即启动任务时间长但运行时间比较短的场景,即对端到端的用户体验有较大的好处,能够提升用户体验— 就像对简短查询的交互式分析一样,希望作业可以使用现有资源快速执行计算。
    • Flink Session 集群也被称为 session 模式下的 Flink 集群。
    • 工作模式
    • 附加模式(默认)
      • 特点
        • 客户端与Flink作业集群相互同步
      • 细节描述
        • yarn-session.sh客户端将 Flink 集群提交给 YARN,但客户端保持运行,跟踪集群的状态。
        • 如果集群失败,客户端将显示错误。如果客户端被终止,它也会通知集群关闭。
    • 分离模式(-d或--detached)
      • 特点
        • 客户端与Flink作业集群相互异步,客户端提交完成后即可退出
      • 细节描述
        • yarn-session.sh客户端将Flink集群提交给YARN,然后客户端返回。
        • 需要再次调用客户端或 YARN 工具来停止 Flink 集群。
  • 工作流程特征说明
    • 多个不同的FlinkJob向同一个Flink Session会话上提交作业,由这一个统一的FlinkSession管理所有的Flink作业。
    • 工作流程示意图

       

      • 官方示例图

        Image.png

      •  经典解析图   

      •  

        Image.png

         

 Flink Job 集群(per-job模式)

  • 集群生命周期:
    • 在 Flink Job 集群中,可用的集群管理器(例如 YARN)用于为每个提交的作业启动一个集群,并且该集群仅可用于该作业。在这里客户端首先从集群管理器请求资源启动 JobManager,然后将作业提交给在这个进程中运行的 Dispatcher。然后根据作业的资源请求惰性的分配 TaskManager。一旦作业完成,Flink Job 集群将被拆除。
  • 资源隔离:
    • JobManager 中的致命错误仅影响在 Flink Job 集群中运行的一个作业。
  • 其他注意事项:
    • 由于 ResourceManager 必须应用并等待外部资源管理组件来启动 TaskManager 进程和分配资源,所以其实时计算性并没有session模式强,因此 Flink Job 集群更适合长期运行、具有高稳定性要求且对较长的启动时间不敏感的大型作业。
  • Flink Job 集群也被称为 job (or per-job) 模式下的 Flink 集群。
  • 工作流程特征说明
    • 多个不同的FlinkJob向各自由统一资源管理器(Yarn)生成的专用Flink Session会话上提交作业,由作业所属的FlinkSession管理自己的Flink作业。
    • 官方示例图
    • Image.png

    • 经典工作流程示意图
    • Image.png

  • Flink Application 集群(应用模式)
    • 集群生命周期:
      • Flink Application 集群是与Flink作业执行直接相关的运行模式,并且 main()方法在集群上而不是客户端上运行。
      • 提交作业是一个单步骤过程:
        • 无需先启动 Flink 集群,然后将作业提交到现有的 session 集群。
        • 而是,将应用程序逻辑和依赖打包成一个可执行的作业 JAR 中,由入口机客户端提交jar包和相关资源到hdfs当中。
        • 然后由调度启动的集群当中JobManager来拉取已由上一步上传完成的运行代码所需要的所有资源。如果有JobManager HA设置的话,将会同时启动多个JobManager作HA保障,此时将面临JobManager的选择,最终由一个胜出的JobManager作为Active进程推进下边的执行。
        • 并由运行JobManager进程的集群入口点节点机器(ApplicationClusterEntryPoint)负责调用 main()方法来提取 JobGraph,即作为用户程序的解析和提交的客户端程序与集群进行交互,直到作业运行完成。
        • 另外,如果一个main()方法中有多个env.execute()/executeAsync()调用,在Application模式下,这些作业会被视为属于同一个应用,在同一个集群中执行(如果在Per-Job模式下,就会启动多个集群)
        • 该模式也允许我们像在 Kubernetes 上部署任何其他应用程序一样部署 Flink 应用程序。
        • 因此,Flink Application 集群的寿命与 Flink 应用程序的寿命有关。
    • 资源隔离:
      • 在 Flink Application 集群中,ResourceManager 和 Dispatcher 作用于单个的 Flink 应用程序,相比于 Flink Session 集群,它提供了更好的隔离。
    • Flink Job 集群可以看做是 Flink Application 集群”客户端运行“的替代方案。
    • 该模式为yarn session和yarn per-job模式的折中选择。
    • 工作流程特征说明

       

       

      • 将各个环节更进一步进行专用化处理,相当于每个FlinkJob都有一套专用的服务角色进程。
      • 官方示例图
      • Image.png

      •  经典工作流程示意图
      • Image.png

  • 总结
    • 应用场景
      • 本地布署模式:demo、代码测试场景。
      • Session模式:集群资源充分、频繁任务提交、小作业居多、实时性要求高的场景。(该模式较少)
      • Per-Job模式:作业少、大作业、实时性要求低的场景。
      • Application模式:实时性要求不太高、安全性有一定要求均可以使用,普遍适用性最强。
    • 生产环境使用说明
      • 一般建议用per-job或是application模式,提供了更好的资源隔离性和安全性。

三.运行流程

  • 核心角色
    • 一个JobManager
    • 一到多个TaskManager
  •  流程图
  • 角色剖析 
    • JobManager
      • 主要作用就是协调和监控Task,Task的执行顺序,task的任务状态决策等
      • 这个进程由三个不同的组件组成
      • ResourcesManager
        • ResourceManager 负责 Flink 集群中的资源提供、回收、分配 - 它管理 task slots,这是 Flink 集群中资源调度的最小单位。Flink 为不同的环境和资源提供者(例如 YARN、Mesos、Kubernetes 和 standalone 部署)实现了对应的 ResourceManager。在 standalone 设置中,ResourceManager 只能分配可用 TaskManager 的 slots,而不能自行启动新的 TaskManager。
      • Dispatcher
        • Dispatcher 提供了一个 REST 接口,用来提交 Flink 应用程序执行,并为每个提交的作业启动一个新的 JobMaster。它还运行 Flink WebUI 用来提供作业执行信息。
      • JobMaster
        • JobMaster 负责管理单个JobGraph的执行。Flink 集群中可以同时运行多个作业,每个作业都有自己的 JobMaster。
        • 始终至少有一个 JobMaster。高可用(HA)设置中可能有多个 JobMaster,其中一个始终是 leader,其他的则是 standby。
      • TaskManager
        • TaskManager(也称为 worker)执行作业流的 task,并且缓存和交换数据流。
        • 必须始终至少有一个 TaskManager。在 TaskManager 中资源调度的最小单位是 task slot。TaskManager 中 task slot 的数量表示并发处理 task 的数量。请注意一个 task slot 中可以执行多个算子。
      • Yarn模式提交任务的工作流程
        • flink-application运行模式                                

         

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值