Flink应用开发简介
简介
Flink是一个批处理和流处理结合的统一计算框架,其核心是一个提供了数据分发以及并行化计算的流数据处理引擎。它的最大亮点是流处理,是业界最顶级的开源流处理引擎。
Flink最适合的应用场景是低时延的数据处理(Data Processing)场景:高并发pipeline处理数据,时延毫秒级,且兼具可靠性。
Flink技术栈如图1所示。
Flink在当前版本中重点构建如下特性,其他特性继承开源社区,不做增强。
- DataStream
- Checkpoint
- 窗口
- Job Pipeline
- 配置表
架构
Flink架构如图2所示。
Flink整个系统包含三个部分:
- Client
- TaskManager
- JobManager
Flink系统的管理节点,管理所有的TaskManager,并决策用户任务在哪些Taskmanager执行。JobManager在HA模式下可以有多个,但只有一个主JobManager。
Flink系统提供的关键能力:
Flink开发接口简介
Flink DataStream API提供Scala和Java两种语言的开发方式,如表1所示。
基本概念
- DataStream
数据流,是指Flink系统处理的最小数据单元。该数据单元最初由外部系统导入,可以通过socket、Kafka和文件等形式导入,在Flink系统处理后,通过Socket、Kafka和文件等输出到外部系统,这是Flink的核心概念。
- Data Transformation
数据处理单元,会将一或多个DataStream转换成一个新的DataStream。
具体可以细分如下几类:
- 一对一的转换:如Map。
- 一对0、1或多个的转换:如FlatMap。
- 一对0或1的转换,如Filter。
- 多对1转换,如Union。
- 多个聚合的转换,如window、keyby。
- CheckPoint
CheckPoint是Flink数据处理高可靠、最重要的机制。该机制可以保证应用在运行过程中出现失败时,应用的所有状态能够从某一个检查点恢复,保证数据仅被处理一次(Exactly Once)。
- SavePoint
Savepoint是指允许用户在持久化存储中保存某个checkpoint,以便用户可以暂停自己的任务进行升级。升级完后将任务状态设置为savepoint存储的状态开始恢复运行,保证数据处理的延续性。
样例工程介绍
MRS样例工程获取地址为https://github.com/huaweicloud/huaweicloud-mrs-example,切换分支为与MRS集群相匹配的版本分支,然后下载压缩包到本地后解压,即可获取各组件对应的样例代码工程。
样例工程 |
描述 |
---|---|
FlinkCheckpointJavaExample |
异步Checkpoint机制程序的应用开发示例。 假定用户需要每隔1秒钟需要统计4秒中窗口中数据的量,并做到状态严格一致性,即:当应用出现异常并恢复后,各个算子的状态能够处于统一的状态,相关业务场景介绍请参见Flink开启Checkpoint样例程序。 |
FlinkCheckpointScalaExample |
|
FlinkKafkaJavaExample |
向Kafka生产并消费数据程序的应用开发示例。 通过调用flink-connector-kafka模块的接口,生产并消费数据,相关业务场景介绍请参见Flink Kafka样例程序。 |
FlinkKafkaScalaExample |
|
FlinkPipelineJavaExample |
Job Pipeline程序的应用开发示例。 相关业务场景介绍请参见Flink Job Pipeline样例程序。 发布者Job自己每秒钟产生10000条数据,然后经由该job的NettySink算子向下游发送。另外两个Job作为订阅者,分别订阅一份数据并打印输出。 |
FlinkPipelineScalaExample |
|
FlinkSqlJavaExample |
使用客户端通过jar作业提交SQL作业的应用开发示例。 |
FlinkStreamJavaExample |
DataStream程序的应用开发示例。 相关业务场景介绍请参见Flink DataStream样例程序。 假定用户有某个网站周末网民网购停留时间的日志文本,另有一张网民个人信息的csv格式表,可通过Flink应用程序实现例如实时统计总计网购时间超过2个小时的女性网民信息,包含对应的个人详细信息的功能。 |
FlinkStreamScalaExample |
|
FlinkStreamSqlJoinExample |
Stream SQL Join程序的应用开发示例。 相关业务场景介绍请参见Flink Join样例程序。 假定某个Flink业务1每秒就会收到1条消息记录,消息记录某个用户的基本信息,包括名字、性别、年龄。另有一个Flink业务2会不定时收到1条消息记录,消息记录该用户的名字、职业信息。实现实时的以根据业务2中消息记录的用户名字作为关键字,对两个业务数据进行联合查询的功能。 |