简介
是一个框架和分布式处理引擎 用于对有界和无界数据流进行状态计算 基于流的世界观 一切都是由流组成的 离线数据是有界的流 实时数据是一个没有界限的流 这就是所谓的有界流和无界流
安装
tar -zxvf flink-1.11.2-bin-scala_2.12.tgz -C /opt/module/ cd /opt/module/flink-1.11.2
启动 bin/start-cluster.sh
Flink流处理api
environment
source
transform
api
窗口函数 window
窗口函数定义了要对窗口中收集的数据做的计算操作 可以分为两类
增量聚合函数 每条数据到来进行计算 保持一个简单的状态 reduceFunction AggregateFunction 全窗口函数 先把窗口所有数据收集起来 等到计算的时候会遍历所有数据 ProcessWindowFunction
Flink的重要特点
事件驱动型(Event-driver)
一类有转台的应用 从一个或多个事件流提取数据 并根据到来的事件触发计算 状态更新或其他外部动作
优势:对数据更敏感 延迟更低
流与批的世界观
- 批处理的特点是 有界 持久 大量 非常需要访问全套记录才能完成 一般用于离线统计
- 流处理的特点就是 无界 实时 无需 针对整个数据进行操作 而是对通过系统传输的每个数据项执行操作 一般用于 实时统计
- SPARK 一切由批组成 离线数据是一个大批次 实时数据是一个一个无限的小批次组成
- FLINK 一切由流组成 离线数据是有界限的流 实时数据是一个没有界限的流
以流为世界观的架构获得的最大好处就是具有极低的延迟
分层的api
- 高层 SQL/TABLE API(dynamic tables)
- DataStream API(stream,windows)
- ProcessFunction(event,state,time)
最底层抽象仅仅提供了有状态流 它将通过过程函数(ProcessFunction) 与DataStream API相集成 使其对某些特定的操作进行底层的抽象
允许用户可以自由地处理来自一个或多个数据流的事 并使一致的容错状态 用户可以注册事件时间并处理时间回调 从而使程序可以处理复杂的运算
越顶层越抽象 表达含义越简明 使用越方便
越底层越具体 变大能力越丰富 使用越灵活
有状态计算
在流计算过程中 将算子的中间结果保存在内存或者文件系统中 等下一个事件进入算子后可以让当前事件的值与历史值进行汇总累计
state:
- operator state :存储算子操作状态 保持数据一致性
- keyed state: 存储业务数据的值
简介:参考传统的数据库事务处理 用内存代替硬盘上的持久化文件 内存担任数据库的角色
又因为程序运行过后内存释放 加了定期持久化在磁盘的操作
状态一致性分类
- at-most-once 当任务故障时 最简单做法是什么都不干 即不恢复丢失的状态 也不重播丢失的数据
- at-list-once 在大多数真实应用场景 希望不丢失时间 这种类型的保障 称为at-list-once
- exactly-once 恰好处理一次是最严格的保证 也是最难实现的 签好处理一次语义 不仅仅意味着没有事件丢失 还意味着针对每一个数据 内部状态仅仅更新一次
端到端exactly-once
内部保证-checkpoint source端-可重设数据的读取位置 sink端-从故障恢复时 数据不会重复写入外部系统 幂等写入 事务写入
预写日志
把结果数据先当成状态保存 然后再收到checkpoint完成的通知时 一次性写入sink系统
简单易于实现 由于数据提前在状态后端中做了缓存 所以无论身么sink系统 都能用这种方式一批搞定 DataStream api提供了一个模板类 GenericWriteAheadSink' 来实现这种事务型sink
支持事件时间(EventTime)
目前大多数框架时间窗口计算 都是采用当前系统时间 以时间为单位进行聚合计算只能反映数据到达计算引擎的时间 而不是实际业务时间
Flink主要工作:
- 从外部获取获取实时数据
- 对数据进行实时处理
- 时间驱动型应用
- 流处理的流水线
- 流或者批数据分析
- 处理完成的数据传输到外部
- 应用
- 事件日志
- 数据库 文件系统 键值存储等
Flink应用场景
- 电商和市场营销
- 实时报表
- 广告投放
- 实时推荐
- 物联网
- 实时数据采集
- 实时报警
- 物流配送及服务
- 订单状态跟踪
- 信息推送
- 银行和金融业
- 实时结算
- 风险检测
redis最快 但是 成本很高 在数据大量情况下 受限
分析处理:数量大但离线
OLTP:在线实时事务处理
OLAP:在线大量分析处理