精通flink读书笔记(1)

很多人已经用上了spark,所以人们往往有个疑问,问啥还要用flink呢?
首先我们理解flink是基于流处理,是一个真正的流处理引擎,不是一个基于微批处理的引擎。批处理在flink看来反而是一种特殊情况。
下图是flink的结构

flink是一个分层的体系结构。flink可以运行在本地,也可以运行在yarn或者是云主机上。Runtime是flink的核心数据处理引擎,它通过JobGraph的api来接受任务。
JobGraph是一个任务集合,该集合可以产生和消费数据流。
DataStream和DateSet是用来定义Job的接口。JobGrahp就是通过DataStream和DataSet来产生的。当任务提交完后,DataSet也会产生一个优化器来产生一个执行计划,DataStream也会产生一个流的优化执行器。
已经优化过的JobGraph会通过yarn或者local等模式向executor提交。

flink也有分布式结构:
flink的分布式结构包含两个组件:master和worker  ,当任务提交后,会有如下几个角色:Job Mangager  ,Task Manager ,Job Client

flink 的项目要向Job Client提交,JobClient 接着会向Job Manager提交任务,Job Manager的工作就是资源分配和任务调度。它的首要任务就是看需要多少资源,如果资源足够,就会把任务提交给Task Manager,Task Manager初始化线程开启任务,并向Job Manager报告执行情况,一旦工作执行完毕,结果会向client汇集。
JobManager
master 也被称作JobManager,用于协同和管理程序项目的execution,调度任务,管理checkpoint,任务重启等等
master也有主备机制。
JobManager包括一下几个部分: Actor system,scheduler,checkpoint
Flink是用Akka作为JobManager和Task Manager之间的通信。
Actor System
actor system是一个各种任务角色的actor容器系统。它提供任务调度,配置,日志,线程池等等。而且每个actor相互通信通过邮箱,如果是在本地模式下,通信的信息是存储在共享内存中,如果是actors是在远程,则通过RPC来通信。
在actor system中的actors都是分层分布的 actor有它的父actor,父actor是子actor的监管者,如果子actor出现错误了就去解决,如果父actor自己解决不了,就会向它自己的父actor传递信息。

在flink中,一个actor是一个含有状态和行为的容器,它的状态和行为是受它接受到的信息所决定的。
scheduler
在flink中,executors 被看做task slot,每一个task manager可以管理一个或多个task slot,一个任务被放到一个共享的slot中还是一个特定slot中,是通过slotSharingGroup 和CoLocationGroup定义的。
Check Point
checkpoint是个snapshot,通常数据的状态信息是存放在一个配置好的地方,如hdfs,万一失败了,flink停止executor并重新从最新的checkpoint开始
而Stream barriers是snapshot的核心要素。barriers被输入到流中,但是不会影响流,barriers会把一组消息合成一个snapshot,而且每个barrier有一个唯一的id。如下图

每个snapshot的状态会上报到jobmanager的checkpoint协调器。同时要记录下这个snapshot,Flink要对齐记录是为了在重启服务时能避免重新处理同样的数据。
对齐的操作通常会消耗几毫秒。如果对实时性要求极高,可以关闭这个功能。
Task manager
task manager是一个worker节点,用于执行操作JVM里的tasks。并行的task执行靠的是task slots。如果task manager有4个task slot,则每个task slot会要求25%的内存资源。 多个线程在处理同一个slot的任务中会共享JVM,同一个slot中的task也会共享TCP连接和心跳通信。
Job Client
job client并不是flink的一部分,但是确实执行的起点。
val text = env.readTextFile("input.txt")  
val counts = text.flatMap{_.toLowerCase.split("\\W+") filter {_.nonEmpty}}
                 .map{(_,1)}
                 .groupBy(0)
                 .sum(1)
counts.writeAsCsv("output.txt","\n"," ")
job Client 会把客户提交的上述代码转化为data flow.data flow默认是并行和分布式的。数据流会以one-to-one 或者是  re-distributed的方式来做。

猜你喜欢

转载自blog.csdn.net/yyqq188/article/details/79496206
今日推荐