在Kubernetes上部署Flink做业

flink-on-kubernetes.png

Kubernetes

Kubernetes(k8s)由Google建立,现已成为最受欢迎的开源编排系统,用于管理多个主机容器化应用,提供了为分布式系统构建和部署可伸缩且可靠的应用程序所需的机制。咱们正处在一个时代,服务的正常运行时间必须接近99.9%,要实现这一点,就必须拥有一种机制,即便存在系统崩溃,它们也不能失败。这些类型的系统必须具备某些特性,必须在某些意外发生的时候,工做负载能够在简单维护或部署的状况下进行扩展,停机时间必须为零。服务器

Kubernetes上的Flink部署

可使用会话集群或做业集群两种模式将Apache Flink部署在Kubernetes上。会话集群是一个运行中的独立集群,能够运行多个做业,Kubernetes的视角来看,会话集群由三个组件组成:网络

  • 指定JobManager的部署对象
  • 指定TaskManager的部署对象
  • 以及公开JobManager的REST API的Service对象

做业集群为每一个做业部署专用集群。
在下一节中,咱们将讨论有关Kubernetes的一些基本概念。maven

Pod

Pod是能够在Kubernetes中建立和管理的最小的可部署计算单元。

Pod是容器的集合,可能包含一个或多个共享名称空间,卷和网络堆栈的应用程序。容器之间是紧密耦合的,由于它们共享网络堆栈,所以可使用本地主机相互通讯。 分布式

部署在其余Pod中的容器没法使用本地主机进行通讯,由于它们具备不一样的IP地址,而且应该使用Pod IP地址进行交互。 工具

您能够在Kubernetes网站上找到有关Pod的更多详细信息。网站

ReplicaSets

ReplicaSet的目的是维持在任何给定时间运行的稳定的副本Pod集。所以,它一般用于保证指定数量的相同Pod的可用性。

ReplicaSet使管理和确保运行预约数量的复制Pod的工做更加轻松,而无需建立Pod的手动副本,从而避免了时间和错误。由ReplicaSets管理的Pod可能会失败,而且新实例将自动从新安排。url

您能够在Kubernetes网站上找到有关副本集的更多详细信息。spa

Service

将运行在一组Pod上的应用程序公开为网络服务的抽象方法。

因为Kubernetes是一个动态系统,能够调度新Pod或缩小Pod的规模,甚至禁用它们,所以Pod被认为是短暂的。每一个Pod都有一个IP地址,该地址在Pod死亡的整个时间(若是由控制器进行管理)都会更改,这意味着与该Pod交互的全部服务都必须更新IP,不然对该服务的请求将失败。命令行

解决此类问题的必要措施是进行服务发现,以解决查找在服务正常工做的给定地址处侦听的进程的问题。scala

Kubernetes使用Service对象解决了这个问题,该对象定义了一个标签选择器,而且属于该服务的Pod具备该标签。这意味着分配给服务的IP地址不会随时间变化。

您能够在Kubernetes网站上找到有关该服务的更多详细信息。

Deployments

部署为Pod和ReplicaSet提供声明性更新。

使用Deployment对象,您能够有效地管理发布过程,而不会形成停机或错误。部署由在Kubernetes集群上运行的名为部署控制器的服务控制。

您能够在Kubernetes网站上找到有关部署的更多详细信息。

在Kubernetes上建立Flink集群

如今该安装Kubernetes集群了。首先须要安装Minikube,它将在虚拟机内部运行单节点Kubernetes集群。

除了Minikube以外,您还须要命令行工具Kubectl,它容许您对Kubernetes集群运行命令。可是,若是您在Minikube中遇到问题,则可能有必要在Minikube中使用HTTP/HTTPS代理

如示例1中所示启动集群。

flink01.png

minikube start命令是从下载启动镜像并启动Virtualbox VM开始的。注意:在咱们的示例VirtualBox中,必须指定Minikube将使用哪一个VM驱动程序,若是要使用其余驱动程序,能够执行如下命令:

minikube start — vm-driver=<driver_name>

Minikube是使用Kubernetes版本v1.17.3启动的,但您能够自由配置该版本之外的版本:

minikube start — kubernetes-version <kubernetes_version>.

运行咱们的Flink会话集群

使用会话集群对于使用不一样的Kubernetes资源是必要的,如上所述,这是必需的:

  1. 指定JobManager的部署对象
  2. 指定TaskManager的部署对象
  3. 以及公开JobManager的REST API的Service对象

让咱们从1)开始,并建立一个部署对象以实例化JobManager。

flink2.png

此部署对象使用容器镜像Flink-1.10.0 建立单个JobManager,并公开用于RPC通讯的容器端口,blob服务器,用于可查询状态服务器和Web UI。

移至2)将建立部署对象以实例化TaskManager。

flink3.png

TaskManager部署指定两个实例,这些实例可用于运行JobManager计划的做业。 Docker容器镜像与JobManager相同,而且启动工做程序的命令与JobManager的启动不一样。

最后,3)建立了服务对象,该对象在咱们的集群中很是重要,由于它将JobManager暴露给TaskManager,不然,工做Pod将没法链接到主控制Pod。

您可能已经注意到,服务类型定义为NodePort,这是因为咱们想在Kubernetes集群外部与JobManager进行交互而添加的。

是时候启动咱们的Flink集群了,为此,咱们将上面构建的定义添加到Kubernetes,执行如下命令:

kubectl create -f jobmanager.yaml  
kubectl create -f jobmanager-service.yaml  
kubectl create -f taskmanger.yaml

要查看部署状态:

kubectl get deployments

flink4.png

检查Pod的启动状态:

kubectl get pods

flink5.png

如今咱们的Kubernetes集群运行Flink集群,其中两个插槽中有一个JobManager和两个TaskManager以运行做业。

重要的是要记住,TaskManager能够配置有必定数量的处理插槽,这些插槽能够同时执行多个任务。这些任务能够是同一应用程序的子任务,也能够是不一样应用程序的子任务。看起来更好,咱们能够区分三种并行性:

  • 工做并行
  • 任务并行
  • 数据并行

数据并行性是一种对数据进行分区的功能,若是您已经使用Apache Kafka,则可让多个运算符执行这些数据子集,该概念相似于主题的每一个分区。任务并行性变得更容易,来自不一样操做员的任务属于同一应用程序。

构建 Flink Job

咱们的应用程序将是基于Apache Flink文档构建的相似示例,该示例将对Web套接字中使用5秒钟的批处理实现计数单词Ola出现次数(该单词是葡萄牙语的一个单词,与hello的含义相同)。该示例是使用scala 2.12和maven进行依赖关系管理和项目管理的。

flink6.png

要运行该应用程序,您须要运行命令行netcat打开一个TCP链接,该链接将用于侦听和发送数据:

nc -lk 9999

在该项目的根目录下运行命令以后,转到Github上的项目并克隆该项目:

mvn clean package

并将在目标/streaming-job-ola-word-1.0-SNAPSHOT.jar中的应用程序代码中生成一个jar。

运行咱们的第一个Flink做业

运行咱们的应用程序意味着能够访问Flink的Web UI,这不是强制性的,例如,您能够经过Flink的Rest API或Flink实用程序来进行部署和启动做业应用程序。

要知道Flink的Web UI的端点,Minikube提供了一个检索服务URL的命令:

minikube service jobmanager --url

flink8.png

Flink的仪表板暴露在端口32076上,以下所示:

flink9.png

Flink群集具备两个TaskManager实例,这些实例先前是在非Flink做业运行时建立的。要运行一个做业,您能够提交先前建立的做业,您能够单击“提交新做业”选项,而后使用“新增”按钮将该做业上传到Flink,而后单击上载的做业,而后单击“提交”按钮。

flink10.png

提交后,做业将自动启动,由于存在运行做业的可用任务。

flink11.png

要与做业进行交互,若是您还记得,可使用命令工具netcat:

nc -lk 9999

而后您就能够开始向咱们的Job发送信息了。

flink12.png

您能够查看此交互的响应,并查看Taskmanager的日志。

flink13.png

结论

不要忘记阅读Flink文档和Kubernetes文档,由于社区是很是活跃的参考,他们正在不断改进项目。

下一个故事是关于如何在Flink群集上得到高可用性的。流应用程序的大多数用例都要求长期运行,并知足将集群准备为此要求所必需的。

相关文章
相关标签/搜索