【大数据】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.mfbz.cn/a/386035.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入理解梯度加权类激活热图(Grad-CAM)

深入理解梯度加权类激活热图&#xff08;Grad-CAM&#xff09; 项目背景与意义 在深度学习领域&#xff0c;模型的预测能力往往是黑盒子&#xff0c;难以解释。梯度加权类激活热图&#xff08;Grad-CAM&#xff09;作为一种可解释性技术&#xff0c;能够帮助模型开发者更好地…

js中事件循环的详解

文章目录 一、是什么二、宏任务与微任务微任务宏任务 三、async与awaitasyncawait 四、流程分析 一、是什么 首先&#xff0c;JavaScript是一门单线程的语言&#xff0c;意味着同一时间内只能做一件事&#xff0c;但是这并不意味着单线程就是阻塞&#xff0c;而实现单线程非阻…

java数据结构与算法刷题-----LeetCode18. 四数之和

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 此题为三数之和的衍生题&#xff0c;代码完全一样&#xff0c;只…

Github 2024-02-13 开源项目日报 Top9

根据Github Trendings的统计&#xff0c;今日(2024-02-13统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量JavaScript项目2Python项目2C项目2TypeScript项目2Rust项目1Go项目1Dart项目1Java项目1C项目1 系统设计指南 …

JavaScript 的点击劫持(Clickjacking)

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 点击劫持是一种恶意攻击&#xff0c;攻击者会在用户不知情的情况下诱…

Stable Diffusion 模型下载:majicMIX sombre 麦橘唯美

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

LeetCode、452. 用最少数量的箭引爆气球【中等,贪心,区间问题】

文章目录 前言LeetCode、452. 用最少数量的箭引爆气球【中等&#xff0c;贪心&#xff0c;区间问题】题目链接与分类思路贪心&#xff0c;连续区间数量问题 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客…

ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions

异常处理模型详解之异常处理概述 一&#xff0c;异常处理相关概念二&#xff0c;异常处理概述 一&#xff0c;异常处理相关概念 在介绍异常处理之前&#xff0c;有必要了解一些关于异常处理状态的术语&#xff1a; 当处理器响应一个异常时&#xff0c;我们称该异常被获取了&a…

python 经典老人言

python 经典老人言 import tkinter as tkclass FlipBook:def __init__(self, master):self.master master master.title("经 典 老 人 言")self.pages ["经 典 老 人 言","求学无笨者&#xff0c;努力就成功","读 书 百 遍&am…

数据结构在JavaScript中的体现

一.概述 数据结构是计算机中存储、组织数据的方式。通常情况下&#xff0c;精心选择的数据结构可以带来最优效率的算法&#xff0c;其实算法并不是一个很高级的东西&#xff0c;它充斥在每一种代码组织方式中&#xff1b;而且各种语言关于数据结构方面的内容都是大同小异的&…

Prompt Tuning:深度解读一种新的微调范式

阅读该博客&#xff0c;您将系统地掌握如下知识点&#xff1a; 什么是预训练语言模型&#xff1f; 什么是prompt&#xff1f;为什么要引入prompt&#xff1f;相比传统fine-tuning有什么优势&#xff1f; 自20年底开始&#xff0c;prompt的发展历程&#xff0c;哪些经典的代表…

Linux_进程间通信

管道 System V 共享内存 System V IPC 接口介绍 由于进程地址空间的存在&#xff0c;所以进程间有具有独立性&#xff0c;一个进程看不到另一个进程的数据。那么如果我们想让进程间通信&#xff0c;就必须先让它们先看到同一份资源。常见的进程间通信的方法有管道&#xff0c;…

“bound drug/molecule”or “unbound drug/molecule”、molecule shape、sketching是什么?

“bound drug/molecule”or “unbound drug/molecule” For clarity, the following terms will be used throughout this study: “bound drug/molecule” (or “unbound drug/molecule”) refers to the drug/molecule that is bound (or unbound) to proteins [48]. 意思就是…

力扣精选算法100道——【模板】前缀和 (二维)

目录 &#x1f388;题目解析 &#x1f388;算法原理 &#x1f388;实现代码 二维前缀和【模板】 &#x1f388;题目解析 上一题我们讲述了一维的前缀和求法。 第一行三个参数&#xff0c;n是行数3&#xff0c;m是列数4&#xff0c;q3代表查询次数 接下来就是n行m列的矩阵…

用shell脚本批量修改文件名

今天继续分享一个实用的shell脚本哈 示例&#xff1a;# touch file{1..3}.txt # ls file1.txt file2.txt file3.txt 脚本内容&#xff1a; #!/bin/bash #方法1&#xff1a;for file in $(ls *txt); domv $file bbs_${file#*_}# mv $file $(echo $file |sed -r s/.*(_.*)/b…

C++入门篇——类与对象重点解析(下篇)

1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { public: Date(int year, int month, int day) {_year year;_month month;_day day; } private:int _year;int _m…

AI大模型开发架构设计(9)——AI 编程架构刨析和业务应用实战案例

文章目录 AI 编程架构刨析和业务应用实战案例1 AI编程代码生成模型剖析编程方式的发展代码自动生成基于大模型的AI编程工具——Github Copilot以 CodeGeeX 为例-发展过程以 CodeGeeX 为例-训练过程以 CodeGeeX 为例-大规模代码数据处理以 CodeGeeX 为例-模型结构以 CodeGeeX 为…

IDEA 推荐插件

grep-console 输出日志换颜色 MybatisLogFormat 直接复制mybatis的日志成完整的SQL SequenceDiagram 生成时序图

OpenCV 人脸检测(易上手版)

在丰富多彩的计算机视觉世界中&#xff0c;人脸检测是最有趣和最广泛应用的领域之一。无论是在安全系统、用户界面控制&#xff0c;还是在社交媒体中应用过滤器&#xff0c;准确有效地检测人脸的能力都是至关重要的。今天&#xff0c;很高兴与大家分享如何在 Python 中使用 Ope…

Java实现软件学院思政案例库系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理员2.2 普通教师 三、系统展示四、核心代码4.1 查询思政案例4.2 审核思政案例4.3 查询思政课程4.4 思政案例点赞4.5 新增思政案例评语 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的软件学…
最新文章