定义: Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行计算。
为什么选择Flink:
- 流数据更真实反应了我们的生活方式
- 传统的数据架构都是基于有限数据集的
- 低延迟,高吞吐,结果的正确性和良好的容错性
主要特点:事件驱动,基于流的世界观(离线数据是有界流,实时数据是无界流)
部署方式
Standalone模式
- 下载flink
- fink-conf.yaml的配置文件阅读
# JobManager runs.
jobmanager.rpc.address: localhost
# The RPC port where the JobManager is reachable.
jobmanager.rpc.port: 6123
# The total process memory size for the JobManager.
#
# Note this accounts for all memory usage within the JobManager process, including JVM metaspace and other overhead.
jobmanager.memory.process.size: 1600m
# The total process memory size for the TaskManager.
#
# Note this accounts for all memory usage within the TaskManager process, including JVM metaspace and other overhead.
taskmanager.memory.process.size: 1728m
# To exclude JVM metaspace and overhead, please, use total Flink memory size instead of 'taskmanager.memory.process.size'.
# It is not recommended to set both 'taskmanager.memory.process.size' and Flink memory.
#
# taskmanager.memory.flink.size: 1280m
# The number of task slots that each TaskManager offers. Each slot runs one parallel pipeline.
taskmanager.numberOfTaskSlots: 1
# The parallelism used for programs that did not specify and other parallelism.
# 默认并行度
parallelism.default: 1
-
启动集群
./start-cluster.sh
连接本机端口号 nc -lk port -
本地shell脚本执行jar包时
/bin/flink run -c com.sofency.top.StreamWordCount -p 3 wordcount.jar --host localhost --port 7777
-
展示运行的任务
/bin/flink list
-
取消任务
/bin/flink cancel 312421241ds34s4cf5yf7h6
Yarn模式
单机模式的缺点:需要手动分配资源才能让任务运行
以Yarn模式部署Flink任务时,要求Flink是有Hadoop支持的版本,Hadoop的环境需要保持版本在2.2以上,并且集群中安装有HDFS服务。
Flink提供了两种在yarn上运行的模式,分别为Session-Cluster和Per-Job-Cluster模式
- Session-Cluster模式
Session-Cluster模式需要先启动集群,然后再提交作业,接着会向yarn申请一块空间后,资源永远保持不变。如果资源满了,下一个作业就无法提交,只能等到yarn中的其中一个作业执行完成后,释放了资源,下一个作业才会正常提交。所有作业共享Dispatcher和ResourceManager;共享资源适合规模小执行时间短的作业。
在yarn中初始化一个flink集群,开辟指定的资源,以后提交的任务都向这里提交,这个flink集群会常驻在yarn集群中,除非手工停止。
启动步骤:- 启动hadoop集群
- 启动yarn-session
./yarn-session.sh -n 2 -s 2 -jm 1024 -tm 1024 -nm test -d
其中:
-n(–container)TaskManager的数量
-s(–slots)每个TaskManager的slot数量,默认一个slot一个core,默认每个taskmanager的slot的个数为1,有时可以多一些taskmanager
-jm: JobManager的内存(单位MB)
-tm:每个TaskManager的内存(单位MB)
-nm:yarn的appName(现在yarn的ui上的名字)
-d:后台运行 - 执行任务
/bin/flink run -c com.sofency.top.StreamWordCount -p 3 wordcount.jar --host localhost --port 7777
- 去yarn控制台查看任务状态
- 取消yarn-session
yarn application --kill application_21212121_0001
- Per-Job-Cluster模式
一个Job会对应一个集群,每提交一个作业会根据自身的情况,都会单独向yarn申请资源,直到作业执行完成,一个作业的失败与否并不会影响下一个作业的正常提交和运行,独享Dispatcher和ResourceManager,按需接受资源申请;适合大规模长时间运行的作业。
每次提交都会创建一个新的flink集群,任务之间互相独立,互不影响,方便管理,任务执行完成后创建的集群也会消失
启动步骤:
- 启动hadoop集群
- 直接启动job
/bin/flink run -m yarn-cluster -c com.sofency.top.StreamWordCount -p 3 wordcount.jar --host localhost --port 7777
运行架构
主要任务:运行组件,任务提交流程,任务调度原理
-
运行组件
- 作业管理器:JobManager
- 控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的JobManager所控制执行。
- JobManager会先接收要执行的应用程序,这个应用程序会包括:作业图,逻辑数据流图和打包了所有的类、库和其他资源的JAR包。
- JobManager会把作业图转换成一个物理层面的数据流图,这个图被叫做执行图,包含了所有可以J并发执行的任务。
- JobManager会向资源管理器请求执行任务必要的资源,也就是任务管理器上的slot,一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的TaskManager上,而在运行过程中JobManager会负责所有需要中央协调的操作,比如检查点的协调。
- 任务管理器:TaskManager
- Flink中的工作进程,通常在flink中会有多个TaskManager运行,每一个TaskManager都包含了一定数量的插槽,插槽的数量限制了TaskManager能够执行的任务数量。
- 启动之后,TaskManager会向资源管理器注册它的插槽;收到资源管理器的指令后,TaskManager就会将一个或多个插槽提供给JobManager调用,JobManager就可以向插槽分配任务来执行。
- 在执行过程中,一个TaskManager可以跟运行统一应用程序的TaskManager交换数据。
- 资源管理器:ResourceManager
- 主要负责管理任务管理器(TaskManager)的插槽(slot)TaskManager插槽是flink中定义的处理资源单元。
- Flink为不同的环境和资源管理工具提供了不同资源管理器,比如YARN,Mesos,K8s以及stanalone部署。
- 当JobManager申请插槽资源时,ResourceManager会将有空间插槽的TaskManager分配给JobManager。如果ResourceManager没有足够的插槽来满足JobManager的请求,它可以向资源提供平台发起会话,以提供启动TaskManager进程的容器。
- 分发器:Dispatcher
- 可以跨作业运行,它为应用提交提供了REST接口。
- 当一个应用被提交执行时, 分发器就会启动并将应用移交给一个JobManager。
- Dispatcher也会启动一个Web UI,用来方便的展示和监控作业执行的信息。
- Dispatcher在架构中可能并不是必须的,这取决于应用提交运行的方式。
- 作业管理器:JobManager
-
任务提交流程。
-
任务调度原理
并行度:一个特定算子的子任务的个数被称为其并行度。
Flink中每一个TaskManager都是一个JVM进程,他可能会在独立的线程上执行一个或多个子任务。
为了控制一个TaskManager能接收多少个task,TaskManager通过task slot来控制 (配置文件中的numberOfSlots
默认情况下。Flink允许子任务共享slot,即使他们是不同任务的子任务,这样的结果是,一个slot可以保存作业的整个管道。
Task Slot是静态的概念,是指TaskManager的并发执行能力。设置slotSharingGroup 共享组