【大数据】Flink on Kubernetes 原理剖析

Flink on Kubernetes 原理剖析

  • 1.基本概念
  • 2.架构图
  • 3.核心概念
  • 4.架构
  • 5.JobManager
  • 6.TaskManager
  • 7.交互
  • 8.实践
    • 8.1 Session Cluster
    • 8.2 Job Cluster
  • 9.问题解答

Kubernetes 是 Google 开源的 容器集群管理系统,其提供应用部署、维护、扩展机制等功能,利用 Kubernetes 能方便地管理跨机器运行容器化的应用。Kubernetes 和 Yarn 相比,相当于下一代的资源管理系统,但是它的能力远远不止这些。

1.基本概念

Kubernetes 中的 Master 节点,负责管理整个集群,含有一个集群的资源数据访问入口,还包含一个 Etcd 高可用键值存储服务。Master 中运行着 API ServerController ManagerScheduler 服务。

Node 为集群的一个操作单元,是 Pod 运行的宿主机。Node 节点里包含一个 Agent 进程,能够维护和管理该 Node 上的所有容器的创建、启停等。Node 还含有一个服务端 kube-proxy,用于 服务发现反向代理负载均衡。Node 底层含有 docker engine,docker 引擎主要负责本机容器的创建和管理工作。

Pod 运行于 Node 节点上,是若干相关容器的组合。在 K8s 里面 Pod 是创建、调度和管理的最小单位。

2.架构图

在这里插入图片描述
Kubernetes 的架构如图所示,从这个图里面能看出 Kubernetes 的整个运行过程。

  • API Server 相当于用户的一个请求入口,用户可以提交命令给 Etcd,这时会将这些请求存储到 Etcd 里面去。
  • Etcd 是一个键值存储,负责将任务分配给具体的机器,在每个节点上的 Kubelet 会找到对应的 container 在本机上运行。
  • 用户可以提交一个 Replication Controller 资源描述,Replication Controller 会监视集群中的容器并保持数量;用户也可以提交 service 描述文件,并由 kube proxy 负责具体工作的流量转发。

3.核心概念

Kubernetes 中比较重要的概念有:

  • Replication ControllerRC)用来管理 Pod 的副本。RC 确保任何时候 Kubernetes 集群中有指定数量的 Pod 副本(replicas)在运行, 如果少于指定数量的 Pod 副本,RC 会启动新的 Container,反之会杀死多余的以保证数量不变。
  • Service 提供了一个统一的服务访问入口以及服务代理和发现机制
  • Persistent VolumePV)和 Persistent Volume ClaimPVC)用于数据的持久化存储。
  • ConfigMap 是指存储用户程序的配置文件,其后端存储是基于 Etcd

4.架构

在这里插入图片描述
Flink on Kubernetes 的架构如图所示,Flink 任务在 Kubernetes 上运行的步骤有:

  • 首先往 Kubernetes 集群提交了资源描述文件后,会启动 Master 和 Worker 的 container
  • Master Container 中会启动 Flink Master Process,包含 Flink-Container ResourceManagerJobManagerProgram Runner
  • Worker Container 会启动 TaskManager,并向负责资源管理的 ResourceManager 进行注册,注册完成之后,由 JobManager 将具体的任务分给 Container,再由 Container 去执行。
  • 需要说明的是,在 Flink 里的 Master 和 Worker 都是一个镜像,只是脚本的命令不一样,通过参数来选择启动 Master 还是启动 Worker。

5.JobManager

JobManager 的执行过程分为两步:

  • 1️⃣首先,JobManager 通过 Deployment 进行描述,保证 1 个副本的 Container 运行 JobManager,可以定义一个标签,例如 flink-jobmanager
  • 2️⃣其次,还需要定义一个 JobManager Service,通过 service nameport 暴露 JobManager 服务,通过标签选择对应的 pods

6.TaskManager

TaskManager 也是通过 Deployment 来进行描述,保证 n n n 个副本的 Container 运行 TaskManager,同时也需要定义一个标签,例如 flink-taskmanager

对于 JobManager 和 TaskManager 运行过程中需要的一些配置文件,如:flink-conf.yamlhdfs-site.xmlcore-site.xml,可以通过将它们定义为 ConfigMap 来实现配置的传递和读取。

7.交互

在这里插入图片描述
整个交互的流程比较简单,用户往 Kubernetes 集群提交定义好的资源描述文件即可,例如 deploymentconfigmapservice 等描述。后续的事情就交给 Kubernetes 集群自动完成。Kubernetes 集群会按照定义好的描述来启动 pod,运行用户程序。各个组件的具体工作如下:

  • Service:通过标签(label selector)找到 job managerpod 暴露服务。
  • Deployment:保证 n n n 个副本的 container 运行 JM / TM,应用升级策略。
  • ConfigMap:在每个 pod 上通过挂载 /etc/flink 目录,包含 flink-conf.yaml 内容。

8.实践

接下来就讲一下 Flink on Kubernetes 的实践篇,即 K8s 上是怎么运行任务的。

8.1 Session Cluster

# 启动
kubectl create -f jobmanager-service.yaml 
kubectl create -f jobmanager-deployment.yaml 
kubectl create -f taskmanager-deployment.yaml
# Submit job
kubectl port-forward service/flink-jobmanager 8081:8081
bin/flink run -d -m localhost:8081 ./examples/streaming/TopSpeedWindowing.jar
# 停止
kubectl delete -f jobmanager-deployment.yaml 
kubectl delete -f taskmanager-deployment.yaml 
kubectl delete -f jobmanager-service.yaml

首先启动 Session Cluster,执行上述三条启动命令就可以将 Flink 的 jobManager-servicejobmanager-deploymenttaskmanager-deployment 启动起来。启动完成之后用户可以通过接口进行访问,然后通过端口进行提交任务。若想销毁集群,直接用 kubectl delete 即可,整个资源就可以销毁。

Flink 官方提供的例子如下图所示,图中左侧为 jobmanager-deployment.yaml 配置,右侧为 taskmanager-deployment.yaml 配置。

在这里插入图片描述
jobmanager-deployment.yaml 配置中:

  • 代码的第一行为 apiVersionapiVersion 是 API 的一个版本号,版本号用的是 extensions/v1beta1 版本。
  • 资源类型 kindDeployment
  • 元数据 metadata 的名为 flink-jobmanager
  • 副本数 replicas 1 1 1
  • labels 标签用于 pod 的选取。
  • containers 的镜像名为 jobmanagercontainers 包含从公共 docker 仓库下载的 image,当然也可以使用公司内部的私有仓库。
  • args 启动参数用于决定启动的是 jobmanager 还是 taskmanager
  • ports 是服务端口,常见的服务端口为 8081 8081 8081 端口。
  • env 是定义的环境变量,会传递给具体的启动脚本。

右图为 taskmanager-deployment.yaml 配置,taskmanager-deployment.yaml 配置与 jobmanager-deployment.yaml 相似,但 taskmanager-deployment.yaml 的副本数是 2 2 2 个。

在这里插入图片描述
接下来是 jobmanager-service.yaml 的配置,jobmanager-service.yaml 的资源类型为 Service,在 Service 中的配置相对少一些,spec 中配置需要暴露的服务端口的 port,在 selector 中,通过标签选取 jobmanagerpod

8.2 Job Cluster

除了 Session 模式,还有一种 Per Job 模式。在 Per Job 模式下,需要将用户代码都打到镜像里面,这样如果业务逻辑的变动涉及到 Jar 包的修改,都需要重新生成镜像,整个过程比较繁琐,因此在生产环境中使用的比较少。

以使用公用 Docker 仓库为例,Job Cluster 的运行步骤如下:

  • build 镜像:在 flink/flink-container/docker 目录下执行 build.sh 脚本,指定从哪个版本开始去构建镜像,成功后会输出 Successfully tagged topspeed:latest 的提示。
sh build.sh --from-release --flink-version 1.7.0 --hadoop-version 2.8 --scala-version 2.11 --job-jar ~/flink/flink-1.7.1/examples/streaming/TopSpeedWindowing.jar --image-name topspeed
  • 上传镜像:在 hub.docker.com 上需要注册账号和创建仓库进行上传镜像。
docker tag topspeed zkb555/topspeedwindowing 
docker push zkb555/topspeedwindowing
  • 启动任务:在镜像上传之后,可以启动任务。
# 启动 Servive
kubectl create -f job-cluster-service.yaml
# 启动 JobManager
FLINK_IMAGE_NAME=zkb555/topspeedwindowing:latest FLINK_JOB=org.apache.flink.streaming.examples.windowing.TopSpeedWindowing FLINK_JOB_PARALLELISM=3 envsubst < job-cluster-job.yaml.template | kubectl create -f – 
# 启动 TaskManager
FLINK_IMAGE_NAME=zkb555/topspeedwindowing:latest FLINK_JOB_PARALLELISM=4 envsubst < task-manager-deployment.yaml.template | kubectl create -f -

9.问题解答

Flink 在 K8s 上可以通过 Operator 方式提交任务吗?

目前 Flink 官方还没有提供 Operator 的方式, L y f t Lyft Lyft 公司开源了自己的 Operator 实现:https://github.com/lyft/flinkk8soperator。

在 K8s 集群上如果不使用 Zookeeper 有没有其他高可用(HA)的方案?

Etcd 是一个类似于 Zookeeper 的高可用键值服务,目前 Flink 社区正在考虑基于 Etcd 实现高可用的方案(https://issues.apache.org/jira/browse/FLINK-11105)以及直接依赖 K8s API 的方案(https://issues.apache.org/jira/browse/FLINK-12884)。

Flink on K8s 在任务启动时需要指定 TaskManager 的个数,有和 Yarn 一样的动态资源申请方式吗?

Flink on K8s 目前的实现,在任务启动前就需要确定好 TaskManager 的个数,这样容易造成 TM 指定太少,任务无法启动,或者指定的太多,造成资源浪费。社区正在考虑实现和 Yarn 一样的任务启动时动态资源申请的方式。这是一种和 K8s 结合的更为 Nativey 的方式,称为 Active 模式。Active 意味着 ResourceManager 可以直接向 K8s 集群申请资源。具体设计方案和进展请关注:https://issues.apache.org/jira/browse/FLINK-9953。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/466574.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能运维有哪些要素?智能运维模式有哪些

智能化运维因素 数据收集和处理:智能运维必须收集和解决大量数据&#xff0c;包括设备运行数据、环境数据、用户行为分析等。这些信息能够帮助运维人员发现问题&#xff0c;诊断故障&#xff0c;预测故障&#xff0c;并采取相应的措施。 知识库:智能运维必须建立一个知识库&…

ClickHouse--03--数据类型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 数据类型1. Int2.FloattoFloat32(...) 用来将字符串转换成 Float32 类型的函数toFloat64(...) 用来将字符串转换成 Float64 类型的函数 3.DecimaltoDecimal32(value…

二、DataX安装

DataX安装 一、简介二、系统要求三、部署 一、简介 官方地址&#xff1a;https://github.com/alibaba/DataX/blob/master/userGuid.md 二、系统要求 LinuxJDK(1.8以上&#xff0c;推荐1.8) Centos7.9的java1.8安装命令&#xff1a;yum install java-1.8.0-openjdk.x86_64 Py…

基于Qt的人脸识别项目(功能:颜值检测,口罩检测,表情检测,性别检测,年龄预测等)

完整代码链接在文章末尾 效果展示 代码讲解(待更新) qt图片文件上传 #include <QtWidgets> #include <QFileDialog>

正则表达式与正则可视化工具:解密文本处理的利器

引言 在计算机科学和软件开发领域&#xff0c;正则表达式是一种强大而灵活的文本处理工具。然而&#xff0c;对于初学者来说&#xff0c;正则表达式的语法和规则可能会显得晦涩难懂。为了帮助初学者更好地理解和学习正则表达式&#xff0c;正则可视化工具应运而生。本文将介绍…

「Linux」用户操作

root用户 su&#xff1a;切换账户 语法&#xff1a;su [–] [用户名] -&#xff1a;可选&#xff0c;表示是否在切换用户后加载环境变量&#xff0c;建议带上用户名&#xff1a;表示要切换的用户&#xff0c;省略时表示切换到root切换用户后&#xff0c;通过exit命令退回上一个…

备战蓝桥杯---组合数学2

本专题主要介绍容斥原理。 大家高中的时候肯定接触过韦恩图&#xff0c;容斥原理比较通俗的理解就是减去所有可能并加上重叠的部分。 我们直接看公式&#xff1a; 知道后&#xff0c;我们先看道模板题&#xff1a; 下面是AC代码&#xff1a; #include<bits/stdc.h> us…

controlnet的模型下载

controlnet模型有sd15和基于sd15上的fp16版本 fp16版本的模型比较小&#xff0c;但功能效果跟sd15是一样的 controlnet的fp16模型下载地址 https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/tree/main controlnet的openpose里&#xff0c;有个dw_open…

使用 FFmpeg 将视频转换为 GIF 动画的技巧

使用 FFmpeg 将视频转换为 GIF 动画 FFmpeg 可以将视频转换为 GIF 动画&#xff0c;方法如下&#xff1a; 1. 准备工作 确保您已经安装了 FFmpeg。 熟悉 FFmpeg 的命令行使用。 了解 GIF 动画的基本知识。 2. 基本命令 ffmpeg -i input.mp4 output.gif 3. 参数说明 -i in…

Git、github与gitee码云

1.git核心是两个仓库&#xff1a;本地仓库和远程仓库 主要用于团队合作和代码版本控制&#xff08;个人现有版本代码出错可回溯上个提交版本的代码&#xff09; 远程仓库国际主流githut&#xff0c;但外网速度问题&#xff0c;国内可使用码云gitee github&#xff1a;https:…

【原创 附源码】Flutter安卓及iOS海外登录--Apple登录最详细流程

最近接触了几个海外登录的平台&#xff0c;踩了很多坑&#xff0c;也总结了很多东西&#xff0c;决定记录下来给路过的兄弟坐个参考&#xff0c;也留着以后留着回顾。更新时间为2024年2月12日&#xff0c;后续集成方式可能会有变动&#xff0c;所以目前的集成流程仅供参考&…

【动态规划】【数学】【C++算法】1449. 数位成本和为目标值的最大数字

作者推荐 【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目 本文涉及知识点 动态规划汇总 LeetCode1449. 数位成本和为目标值的最大数字 给你一个整数数组 cost 和一个整数 target 。请你返回满足如下规则可以得到的 最大 整数&#xff1a; 给当前结果添加…