上级:https://www.cnblogs.com/hackerxiaoyon/p/12747387.html

Flink Operations Playground

flink的操作场地,从这一小节,会学习到flink如何的去部署和监控应用,作业失败以后去恢复,执行日常作业任务像升级和重新调整。

Anatomy of this Playground

看一下这个环境场所的构造,由一个长期活跃的flink会话集群和一个kafka集群组成。一个flink集群是由一个flink master节点和一个或多个flink taskmanagers 组成。Flink master的主要任务就是管理任务job的提交,监督任务还有资源的管理。Taskmanager 就是实际的工作者处理我们提交的具体作业任务。在这次你会启动一个单个taskmanager,不过稍后会扩展到多个。此外,这个环境是由我们的一个客户端容器来创建的,之后我们的一些提交任务和执行各种操作都会在此客户端容器。客户端并不是由flink 集群所必须提供的,只是了容易上手使用。
kafka集群是包含了zk集群和kafka的各个节点broker。

当我们提交一个作业到master的时候,才外还有kafka的主题和消费者也同样会被创建。

作业消费中的点击事件 来自与主题的输入,每一条信息中都有一个timestamp 时间戳 和 page 页面信息字段。之后是痛殴page去做为key分组,并且统计在15秒的窗口。之后结果会被写到输出的主题中。

Starting the Playground

我们要开始启动我们的环境了,只需要及步骤就可以搞定。这里会介绍几个必要的命令,通过这些命令个能够让我们的作业运行的很正常。
假设我们已经安装了docker (1.12+)的版本和docker-compose(2.1+) 版本,说实话我的电脑没有装,之前的电脑自玩的时候用过docker,工作中我现在没有自己用,部署后台api的时候,也是jenkins自动部署, docker都是运维已经给集成好的,不过这些不影响我们学习,好的我们继续。
接下来我们安装一下docker
https://download.docker.com/mac/stable/Docker.dmg 确实挺费力气的,下载了好久。
环境安装好了以后我们进行官网的环境搭建
下载代码从git然后docker编译运行。docker我不是很熟悉,暂且我们按照官网走。
git clone --branch release-1.10 https://github.com/apache/flink-playgrounds.gitcd flink-playgrounds/operations-playground
docker-compose build
docker-compose up -d
之后我们就可以通过命令查看到运行docker 环境了。
docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------------------
operations-playground_clickevent-generator_1 /docker-entrypoint.sh java ... Up 6123/tcp, 8081/tcp
operations-playground_client_1 /docker-entrypoint.sh flin ... Exit 0
operations-playground_jobmanager_1 /docker-entrypoint.sh jobm ... Up 6123/tcp, 0.0.0.0:8081->8081/tcp
operations-playground_kafka_1 start-kafka.sh Up 0.0.0.0:9094->9094/tcp
operations-playground_taskmanager_1 /docker-entrypoint.sh task ... Up 6123/tcp, 8081/tcp
operations-playground_zookeeper_1 /bin/sh -c /usr/sbin/sshd ... Up 2181/tcp, 22/tcp, 2888/tcp, 3888/tcp

出现这种情况就是表明客户端容器已经成功提交到flin的作业和所有的集群组建,同时数据也生成在运行中。我们可以通过停止环境命令结束环境。
Docker-compose down -v

Entering the Playground

Flink WebUI

Flink 的ui界面默认是 http://localhost:8081.运行正常的话你会看到一个taskManager 和一个叫做Click Event Count的执行作业。

webui包含了很多有用的有趣的信息想作业图,指标,检查点,taskmanager的状态等等 ,我们能够从这儿看到task中的日志记录利于我们排查问题,如果日志大了可能就页面打不开了。但是我们可以通过yarn 把作业日志打印到文件中,通过tail 查看后面的信息来排查问题。

Logs

查看日志

jobManager

docker-compose logs -f jobmanager

TaskManager

docker-compose logs -f taskmanager

Flink CLI

https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/cli.html

客户端的命令很有用,我们可以用来查看作业信息等操作。比如我们可以打印一下有用的信息:
docker-compose run --no-deps client flink --help

Flink REST API

https://ci.apache.org/projects/flink/flink-docs-release-1.10/monitoring/rest_api.html#api

flink的一些接口信息,通过接口我们可以做我们自己的监控任务。比如查看所有作业信息
curl localhost:8081/jobs

Kafka Topics

查看kafka写入数据
//input topic (1000 records/s)
docker-compose exec kafka kafka-console-consumer.sh \
--bootstrap-server localhost:9092 --topic input

//output topic (24 records/min)
docker-compose exec kafka kafka-console-consumer.sh \
--bootstrap-server localhost:9092 --topic output

Time to Play

我们已经学习了如何与flink,docker容器交互,接下来我们再看一下一些通常的操作任务。所有的作业任务都是独立,我们可以不按照顺序执行执行他们,想执行哪个就执行哪个。大多数的任务可以通过客户端和rest api执行。

Listing Running Jobs
cli

Command
docker-compose run --no-deps client flink list
Expected Output
Waiting for response...
------------------ Running/Restarting Jobs -------------------
16.07.2019 16:37:55 : <job-id> : Click Event Count (RUNNING)
--------------------------------------------------------------
No scheduled jobs.

REST API

Request
curl localhost:8081/jobs
Expected Response (pretty-printed)
{
"jobs": [
{
"id": "<job-id>",
"status": "RUNNING"
}
]}

Observing Failure & Recovery

观察任务失败与恢复,flink在失败的情况下保证了精准一次。我们通过这个环境来验证这个行为。

Step 1: Observing the Output

基于上面的描述,这个事件再每一个窗口包含了精确的1000条数据。因此,为了验证taskmanager失败以后数据丢失或者重复成功的恢复你可以跟踪输出的主题和检查在恢复之后所有的窗口是现在的和数量是正确的。
读取输出的主题信息直到恢复之后离开(step 3)
docker-compose exec kafka kafka-console-consumer.sh \
--bootstrap-server localhost:9092 --topic output

Step 2: Introducing a Fault

为了模拟部分失败可以kill掉一个TaskManager。同时TaskManager进程也会丢失,TaskManager 机制或者简单的异常通过代码或者框架会跑出来。
docker-compose kill taskmanager

经过几秒后,master会发现有taskmanager挂了取消受影响的作业并且立即重新提交恢复作业。当作业重新启动后,任务在规划的状态中,这一部分是在紫色的区域中记录。

Note:尽管作业中的任务在规划状态中还没有运行,但是作业的整体状态已经是RUNNING

此时,作业中的任务不能从SCHEDDULED状态移动到RUNNING状态,因为这里没有资源由TaskManagers提供的TaskSlots,给这些任务。直到一个有一个新的TaskManager成为可用的,这个作业将会经历从取消到重新提交的生命周期。与此同时,数据生成器会将ClickEevents 事件的数据推到输入的主题中。这个类似于一个真实的生产步骤,数据从生产到落地。

Step 3: Recovery

一旦重新启动TaskManager,它将会重新链接master
docker-compose up -d taskmanager
当master注意到了新的Taskmanager,它规划一下资源将可用的TaskSlots分配给作业用来恢复。重启过程,任务恢复他们的状态从最近一次成功的检查点也就是在转换状态时候失败的那次。
作业将会很快的处理挤压的日志从输入的事件中并且处理输出在一个很高的处理速度(> 24 条/分钟),直到处理完毕。在输出结果中我们会看到 关键字也就是我们的page字段是当前的时间窗口的并且每个统计量是精确的1000.因为我们使用了 FlinkKafkaProducer 最少一次的模式,所以会存在一个问题就是我们会看到有重复的数据输出。

Node:大多的生产环境我们都是用资源调度集群来自动处理重启失败的程序的,像:k8s,yarn,mesos这种。我们项目组用的yarn。

Upgrading & Rescaling a Job

升级一个flink作业设计到两个步骤:第一,采用保存点优雅的停止一个作业。保存点是一个在完成一个应用状态的一个一致性数据定义的快照机制,类似于检查点,保存点是用户自己定义的。第二,升级的作业从保存点开始,在这个上下文中“升级”可以标示不同的事情,包括如下:
对于配置文件的升级;
作业拓扑的升级添加或者移除一个操作;
作业中用户定义的一个方法升级
在你开始升级之前你可能需要去跟踪一下输出的主题topic,为了避免数据的丢失。
docker-compose exec kafka kafka-console-consumer.sh \
--bootstrap-server localhost:9092 --topic output

Step 1: Stopping the Job

我们可以优雅的停止掉任务,通过获取job的id来停止。我们有两种方式cli和rest api。

Cli

Command
docker-compose run --no-deps client flink stop <job-id>
Expected Output
Suspending job "<job-id>" with a savepoint.
Suspended job "<job-id>" with a savepoint.

保存点被保存在state.savepoint.dir 这个路径下面,是通过flink-conf.yaml来配置的,这个被挂载在/tmp/flink-savepoints-directory/ 路径在我们的本地机器。接下来的步骤不要这个保存点的路径,如果rest api 相应的已经是这个路径,那么我们直接查看就可以。

command
ls -lia /tmp/flink-savepoints-directory
Expected Output
total 0
17 drwxr-xr-x 3 root root 60 17 jul 17:05 .
2 drwxrwxrwt 135 root root 3420 17 jul 17:09 ..
1002 drwxr-xr-x 2 root root 140 17 jul 17:05 savepoint-<short-job-id>-<uuid>

REST API

Request
# triggering stop
curl -X POST localhost:8081/jobs/<job-id>/stop -d '{"drain": false}'
Expected Response (pretty-printed)
{
"request-id": "<trigger-id>"}
Request
# check status of stop action and retrieve savepoint path
curl localhost:8081/jobs/<job-id>/savepoints/<trigger-id>
Expected Response (pretty-printed)
{
"status": {
"id": "COMPLETED"
},
"operation": {
"location": "<savepoint-path>"
}

Step 2a: Restart Job without Changes

我们可以升级一个作业不做任何改变

Cli

Command
docker-compose run --no-deps client flink run -s <savepoint-path> \
-d /opt/ClickCountJob.jar \
--bootstrap.servers kafka:9092 --checkpointing --event-time
Expected Output
Starting execution of program
Job has been submitted with JobID <job-id>

REST API

Command
docker-compose run --no-deps client flink run -s <savepoint-path> \
-d /opt/ClickCountJob.jar \
--bootstrap.servers kafka:9092 --checkpointing --event-time
Expected Output
Starting execution of program
Job has been submitted with JobID <job-id>

一旦作业再次运行状态,你将会看到输出的主题topic数据被产生。此外,你也会看到数据没有丢失在这次升级。

Step 2b: Restart Job with a Different Parallelism (Rescaling)

此外,你可能对于重新提交的作业需要改变它的并行度

Cli

Command
docker-compose run --no-deps client flink run -p 3 -s <savepoint-path> \
-d /opt/ClickCountJob.jar \
--bootstrap.servers kafka:9092 --checkpointing --event-time
Expected Output
Starting execution of program
Job has been submitted with JobID <job-id>


REST API


Request
# Uploading the JAR from the Client container
docker-compose run --no-deps client curl -X POST -H "Expect:" \
-F "jarfile=@/opt/ClickCountJob.jar" http://jobmanager:8081/jars/upload
Expected Response (pretty-printed)
{
"filename": "/tmp/flink-web-<uuid>/flink-web-upload/<jar-id>",
"status": "success"}
Request
# Submitting the Job
curl -X POST http://localhost:8081/jars/<jar-id>/run \
-d '{"parallelism": 3, "programArgs": "--bootstrap.servers kafka:9092 --checkpointing --event-time", "savepointPath": "<savepoint-path>"}'
Expected Response (pretty-printed
{
"jobid": "<job-id>"}

作业被重新提交,但是不是3 个并行度 因为没有足够的任务槽给它只有两个有效。
docker-compose scale taskmanager=2

你可能添加第二个TaskManager 用两个任务槽。添加完以后作业再次运行起来。一旦作业再次是“RUNNING”,我们就能从输出的那个主题topic看到数据,同时数据也没有丢失。

Querying the Metrics of a Job
https://ci.apache.org/projects/flink/flink-docs-release-1.10/monitoring/metrics.html

Flink master对外提供了系统和用户指标通过REST API的方式。我们可以通过api获取作业的指标信息。接口不只是提供了查询指标的信息,同时可以通过查看更加信息的信息关于运行作业的状态,我们更好的去监控我们的作业。

https://ci.apache.org/projects/flink/flink-docs-release-1.10/monitoring/rest_api.html#api

Variants

你可能已经注意到了 Click Event Count 应用总是开始携带着 检查点 和 事件时间程序参数。在docker-compose.yaml客户端容器命令中可以省略这些,你可以改变作业的行为。
--checkpointing  参数开启 checkpoint 机制(https://ci.apache.org/projects/flink/flink-docs-release-1.10/internals/stream_checkpointing.html) flink的一种失败恢复机制。如果你重启作业没有这个机制,那么很可能你会看到数据的丢失。
--event-time 开启作业的事件时间机制(https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/event_time.html).当没有启用的时候,作业会按照实际的达到的时间替换ClickEvent的时间戳。 因此这样窗口的每个事件的数量就不再是精准的1000.点击事件数量应用也有其他的选项,默认关闭,你也可以开启去探测这些作业的行为在反压下。你可以在docker-compose。yaml所在的客户端容器添加这个选项用命令。
--backpressure  添加额外的操作在作业的中间引起服务反压的情况在偶数分钟期间例如:10:12期间,而不是10:13期间。这个可以通过检测网络指标来观察 像:outputQueueLength 和 outPoolUsage。并且或者通过flink 的webui中可用的反压监控来观察。

Docker Playgrounds的更多相关文章

  1. Flink1.10全文跟读翻译

    前言 突然的一个想法,我想把flink官网英语版全部看一遍翻译出来,并且带上自己的理解.自己不是什么大神,只是想这样做一遍,有人说不是有中文版,因为我自己想练习一下英语和对flink的理解吧!工作是一 ...

  2. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  3. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  4. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  5. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  6. docker for mac 学习记录

    docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...

  7. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  8. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  9. 开发者的利器:Docker 理解与使用

    困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...

随机推荐

  1. Parrot os配置源更新

    每次都是忘了怎么配置,去官网查文档,这记一下 一.源文件配置注意 首先要注意Parrot官方软件库的默认更新源文件不在 /etc/apt/sources.list 而是 /etc/apt/source ...

  2. jupyter notebook 安装扩展nbextensions

    安装nbextensions可提高jupyter notebook效率,安装步骤如下: 1.pip 方式安装: (gluon) [root@localhost ~]# pip install jupy ...

  3. Rocket - tilelink - Bits vs. UInt

    https://mp.weixin.qq.com/s/lzDmIHkUph3b1Fxgx66ySg   分析移位/取反操作在Intellij中提示错误的问题.   1. 问题   用到移位/取反的地方 ...

  4. css引入方式和基本样式

    css的三种引入方式: 1.内嵌:直接在标签中添加style属性 格式:<标签名 style="样式1:样式值1:样式2=样式值2:"></标签名> 2.内 ...

  5. Java实现 LeetCode 784 字母大小写全排列(DFS)

    784. 字母大小写全排列 给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串.返回所有可能得到的字符串集合. 示例: 输入: S = "a1b2" ...

  6. Java实现 蓝桥杯 图书排列(全排列)

    标题:图书排列 将编号为1~10的10本书排放在书架上,要求编号相邻的书不能放在相邻的位置. 请计算一共有多少种不同的排列方案. 注意,需要提交的是一个整数,不要填写任何多余的内容. 9 9 10 9 ...

  7. Java实现 LeetCode 127 单词接龙

    127. 单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字 ...

  8. Java实现 LeetCode 122 买卖股票的最佳时机 II

    122. 买卖股票的最佳时机 II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意: ...

  9. Java实现 蓝桥杯VIP 算法提高 阮小二买彩票

    算法提高 阮小二买彩票 时间限制:1.0s 内存限制:512.0MB 问题描述 在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否 ...

  10. java实现第三届蓝桥杯拼音字母

    拼音字母 在很多软件中,输入拼音的首写字母就可以快速定位到某个词条.比如,在铁路售票软件中,输入: "bj"就可以定位到"北京".怎样在自己的软件中实现这个功能 ...