一、 定义
Flink是一个分布式大数据处理引擎,可对有界或无界的数据流进行有状态或无状态的计算,具有低延迟、高吞吐、事件精确一次处理的特点。
对定义中的基本术语理解如下:
-
streams(数据流)
有界数据流 是指批处理,无界数据流 是指实时流处理,flink实现了流批一体,它的世界观里一切皆是流 -
state(状态)
状态计算 是指需要记录中间结果信息的计算操作,有状态的作用:
1)输出多个事件处理后的结果,根据最新输入的事件及已存储的状态值,更新当前最新的状态值
2)容错性 通过持久化存储,保证系统运行失败或者挂掉的情况下做到exactly-once
无状态计算只关注当前输入的事件,即根据当前事件输出结果,显然flink更偏爱有状态计算 -
流计算时增加了以下时间语义:
1)event time 事件创建的时间,通常由事件消息里带的时间字段表示(业务最常用)
2)ingestion time 接入时间 指从flink source进来的时间
3)process time 处理时间 指操作算子的本地服务器时间(默认使用) -
API 通常分为三层
自下向上看:
ProcessFunction 最底层API,表达能力最强,过程函数process function 通常和DataStreamAPI结合使用,允许用户自由处理事件 如:用户可以指定时间语义注册定时器并处理回调,从而可以处理复杂的计算
DataStreamAPI 流处理API DataStreamAPI 处理无界流数据,DataSetAPI 处理有界数据集(还提供了额外的数据支持,如循环和迭代)
Table API/SQL Table API可以内嵌Java、Scala,以表为中心的声明式编程,遵循扩展的关系模型(表有schema),最高层级的抽象是SQL,可以通过SQL语句在TableAPI创建的临时表或者视图上操作
二、架构
-
flink在yarn上的部署方式
1)per job模式 :运行一个单独的job,一旦job结束,flink集群停止,释放所有资源, 推荐在生产环境部署该模式,该模式应用提交流程如下
提交应用指令:
./bin/flink run -m yarn-cluster ./path/to/job.jar
-m yarn-cluster指定提交的主机为yarn集群,可以添加其它参数2)session模式:运行多个job,slot会出现共有,job之间的隔离性不好,该模式应用提交流程如下
提交应用指令:
#启动会话
./bin/yarn-session.sh
#向会话提交作业
./bin/flink run ./path/to/job.jar -
运行组件
1)Jobmanager 作业管理器
一个application对应一个Jobmanager ,负责将应用程序作业图(JobGraph)转换成物理执行图(ExecutionGraph),分发到将要运行任务的TaskManager上,在任务执行中,同时负责协调操作,比如检查点(checkpoints)的协调
2)Taskmanager 任务管理器
一个Taskmanager至少有一个插槽(slot),slots数量决定了任务的并发数
3)ResourceManager 资源管理器
负责管理的Taskmanager的资源slots
4)Dispatcher 分发器
接收一个提交的应用时,会启动相应的作业管理器JobManager,在yarn的session模式部署时才会有该组件
- 数据传输
flink算子数据传输有两种形式:
1、one-to-one 即按照顺序一对一传输,此类算子有map、filter、flatMap
2、redistributing 一对多传输,类似spark中的shuffle
为了提升数据传输性能,flink引入任务链的优化技术,及一对一、并行度相同的算子可以合成一个子任务在一个slot(线程)上执行,类似于spark中的stage
三、使用场景
- 实时数仓 通过实时ETL对数据清洗,然后写入下游的实时数仓,保证实时数据采集、实时数据处理及下游的实时查询
- 实时推荐
- 实时大屏、实时报表
- 风控预警 将风控系统处理的各种复杂规则引入到DataStreamAPI或者ProcessFunction API中,当事件进入就会触发相应的规则,然后进行预警并发送到下游产生业务通知