Flink 结构认识
Flink 概述
-
flink 是什么
官网:https://flink.apache.org/Apache Flink 是一个开源的分布式,高性能,高可用,准确的流处理框架。支持实时流处理和批处理。
Apache Flink 是一个框架和分布式处理引擎,用于在无界和有界数据流上进行有状态的计算。Flink 被设计用于在所有常见的集群环境中运行,以内存形式和任何规模执行计算。
数据源:- Clicks:点击流
- Logs:日志,实时发现错误信息
- IOT:物联网 如小米手环
- Transactions:交易数据 下单,付款
输出位置:
- Application:应用 比如邮件的 api,短信的 api
- Event Log:消息队列 为下一个 flink的输入
- DataBase:数据库
资源调度:
K8s,yarn,Mesos
存储:
HDFS,S3,NFS
-
有界和无界数据(Unbounded and Bounded data)
无界数据无界流有一个开始,但没有定义的结束。它们不会在生成数据时终止并提供数据。必须连续处理无边界流,即,事件在被摄入后必须立即处理。等待所有输入数据到达是不可能的,因为输入是无界的,并且不会在任何时间点完成。处理无界数据通常需要以特定的顺序接收事件,例如事件发生的顺序,以便能够推断出结果的完整性。
有界数据
有一个定义好的开始和结束。在执行任何计算之前,可以通过摄取所有数据来处理有界流。处理有界流不需要有序摄取,因为有界数据集总是可以排序的。有界流的处理也称为批处理
-
批处理和流处理(Batch and Streaming)
批处理数据的批处理,可以理解为一系列相关联的任务顺序(或并行)一个接一个的执行,批处理关注事件时间。
输入:是一段时间内以及存收集保存好的数据。
输出:可以作为下一批处理的输入
批处理架构应用: 日志分析、计费程序、数据仓库定时分析
流处理数据的流处理可以理解为系统需要接受并处理一系列不断变化的数据。如:会员权益营销系统
流处理的输入数据是无边界数据,流处理视业务场景关注事件世间还是处理时间。
流处理架构应用:实时监控、实时商业智能、终端销售系统。
Flink 接口的层级(FlinkLayer API)
-
状态事件驱动的 api
Processfunction 是 Flink 提供的最富表现力的函数接口。Flink 提供 processfunction 来处理来自一个或两个输入流等时间。Process 函数提供了对时间和状态的细粒度控制。ProcessFunction 可以任意修改它的状态并注册定时器,从而在将来触发回调函数。因此,ProcessFunction 可以根据许多有状态事件驱动的应用程序的需要实现每个时间的复杂业务逻辑。
-
流或批处理的 api
DataStream API 为许多常见的流处理操作提供基本类型,比如窗口化、一次记录转换和通过查询外部数据存储来丰富事件。DataStream API 可用于 Java 和 Scala ,它基于 map()、reduce()、和 aggregate()等函数。函数可以通过扩展接口或作为 Java 或者 Scala lanbda 函数来定义。
-
高级别的 api(sql 或 table)
Flink 有两个关系 API,表 API 和 SQL 。这两个 api 都是用于批处理和流处理的统一 api ,即,查询在无界或有界数据、并进行相应执行,并产生相同的结果。表 API 和 SQL 利用 Apache sql 解析器进行解析、验证和查询优化。他们可以与 DataStream 和 DataSet 无缝集成,并支持用户定义的变量、聚合和表值函数。
总结:三种 api 各有优缺点,现在用的最多是第二种 api,sql 和 table 的还不太成熟,有些还不能实现。
Flink 运行程序多样化
部署应用程序在任何地方
Apache Flink 是一个分布式系统,需要计算资源才能执行应用程序。Flink 集成了所有常见的集群资源管理器,如 Hadoop yarn、Apache Mesos 和 Kubernetes,同样也可以设置为作为独立集群运行。
Flink 被设计为能够很好地工作于前面列出的每个资源管理器。这是通过特定于资源管理器的部署模式实现的,该模式允许 Flink 以其惯用的方式与每个资源管理器交互。
在部署 Flink 应用程序时,Flink 根据应用程序配置的并行性自动标识所需的资源,并从资源管理器中请求他们。如果发生故障,Flink 通过请求新的资源来替换失败的容器。所有提交或控制应用程序的通信都是通过 REST 调用进行的。这简化了 Flink 集成的难度。
以任何规模运行应用程序Flink 设计用于在任何规模上运行状态流应用程序。应用程序可能被并行化为数千个任务,这些任务分布在集群中并同时执行。因此,一个应用程序可以利用几乎无限数量的 cpu、主内存、磁盘和网络 IO 。此外,Flink 很容易维护非常大的应用程序状态。它的异步和增量检查点算法保证一次状态一致性的同时,确保对处理延迟的影响最小。用户报告了在他们的生产环境中运行的 Flink 应用程序令人印象深刻的可伸缩数字,例如每天处理数万亿事件的应用程序,维护多个 tb 级状态的应用程序,以及在数千个内核上的应用程序。
Flink VS Storm VS SparkStreaming
SparkStreaming
Spark 已经成为批处理中 hadoop 的真正继承者,也是第一个完全支持 Lambda 架构的框架。受到各大企业欢迎,并被广泛采用。2.0 版本之后,spark 除了 Structured Streaming 之外,还配备了许多优秀的功能,如定制内存管理(与 flink 类似)tungsten、watermarks、event time processing 支持等。结构化流也更抽象,并且可以选择在微批处理之间切换 2.3.0 版本中的连续流模式。连续流有望像 Storm 和 Flink 那样提供低延迟,但它仍处于初始阶段,需要在操作中进行测试。
优点:
支持 Lambda 架构;高吞吐量,适用于不需要低延迟的应用场景;由于微批次性质,默认情况下容错;简单易用的高级 API ;社区活跃,且积极的改进;数据处理有且只有一次。
缺点:
不是真正的流处理,不适合低延迟要求;要调整的参数太多,很难做到最好;在许多高级功能落后于 Flink;
备注:
Watermarks:可以把它理解为一个水位线,这个 Watermarks 在不断的变化,一旦 Watermarks 大于了某个 window 的end_time,就会触发此 window 的计算,Watermarks 就是用来触发 window 计算的。
Storm:
Storm 是最老的流处理框架,技术成熟可靠。社区也很活跃。阿里还开发了 jstorm,对storm 进行了拓展完善,后续 jstorm 也融入到 storm 中,对于 storm 也是一个质的提升。比较适用与基于事件的一些简单用例场景,极低的延迟,真正的流处理,成熟和高吞吐量,非常适合非复杂的流处理用例。
缺点:
不支持状态管理,没有事件时间处理,聚合,窗口,会话,水印等高级功能,至少保证一次。
flink:
和 Spark 一样,Flink 也支持 lambda 架构。但是这种方法和实现与 Spark 的方法和实现完全不同。虽然 Spark 实际上是 Spark-Streaming 作为微批处理和 Spark Batch 特殊情况的批处理,但 Flink 本质上是一个真正的流引擎,将批处理作为带有限数据的流的特殊情况。虽然两个框架中的 API 从开发人员的角度来看都很相似,但它们在实现中没有任何相似之处。在 Flink 中,map,filter,reduce 等各个函数实现为长时间运行的运算符(类似于 Storm 中的 Bolt),Flink看起来更像是 Storm 的真正继承者,就像 Spark 成功批量使用 hadoop 一样。
优点:
开源流处理领域的创新领导者;第一个真正的流处理框架,具有 Event Time Pricessing,Watermarks 等所有高级功能;低延迟,高吞吐量,可根据要求进行配置;自动调整,需要调整的参数较少,调优方便;数据处理有且只有一次,得到想阿里巴巴等大公司的广泛接受。
缺点:
社区没有 Spark 那么大,但是正在快速增长;目前还没有采用 Flink Batch,仅适用于流处理。
总结:
所以 sparkstreaming 不是真正的流处理框架,storm 和 flink 是真正的流处理框架,flink 相比较 storm 而言是可以处理批处理的,但是 storm 是不支持批处理的。
Flink 的应用场景
事件驱动
典型的事件驱动的场景如下:
- 欺诈检测(Fraud detection)如 短信获取
- 异常检测((Anomaly detection)
- 基于规则的警告(Rule-based alerting)
- 业务流程监控(Business process monitoring)
- Web 应用程序(社交网络)如 互相关注,互相@
数据分析
Data Analytics Applications 包含 Batch analytics (批处理分析) 和 Streaming anlytics (流处理分析)。
Streaming analytics 可以理解为连续性查询:比如实时展示双十一天猫销售 GMV,用户下单数据需要实时写入消息队列,Flink 应用源源不断的读取数据做实时计算,然后不断的将数据更新至 Databases 或者 K-VStore,最后做大屏实时展示。
数据管道 ETL
Data Pipeline Applications 包含 Periodis(周期性)RTL 和 Data Pipeline(管道)。
Periodic ETL:比如每天凌晨周期性的启动一个 Flink RTL Job 读取传统数据库中的数据,然后做 ETL ,最后写入数据库和文件系统。
Data Pipeline:比如启动一个 Flink 实时应用,数据源(比如数据库、kafka)中的数据不断通过Flink Data Pipeline 流入或者追加到数据仓库(数据库或者文件系统),或者 kafka 消息队列。
Periodic (周期性)ETL和Data Pipeline(管道)
具体的应用分析
Flink 部署
standalone 模式
- tar -zxvf flink-1.7.0-bin-hadoop27-scala_2.11.tgz 解压安装包
- 修改 flink/conf/flink-conf.yaml 文件
jobmanager.rpc.address: hostname - 修改 /conf/slave 文件
添加集群中其他虚拟机的 hostname - 分发到另外几台
scp -r /opt/flink hostname:/opt/ - 在主节点启动
start-cluster.sh
- 页面访问
hostname:8081