更新时间:2024-10-31 GMT+08:00

Flink应用开发简介

简介

Flink是一个批处理和流处理结合的统一计算框架,其核心是一个提供了数据分发以及并行化计算的流数据处理引擎。它的最大亮点是流处理,是业界最顶级的开源流处理引擎。

Flink最适合的应用场景是低时延的数据处理(Data Processing)场景:高并发pipeline处理数据,时延毫秒级,且兼具可靠性。

Flink技术栈如图1所示。

图1 Flink技术栈

Flink在当前版本中重点构建如下特性,其他特性继承开源社区,不做增强。

  • DataStream
  • Checkpoint
  • 窗口
  • Job Pipeline
  • 配置表

架构

Flink架构如图2所示。

图2 Flink架构

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所示。

表1 Flink DataStream API接口

功能

说明

Scala API

提供Scala语言的API,提供过滤、join、窗口、聚合等数据处理能力。由于Scala语言的简洁易懂,推荐用户使用Scala接口进行程序开发。

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存储的状态开始恢复运行,保证数据处理的延续性。

样例工程介绍

MRS样例工程获取地址为https://github.com/huaweicloud/huaweicloud-mrs-example,切换分支为与MRS集群相匹配的版本分支,然后下载压缩包到本地后解压,即可获取各组件对应的样例代码工程。

当前MRS提供以下Flink相关样例工程,安全模式路径为“flink-examples/flink-examples-security”,普通模式路径为“flink-examples/flink-examples-normal”:
表2 Flink相关样例工程

样例工程

描述

FlinkCheckpointJavaExample

异步Checkpoint机制程序的应用开发示例。

假定用户需要每隔1秒钟需要统计4秒中窗口中数据的量,并做到状态严格一致性,即:当应用出现异常并恢复后,各个算子的状态能够处于统一的状态。

相关业务场景介绍请参见Flink开启Checkpoint样例程序

FlinkCheckpointScalaExample

FlinkHBaseJavaExample

通过Flink API作业读写HBase数据的应用开发示例。

相关业务场景介绍请参见Flink读取HBase表样例程序

FlinkHudiJavaExample

通过Flink API作业读写Hudi数据的应用开发示例。

相关业务场景介绍请参见Flink读取Hudi表样例程序

FlinkKafkaJavaExample

向Kafka生产并消费数据程序的应用开发示例。

通过调用flink-connector-kafka模块的接口,生产并消费数据。

相关业务场景介绍请参见Flink Kafka样例程序

FlinkKafkaScalaExample

FlinkPipelineJavaExample

Job Pipeline程序的应用开发示例。

相关业务场景介绍请参见Flink Job Pipeline样例程序

发布者Job自己每秒钟产生10000条数据,然后经由该job的NettySink算子向下游发送。另外两个Job作为订阅者,分别订阅一份数据并打印输出。

FlinkPipelineScalaExample

FlinkRESTAPIJavaExample

调用FlinkServer的RestAPI创建租户的应用开发示例。

相关业务场景介绍请参见FlinkServer REST API样例程序

FlinkStreamJavaExample

DataStream程序的应用开发示例。

相关业务场景介绍请参见Flink DataStream样例程序

假定用户有某个网站周末网民网购停留时间的日志文本,另有一张网民个人信息的csv格式表,可通过Flink应用程序实现例如实时统计总计网购时间超过2个小时的女性网民信息,包含对应的个人详细信息的功能。

FlinkStreamScalaExample

FlinkStreamSqlJoinExample

Stream SQL Join程序的应用开发示例。

相关业务场景介绍请参见Flink Join样例程序

假定某个Flink业务1每秒就会收到1条消息记录,消息记录某个用户的基本信息,包括名字、性别、年龄。另有一个Flink业务2会不定时收到1条消息记录,消息记录该用户的名字、职业信息。实现实时的以根据业务2中消息记录的用户名字作为关键字,对两个业务数据进行联合查询的功能。

FlinkStreamSqlJoinScalaExample

flink-sql

使用客户端通过jar作业提交SQL作业的应用开发示例。

相关业务场景介绍请参见Flink Jar作业提交SQL样例程序

pyflink-example

提供Python读写Kafka作业和Python提交SQL作业的样例。

相关业务场景介绍请参见PyFlink样例程序