
# Flink应用开发简介
#### 组件介绍
Flink是一个批处理和流处理结合的统一计算框架，其核心是一个提供了数据分发以及并行化计算的流数据处理引擎。它的最大亮点是流处理，是业界最顶级的开源流处理引擎。
Flink最适合的应用场景是低时延的数据处理（Data Processing）场景：高并发pipeline处理数据，时延毫秒级，且兼具可靠性。
Flink技术栈如[图1]所示。
图1Flink技术栈   
![](https://support.huaweicloud.com/devg-lts-mrs/zh-cn_image_0000001298930557.png "点击放大")
Flink在当前版本中重点构建如下特性，其他特性继承开源社区。
- DataStream
- Checkpoint
- 窗口
- Job Pipeline
- 配置表
 
#### 架构
Flink架构如[图2]所示。
图2Flink架构   
![](https://support.huaweicloud.com/devg-lts-mrs/zh-cn_image_0000001252690922.png "点击放大")
Flink整个系统包含三个部分：
- Client Flink Client主要给用户提供向Flink系统提交用户任务（流式作业）的能力。
  
- TaskManager Flink系统的业务执行节点，执行具体的用户任务。TaskManager可以有多个，各个TaskManager都平等。
  
- JobManager Flink系统的管理节点，管理所有的TaskManager，并决策用户任务在哪些TaskManager执行。JobManager在HA模式下可以有多个，但只有一个主JobManager。
  
Flink系统提供的关键能力：
- 低时延 提供ms级时延的处理能力。
  
- Exactly Once 提供异步快照机制，保证所有数据真正只处理一次。
  
- HA JobManager支持主备模式，保证无单点故障。
  
- 水平扩展能力 TaskManager支持手动水平扩展。
  
 
#### Flink开发接口简介
Flink DataStream API提供Scala和Java两种语言的开发方式，如[表1]所示。
 表1Flink DataStream API接口 
| **功能**    | **说明**                                |
|:---|:---|
| Scala API | 提供Scala语言的API，提供过滤、join、窗口、聚合等数据处理能力。 |
| Java API  | 提供Java语言的API，提供过滤、join、窗口、聚合等数据处理能力。  |
   
 #### Flink基本概念
- **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存储的状态开始恢复运行，保证数据处理的延续性。
  
 
#### Flink样例工程介绍
MRS样例工程获取地址为<https://github.com/huaweicloud/huaweicloud-mrs-example>，切换分支为与MRS集群相匹配的版本分支，然后下载压缩包到本地后解压，即可获取各组件对应的样例代码工程。
当前MRS提供以下Flink相关样例工程，安全模式路径为"flink-examples/flink-examples-security"，普通模式路径为"flink-examples/flink-examples-normal"：
表2Flink相关样例工程 
| 样例工程                           | 描述                                                                                                                                                                                                                                                                                                                           |
|:---|:---|
| FlinkCheckpointJavaExample     | 异步Checkpoint机制程序的应用开发示例。 假定用户需要每隔1秒钟统计4秒钟窗口中数据的量，并做到状态严格一致性，即：当应用出现异常并恢复后，各个算子的状态能够处于统一的状态。 相关业务场景介绍请参见[Flink开启Checkpoint样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_050020.html)。                                                               |
| FlinkCheckpointScalaExample    | 异步Checkpoint机制程序的应用开发示例。 假定用户需要每隔1秒钟统计4秒钟窗口中数据的量，并做到状态严格一致性，即：当应用出现异常并恢复后，各个算子的状态能够处于统一的状态。 相关业务场景介绍请参见[Flink开启Checkpoint样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_050020.html)。                                                               |
| FlinkHBaseJavaExample          | 通过Flink API作业读写HBase数据的应用开发示例。 相关业务场景介绍请参见[Flink读取HBase表样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_050059.html)。                                                                                                                                                               |
| FlinkHudiJavaExample           | 通过Flink API作业读写Hudi数据的应用开发示例。 相关业务场景介绍请参见[Flink读取Hudi表样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_050062.html)。                                                                                                                                                                |
| FlinkKafkaJavaExample          | 向Kafka生产并消费数据程序的应用开发示例。 通过调用flink-connector-kafka模块的接口，生产并消费数据。 相关业务场景介绍请参见[Flink Kafka样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_050016.html)。                                                                                               |
| FlinkKafkaScalaExample         | 向Kafka生产并消费数据程序的应用开发示例。 通过调用flink-connector-kafka模块的接口，生产并消费数据。 相关业务场景介绍请参见[Flink Kafka样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_050016.html)。                                                                                               |
| FlinkPipelineJavaExample       | Job Pipeline程序的应用开发示例。 相关业务场景介绍请参见[Flink Job Pipeline样例程序（MRS 3.6.0-LTS.1之前版本）](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_050024.html)。 发布者Job自己每秒钟产生10000条数据，然后经由该job的NettySink算子向下游发送。另外两个Job作为订阅者，分别订阅一份数据并打印输出。                              |
| FlinkPipelineScalaExample      | Job Pipeline程序的应用开发示例。 相关业务场景介绍请参见[Flink Job Pipeline样例程序（MRS 3.6.0-LTS.1之前版本）](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_050024.html)。 发布者Job自己每秒钟产生10000条数据，然后经由该job的NettySink算子向下游发送。另外两个Job作为订阅者，分别订阅一份数据并打印输出。                              |
| FlinkRESTAPIJavaExample        | 调用FlinkServer的RestAPI创建租户的应用开发示例。 相关业务场景介绍请参见[FlinkServer REST API样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_050056.html)。                                                                                                                                                   |
| FlinkStreamJavaExample         | DataStream程序的应用开发示例。 相关业务场景介绍请参见[Flink DataStream样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_050012.html)。 假定用户有某个网站周末网民网购停留时间的日志文本，另有一张网民个人信息的csv格式表，可通过Flink应用程序实现例如实时统计总计网购时间超过2个小时的女性网民信息，包含对应的个人详细信息的功能。                                 |
| FlinkStreamScalaExample        | DataStream程序的应用开发示例。 相关业务场景介绍请参见[Flink DataStream样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_050012.html)。 假定用户有某个网站周末网民网购停留时间的日志文本，另有一张网民个人信息的csv格式表，可通过Flink应用程序实现例如实时统计总计网购时间超过2个小时的女性网民信息，包含对应的个人详细信息的功能。                                 |
| FlinkStreamSqlJoinExample      | Stream SQL Join程序的应用开发示例。 相关业务场景介绍请参见[Flink Join样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_050032.html)。 假定某个Flink业务1每秒就会收到1条消息记录，消息记录某个用户的基本信息，包括名字、性别、年龄。另有一个Flink业务2会不定时收到1条消息记录，消息记录该用户的名字、职业信息。实现实时的以根据业务2中消息记录的用户名字作为关键字，对两个业务数据进行联合查询的功能。 |
| FlinkStreamSqlJoinScalaExample | Stream SQL Join程序的应用开发示例。 相关业务场景介绍请参见[Flink Join样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_050032.html)。 假定某个Flink业务1每秒就会收到1条消息记录，消息记录某个用户的基本信息，包括名字、性别、年龄。另有一个Flink业务2会不定时收到1条消息记录，消息记录该用户的名字、职业信息。实现实时的以根据业务2中消息记录的用户名字作为关键字，对两个业务数据进行联合查询的功能。 |
| flink-sql                      | 使用客户端通过jar作业提交SQL作业的应用开发示例。 相关业务场景介绍请参见[Flink Jar作业提交SQL样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_050065.html)。                                                                                                                                                               |
| pyflink-example                | 提供Python读写Kafka作业和Python提交SQL作业的样例。 相关业务场景介绍请参见[PyFlink样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_050069.html)。                                                                                                                                                                |
   
