【征服松鼠】Flink on YARN验证笔记

关于Flink

Flink架构

Flink是一种流式计算框架,与Spark的“微批”设计理念不同,Flink则将数据看作无限的和有限的数据流,支持对数据流进行逐条或者窗口式处理,从而保证数据处理延迟可以达到毫秒级。同时基于有限流的设想,Flink还可以实现数据的批量处理,实现了流批一体。可以说完全基于数据流的设计理念,一举将Spark打的体无完肤,从而可以说目前Flink成为各大厂商的流式数据处理的标配。

Flink集群采用的是主从架构,JobManager作为集群的主节点,负责集群任务调度以及资源管理的任务。TaskManager作为集群的从节点,负责接受JobManager分派的执行任务,为集群提供计算资源。

Flink提供了多种部署模式,包括Standalone、YARN、Mesos、K8S、Docker等。针对不同的部署方式,Flink集群的运行时态架构不太一样,但是核心部署架构还是保持一致的,即JobManager+TaskManager的组合。

与YARN一致,为了解决主节点的单点问题,Flink也需要解决JobManager的单点问题。针对Standalone的部署模式,需要部署多个JobManager节点通过主备模式实现高可用;如果是将Flink集群托管给YARN进行管理,则可以借助YARN集群的AM恢复机制来实现JobManager的高可用。

Flink on YARN

Flink可以运行在YARN集群中,也是基于Job Manager+TaskManager来对外提供服务。在YARN中,JobManager将内嵌在Flink应用的AM中,负责处理client端提交的Flink JOB。而TaskManager将运行在Yarn Container中,提供计算能力。

Flink在YARN集群上支持三种部署模式:Session模式、Per-job模式以及Application模式。

Session模式

Session模式的原理与Standalone模式相似,只不过是将Flink集群运行在YARN集群提供的Container中。在这种模式下,Flink将基于client的请求动态进行TaskManager的申请和回收。

这种模式的优势在于与standalone模式保持了一致的体验,同时Yarn集群又提供了Container节点的自动恢复能力,即TaskManager进程挂掉之后,AM(JobManager)能够自动把它拉起来。劣势也是standalone的劣势,就是会产生资源竞争,所有任务也都在一个Flink集群实例当中,日志混淆在了一起,不太便于日志排查和分析。

启动yarn-session

yarn-session.sh -jm <jm-memory> -tm <tm-memory> -s <slots-per-taskmanager> -z <zk-namespace> -nm <app-name> -d

提交Job

在yarn-session模式下,提交job的方式与standalone模式一致。只不过区别在于,遵循的是yarn-cluster模式的命令参数组合,即可以通过-yD进行参数传递。

flink run -yD <xxx>=<xxx> -c <classname> -d <jar-file> <arguments>

停止job

与standalone模式一致,可以通过以下命令:

flink cancel <job-id>

停止yarn-session

两种方式:

  • 命令退出:echo "stop" | ./bin/yarn-session.sh -id <appId>
  • Attach方式:yarn-session.sh -id <appId> 然后通过ctrl+C来退出

高可用配置

high-availability: zookeeper
high-availability.zookeeper.quorum: localhost:2181
high-availability.storageDir: hdfs:///flink/recovery
high-availability.zookeeper.path.root: /flink
yarn.application-attempts: 10

探秘

经过研读源码,在启动yarn-session时,系统首先会检测是否在${yarn.properties-file.location}文件夹下存在yarn配置文件,在配置文件中存放的是flink应用的applicationId信息。

这样我们在执行 flink run命令后,就可以通过appId连接到Flink集群,从而将应用提交到yarn-session的flink 集群中。

Per-Job 模式

Per-Job 模式是指每个Flink Job都是一组独立集群,即有自己的JobManager和TaskManager。提交任务后,YARN首先会为该任务分派一个AM容器,该容器内会运行一个JobManager进程,之后JobManager会向Yarn申请运行TaskManager所需要的container,container的数量和container的配置(CPU、内存)会基于客户端的需求来确定,当JobManager和TaskManager进程都拉起来之后,则会执行相应的Flink Job。这样,与Standalone以及yarn-session不同的是,我们不需要准备一个常驻的Flink 集群进程,只需要保证本地有一个Flink环境即可,Flink集群是在我们提交Job时动态创建出来的。

这种方式的优势在于每个任务独立运行,相互不会收到干扰,这个不干扰还包括了运行日志也是隔离的。另外,借助YARN集群的能力,提供了对Flink Job的全方位保障,包括JobManager的高可用,TaskManager的恢复,然后再结合Flink自身提供的健壮性,包括检查点、保存点机制,从而能够很好的保障Flink Job的高可用和健壮性。劣势的话,就是保证了资源隔离的同时也占用了更多的资源,因为每个Job都需要一个JobManager,每个JobManager都会消耗一个AM进程资源。

提交Job

flink run -d -m yarn-cluster -ys <slots-per-taskmanager> -yD yarn.containers.vcores=2 -yD <xxx>=<xxx> -ynm <app-name> -ytm <tm-memory> -yjm <jm-memory> -c <class> <jar-file> <arguments>

其中 -m yarn-cluster 为固定写法【针对1.11版本】,通过阅读源码,Flink内部时通过提取-m中是否存在yarn-cluster标识来确定是否时per-job模式的。

停止Job

flink list -yid <appId>

flink cancel <jobId> -yid <appId>

探秘

之前一直好奇都是执行flink run命令,flink是如何区分是standalone、yarn-session还是per-job的,研读源码之后发现,相关的判断逻辑主要是在flink-client的工程中做的,首先会筛选应用Client进行Flink Job的启动,包括 GenericCLI、FlinkYarnSessionCli、DefaultCLI。如果在启动命令中包含 -m yarn-cluster 参数的话,则FlinkYarnSessionCli将被启用,从而顺利的开始执行后续的Per-job模式的启动流程。

Application模式

application模式与per-job模式类似,也是每个Job一个独立的Flink集群。与per-job的区别在于Flink Job的main函数的执行位置。Per-job的执行位置实在提交任务的客户端所在机器,需要进行JobGragh的生成与提交;而Application模式是在JobManaer侧执行,也就是在Yarn的AM中执行的,这样就可以释放clien侧的资源占用。另外,application模式可以从HDFS加载flink job相关jar文件,这样可以避免相关Jar文件的重复加载。

这种模式的优势的话与per-job是一致的,而且相比per-job还提供了远端启动job、jar包共享等优势,是一种更先进的部署模式。劣势与perjob是一致的。

启动Job

flink run-application -t yarn-application -Dtaskmanager.numberOfTaskSlots=2 -Dyarn.application.name=<xxx> -Dyarn.container.vcores=<xxx> -Dyarn.provided.lib.dirs=<hdfs-path> -Dtaskmanager.memory.process.size=2048m -Dstate.checkpoints.dir=<hdfs-path>/<job-name> -Dstate.saveponits.dir=<hdfs-path>/<job-name> -c <class> <jar-file> <arguments>

停止Job

flink list -yid=<appId>

flink cancel 00000000000000000000000000000000 -yid <appId>

探秘

application模式,flink client采用的是GenericCLI,也就是遵循的是flink run的Generic Mode的参数体系。相比与per-job的启动参数配置,这里多出了checkpoints和savepoints路径的配置,这是因为在application模式下,开启了HA之后,所有任务的jobid都会固定为 0,这样为了避免各个任务的checkpoints和savepoints存储路径发生冲突,所以需要针对每个Job进行定制。

另外,这种运行模式在运行时,如果依赖于系统变量,则需要在yarn-env中添加,并同时加入到yarn-site.xml的env-whitlist参数中。

HA场景验证

本次验证了各种场景下的Flink on YARN的高可用场景,包括kill TaskManager容器、kill JobManager容器、kill NodeManager进程、kill ResourceManager进程、停止NodeManager进程以及停止ResourceManager进程。针对这些场景,Flink Job都能够做到正常恢复。针对不同的场景,恢复的机制也不太相同。

kill TaskManager容器后,会导致Flink Job的中断;而kill JobManager容器则不会。同样kill NodeManager也会导致相应的job进行中断恢复,而kill ResourceManager则不会(因为我们开启了RM的recovery模式,并且开启了RM的状态存储)。

总结

借助Yarn提供的资源管理能力,能够很好的保护Flink Job的高可用,避免了对于Flink集群的维护。但是实际上针对我们这种全是long running的job,并且需要保证所有任务都得能够启动起来的场景看,YARN处理提供了可靠性保障外,并没有发挥出Yarn的调度策略优势。针对我们单个部门的单个项目而言,引入YARN的成本有些高。毕竟虽然不用维护Flink集群了,但是却引入了YARN集群,哈哈。

经过讨论,YARN集群还是适合在整个公司来应用,是公司的大数据基础设施的一部分,借助Yarn的灵活的调度策略,来对公司的整个大数据资源池进行管控和调度,这样我们在实行flink on yarn就更加轻松了。

当然,目前K8S发展势头很猛,未来Flink的最佳部署实践是不是还是以Yarn为主,还是直接基于K8S还有待进一步学习才行。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容