Flink介绍

举报
Ragnar 发表于 2020/08/25 14:10:55 2020/08/25
【摘要】 Flink是一个批处理和流处理结合的统一计算框架,其核心是一个提供了数据分发以及 并行化计算的流数据处理引擎。它的大亮点是流处理,是业界顶级的开源流处理 引擎。 Flink适合的应用场景是低时延的数据处理(Data Processing)场景:高并发 pipeline处理数据,时延毫秒级,且兼具可靠性。 Flink技术栈如图1-14所示。图 1-14 Flink 技术栈Flink在当前版本中...

Flink是一个批处理和流处理结合的统一计算框架,其核心是一个提供了数据分发以及 并行化计算的流数据处理引擎。它的大亮点是流处理,是业界顶级的开源流处理 引擎。 Flink适合的应用场景是低时延的数据处理(Data Processing)场景:高并发 pipeline处理数据,时延毫秒级,且兼具可靠性。 Flink技术栈如图1-14所示。

图 1-14 Flink 技术栈

Flink.PNG


Flink在当前版本中重点构建如下特性,其他特性继承开源社区,不做增强,具体请参 考:https://ci.apache.org/projects/flink/flink-docs-release-1.7/。

● DataStream 

● Checkpoint 

● 窗口 

● Job Pipeline 

● 配置表

架构

Flink架构如图1-15所示。

flink01.PNG


图 1-15 Flink 架构

Flink整个系统包含三个部分: 

● Client Flink Client主要给用户提供向Flink系统提交用户任务(流式作业)的能力。 

● TaskManager Flink系统的业务执行节点,执行具体的用户任务。TaskManager可以有多个,各 个TaskManager都平等。 

● JobManager Flink系统的管理节点,管理所有的TaskManager,并决策用户任务在哪些 Taskmanager执行。JobManager在HA模式下可以有多个,但只有一个主 JobManager。

原理

● Stream & Transformation & Operator

用户实现的Flink程序是由Stream和Transformation这两个基本构建块组成。 a. Stream是一个中间结果数据,而Transformation是一个操作,它对一个或多 个输入Stream进行计算处理,输出一个或多个结果Stream。 b. 当一个Flink程序被执行的时候,它会被映射为Streaming Dataflow。一个 Streaming Dataflow是由一组Stream和Transformation Operator组成,它类 似于一个DAG图,在启动的时候从一个或多个Source Operator开始,结束于 一个或多个Sink Operator。 图1-16为一个由Flink程序映射为Streaming Dataflow的示意图。

图 1-16 Flink DataStream 示例

flink02.PNG

图1-16中“FlinkKafkaConsumer”是一个Source Operator,Map、KeyBy、 TimeWindow、Apply是Transformation Operator,RollingSink是一个Sink Operator。 

● Pipeline Dataflow 在Flink中,程序是并行和分布式的方式运行。一个Stream可以被分成多个Stream 分区(Stream Partitions),一个Operator可以被分成多个Operator Subtask。 Flink内部有一个优化的功能,根据上下游算子的紧密程度来进行优化。 – 紧密度低的算子则不能进行优化,而是将每一个Operator Subtask放在不同 的线程中独立执行。一个Operator的并行度,等于Operator Subtask的个 数,一个Stream的并行度(分区总数)等于生成它的Operator的并行度,如 图1-17所示。

图 1-17 Operator

flink03.PNG

– 紧密度高的算子可以进行优化,优化后可以将多个Operator Subtask串起来 组成一个Operator Chain,实际上就是一个执行链,每个执行链会在 TaskManager上一个独立的线程中执行,如图1-18所示。

图 1-18 Operator chain

flink05.PNG

▪ 图1-18中上半部分表示的是将Source和map两个紧密度高的算子优化后 串成一个Operator Chain,实际上一个Operator Chain就是一个大的 Operator的概念。图中的Operator Chain表示一个Operator,keyBy表 示一个Operator,Sink表示一个Operator,它们通过Stream连接,而每 个Operator在运行时对应一个Task,也就是说图中的上半部分有3个 Operator对应的是3个Task。 ▪ 图1-18中下半部分是上半部分的一个并行版本,对每一个Task都并行化 为多个Subtask,这里只是演示了2个并行度,sink算子是1个并行度。

关键特性

● 流式处理 高吞吐、高性能、低时延的实时流处理引擎,能够提供ms级时延处理能力。 ● 丰富的状态管理 流处理应用需要在一定时间内存储所接收到的事件或中间结果,以供后续某个时 间点访问并进行后续处理。Flink提供了丰富的状态管理相关的特性支持,其中包 括 – 多种基础状态类型:Flink提供了多种不同数据结构的状态支持,如 ValueState、ListState、MapState等。用户可以基于业务模型选择高效、 合适状态类型。 – 丰富的State Backend:State Backend负责管理应用程序的状态,并根据需 要进行checkpoint。Flink提供了不同State Backend,State可以存储在内存 上或RocksDB等上,并支持异步以及增量的checkpoint机制。 – 精确一次语义:Flink的Checkpoint和故障恢复能力保证了任务在故障发生前 后的应用状态一致性,为某些特定的存储支持了事务型输出的功能,及时在 发生故障的情况下,也能够保证精确一次的输出。 ● 丰富的时间语义支持 时间是流处理应用的重要组成部分,对于实时流处理应用来说,基于时间语义的 窗口聚合、检测、匹配等运算是非常常见的。Flink提供了丰富的时间语义支持。 – Event-time:使用事件本身自带的时间戳进行计算,使乱序到达或延迟到达 的事件处理变得更加简单。 – Watermark支持:Flink引入Watermark概念,用以衡量事件时间的发展。 Watermark也为平衡处理时延和数据完整性提供了灵活的保障。当处理带有 Watermark的事件流时,在计算完成之后仍然有相关数据到达时,Flink提供 了多种处理选项,如将数据重定向(side output)或更新之前完成的计算结 果。 – Processing-time和Ingestion-time支持。 – 高度灵活的流式窗口支持:Flink能够支持时间窗口、计数窗口、会话窗口, 以及数据驱动的自定义窗口,可以通过灵活的触发条件定制,实现复杂的流 失计算模式。 ● 容错机制 分布式系统,单个task或节点的崩溃或故障,往往会导致整个任务的失败。Flink 提供了任务级别的容错机制,保证任务在异常发生时不会丢失用户数据,并且能 够自动恢复。 – Checkpoint:Flink基于Checkpoint实现容错,用户可以自定义对整个任务的 Checkpoint策略,当任务出现失败时,可以将任务恢复到近一次 Checkpoint的状态,从数据源重发快照之后的数据。 – Savepoint:一个Savepoint就是应用状态的一致性快照,Savepoint与 Checkpoint机制相似,但Savepoint需要手动触发,Savepoint保证了任务在 升级或迁移时,不丢失掉当前流应用的状态信息,便于任何时间点的任务暂 停和恢复。 ● Flink SQL Table API和SQL借助了Apache Calcite来进行查询的解析,校验以及优化,可以 与DataStream和DataSet API无缝集成,并支持用户自定义的标量函数,聚合函 数以及表值函数。简化数据分析、ETL等应用的定义。下面代码实例展示了如何使 用Flink SQL语句定义一个会话点击量的计数应用。

SELECT userId, COUNT(*) FROM clicks GROUP BY SESSION(clicktime, INTERVAL '30' MINUTE), userId 

● CEP in SQL Flink允许用户在SQL中表示CEP(Complex Event Processing)查询结果以用于模式 匹配,并在Flink上对事件流进行评估。 CEP SQL 通过MATCH_RECOGNIZE的SQL语法实现。MATCH_RECOGNIZE子句自 Oracle Database 12c起由Oracle SQL支持,用于在SQL中表示事件模式匹配。 CEP SQL使用举例如下:

 SELECT T.aid, T.bid, T.cid FROM MyTable    MATCH_RECOGNIZE (      PARTITION BY userid      ORDER BY proctime      MEASURES        A.id AS aid,        B.id AS bid,        C.id AS cid      PATTERN (A B C)      DEFINE        A AS name = 'a',        B AS name = 'b',        C AS name = 'c'    ) AS T


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。