本文最初发布于Zalando网站Technology Blog板块,经原作者授权由InfoQ中文站翻译并分享

最近,我在用Apache Flink构建小型的流处理应用。在Zalando,我们默认使用Kubernetes进行部署,所以计划将Flink和开发的一些作业都部署到Kubernetes集群上。在这个过程中,我学到了很多关于Flink和Kubernetes的知识,在这篇文章里会和大家分享一下。

一些挑战

首先是合规性。在Zalando,正产环境运行的代码必须经过至少2人的审核,并且所有部署的内容都可以追溯到git commit。通常部署Flink任务会将包含有任务和依赖的JAR包上传到运行中的Flink集群,但这不符合我们内部的合规流程。

其二是容器编排的成熟度。Flink一个重要的卖点是支持容错的流处理。但如下一节所述,在容器编排系统中没有设计可靠性相关的功能,这使得在Kubernetes上运行Flink集群并不是你想的那么简单。

其三是碎片化的文档。不论是Flink还是Kubernetes都在快速的发展中,这使一些文档很容易就过时了(就像我这篇blog,或者是论坛/新闻组的帖子)。可惜的是,对于如何在Kubernetes上可靠地运行Flink,现在官方文档能提供的信息还不够完善。

Flink的架构和部署模式

为了理解如何在Kubernetes集群上部署Flink,需要先对其架构和部署模式有个大致的了解。如果你已经很熟悉Flink了,可以跳过本节。

Flink由作业管理器(Job Manager)和任务管理器(Task Manager)两个部分组成。作业管理器协调流处理作业,管理作业的提交及其生命周期,并将工作分配给任务管理器。任务管理器执行实际的流处理逻辑。同一时间只可能有一个活跃的作业管理器,但任务管理器可以有n个。

为了实现弹性的、有状态的、流式的处理,Flink使用了检查点(Checkpointing)来周期性地记录各种流处理操作的状态,并进行持久化存储。从故障中恢复时,流处理作业可以从最新的检查点继续执行。检查点的操作由作业管理器进行协调,它知道最新完成的检查点的位置,这在后面会很重要。

Flink集群可以以两种独立的模式运行:第一种叫Standalone或者叫Session Cluster,是一个可以运行多个流处理作业的单一集群。任务管理器在作业之间共享。第二种叫作业集群Job Cluster,专门用于运行单个流处理作业。

Flink集群可以在HA模式下运行。在这个模式下,多个作业管理器的实例同时运行,其中的一个会被选举为leader。如果leader失效了,会从其他运行的作业管理器中选出一个新的leader。Flink使用Zookeeper来进行leader选举。

部署Kubernetes

在上文提到的两种模式中,我们选择了Job Cluster模式来运行Flink。有两个原因:第一是因为Job Cluster的Docker镜像需要包含有Flink作业的JAR包。这能很好地解决合规性问题,因为我们可以重复使用与常规JVM应用相同的工作流程。第二个原因是这种部署模型能为每个Flink作业独立地扩展任务管理器。

我们将作业管理器作为一个部署(Deployment)并设置了1副本,任务管理器设置了n副本。任务管理器通过Kubernetes服务发现作业管理器。这个设置和官方文档不太相同,官方文档是建议将Job Cluster的作业管理器当做Kubernetes的作业来运行。但我们认为这种场景下(一个永不停止的流任务)使用部署的方式会更可靠,因为可以确保有一个pod一直在运行,而作业是可以完成的,使得集群可以没有任何作业管理器。这就是为什么我们的设置比较类似于文档中关于session cluster的描述。

作业管理器pod的失效由部署控制器(Deployment Controller)来处理,它会负责生成新的作业管理器。鉴于这是相对较快的操作,我们无需在热备份中维护多个作业管理器,不然会增加部署的复杂性。任务管理器使用Kubernetes服务来定位作业管理器。

如上文所述,作业管理器会在内存中保留一些和检查点相关的状态。在作业管理器崩溃时,这些状态会丢失,所以我们会在Zookeeper中持久化这些状态。这意味着即使没有选举leader的需求以及Flink HA模式的发现功能(就像Kubernetes本身处理的那样),仍然需要用到Zookeeper来存储检查点的状态。

我们在Kubernetes集群上已经部署了etcd集群和etcd-operator,所以不想再引入另一个分布式调度系统了。我们试了一下zetcd,这是一个基于etcdv3的Zookeeper API。用着挺顺利,所以我们决定坚持下去。

在这种设置下我们会遇到另一个问题,作业管理器有时会陷入不健康的状态,而只有通过重启作业管理器才能解决。这个我们会通过livenessProbe来解决,它会检查作业管理器是否健康、作业是否仍然在运行。

还需要注意的是,这个设置仅适用于Flink大于1.6.1的版本,因为存在无法从job cluster的检查点恢复的bug。

小结

上面的设置在生产环境中已经运行了好几个月,并能很好地服务于我们的用例。这也说明,即使在实现的过程中会遇到一些小障碍,在Kubernetes上平稳地运行Flink还是可行的。

原文链接:https://jobs.zalando.com/tech/blog/running-apache-flink-on-kubernetes/index.html

如何在Kubernetes上运行Apache Flink相关推荐

  1. 如何在Kubernetes上运行PostgreSQL

    通过在Kubernetes上运行PostgreSQL数据库,您可以创建统一管理的云原生生产部署,并可以灵活地部署满足您特定需求的个性化数据库即服务. 使用运算符可以让您向Kubernetes提供其他上 ...

  2. 在Kubernetes上运行SAP UI5应用(下): 一个例子体会Kubernetes内容器的高可用性和弹性伸缩...

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇文章 在Kubernetes上运行SAP UI5应用(上),我介绍了如何在Docker里运行一个简单的SAP UI5应用 ...

  3. 如何在Hadoop上运行TensorFlow【部署】

    为什么80%的码农都做不了架构师?>>>    原文链接 : https://www.tensorflow.org/deploy/hadoop 译文链接 : http://www.a ...

  4. 在Kubernetes上运行SAP UI5应用(下): 一个例子体会Kubernetes内容器的高可用性和弹性伸缩

    上一篇文章 在Kubernetes上运行SAP UI5应用(上),我介绍了如何在Docker里运行一个简单的SAP UI5应用,并且已经成功地将一个包含了这个UI5应用的docker镜像上传到Dock ...

  5. (九)在Kubernetes上运行人脸识别

    目录 介绍 为Kubernetes修改容器 安装Kubernetes 在Kubernetes上运行容器 下一步 在这里,我们给出了需要使用Kubernetes在真实生产环境中扩展和部署我们的AI解决方 ...

  6. [KubeCon+CloudNativeCon China 2018] 在Kubernetes上运行区块链服务(BaaS)

    笔者注:本文是在2018年11月15日由Linux基金会CNCF主办的KubeCon & CloudNativeCon China 2018大会的"Running Blockchai ...

  7. 在阿里云Kubernetes上运行SpringCloud示例PiggyMetrics

    阿里云Kubernetes服务运行SpringCloud osswangxining大侠在 阿里云Kubernetes SpringCloud 实践进行时 系列文章中系统地介绍了如何在阿里云Kuber ...

  8. apache hive_通过6个简单的步骤在Windows上运行Apache Hive

    apache hive 注意 :您需要安装cygwin才能运行本教程,因为Hadoop(Hive所需)需要cygwin才能在Windows上运行. 至少,系统中必须存在Basic,Net(OpenSS ...

  9. 通过6个简单的步骤在Windows上运行Apache Hive

    注意 :您需要安装cygwin才能运行本教程,因为Hadoop(Hive需要)需要cygwin才能在Windows上运行. 至少,系统中必须存在Basic,Net(OpenSSH,tcp_wrappe ...

最新文章

  1. 看尽SLAM、ReID和文字识别等技术进展!15位视觉技术大咖齐聚一堂
  2. Spring集成web环境步骤
  3. init tarray 太大_[NOIP 2001提高组T4]Car的旅行路线
  4. 5渲染判断_先渲染再对焦,KeyShot 深度通道在 Photoshop 中的对接
  5. java 栈 大小_java – JVM堆栈大小规范
  6. 基础线性规划实现(matlab,lingo)
  7. JAVA编写的火车票售票系统
  8. 【elasticsearch】 Regexes are disabled. Set [script.painless.regex.enabled] to [true]
  9. 今日头条ocpm计费规则_今日头条广告投放推广新产品选OCPM还是CPA好?是新的计费方式吗?...
  10. java链式语法_javaScript链式调用原理以及加法实现
  11. ads2011射频电路设计与仿真实例
  12. ps cc2019版为什么做图一复制图层就卡死_彻底明白PS的智能对象,它和普通图层到底有啥区别?详细讲解...
  13. 贪心高性能神经网络与AI芯片~学习笔记总计1
  14. C++基础课 5- 章
  15. 在kile中为stm32移植FreeRTOS
  16. 为何农历10月1号要祭祖上坟?原来有这么多讲究,你知道吗?
  17. 如何高效地做设计评审
  18. gym103627L XXII Open Cup, GP of Daejeon Curly Racetrack 题解
  19. 微信开发解决方案:(一)概述
  20. 【论文阅读#1】Edge Computing: Vision and Challenges

热门文章

  1. 排序(选择,冒泡,直接插入,希尔排序)
  2. Ironport对邮件主题中包括特殊字符的过滤
  3. python json模块 超级详解
  4. Java使用JDBC连接随意类型数据库(mysql oracle。。)
  5. git学习笔记04-将本地仓库添加到GitHub远程仓库-git比svn先进的地方
  6. Navicat 10 for SQL Server - 绿色中文版
  7. LINUX 数据盘的格式化与挂载
  8. 关于DNS区域查询,DNS字典爆破,以及查询文件问题
  9. 注解@NotNull/@NotEmpty/@NotBlank
  10. WPF中引入外部资源