Flink 内核原理与实现-应用(上)

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: Flink 内核原理与实现-应用

一、Flink应用开发


   Flink作为流批一体的计算引擎,其面对的是业务场景,面向的使用者是开发人员和运维管理人员。


   Flink应用程序,也叫Flink作业、FlinkJob.Flink作业包含了两个基本的块:数据流(DataStream)和转换(Tranformation)。DataStream是逻辑概念,为开发者提供了API接口,Transformation是处理行为的抽象,包含了数据的读取、计算、写出。所以Flink的作业中的DataStreamAPI调用,实际上构建了多个由Transformation组成的数据处理流水线(Pipline)。


   执行时,Flink应用被映射成DataFlow,由数据流和转换操作组成。每个DataFlow从一个或多个数据源开始,并以一个或多个Sink输出结束。DataFlow本质上是一个有向无环图(DAG),但是允许通过迭代构造特殊形式的有向无环图。


Flink应用由相同的基本部分组成:


  • 获取参数(可选)

      如果有配置参数,则读取配置参数,可以是命令输入的参数,也可以是配置文件。


  • 初始化Stream执行环境
    这是必须要做的,读取数据的API依赖于该执行环境。

  • 配置参数
    读取到的参数可以是执行环境参数或者业务参数。这些参数会覆盖flink.conf中默认的配置参数。


  • 读取外部数据
    Flink作为分布式执行引擎,本身没有数据存储能力,所以定义了一系列接口、连接器与外部存储进行交互,读写数据。

  • 数据处理流程
    调用DataStream的API组成数据处理的流程,如调用DataStream.map().filter()……组成一个数据流水线。

  • 将处理结果写入外部
    在Flink中将数据写入外部的过程叫做Sink,Flink支持写出数据到Kafka、HDFS、Hbase等外部存储。

  • 触发执行
    StreamExecutionEnvironment#execute是Flink应用执行的触发入口,无论是一般的DataStreamAPI开发还是Table&SQL开发都是如此。


二、API层次


API层次如图:

640.png

  • 核心底层API
    核心底层API提供了Flink的最底层的分布式计算构建块的操作API,包含了ProcessFunction、状态、时间和窗口等操作的API。

    ProcessFunction是Flink提供的最具表现力的底层功能接口。Flink提供单流输入的ProcessFunction和双流输入的CoProcessFuntion,能够对单个事件进行计算,也能够按照窗口对时间进行计算。

  • 核心开发API(DataStream/DataSet)
    DataStream/DataSet使用Fluent风格API,提供了常见数据处理的API接口,如用户指定的各种转换形式,包括连接(Join)、聚合(Aggregation)、窗口(Window)、状态(State)等。


  • 声明式DSL API
    Table API是以表为中心的声明式领域专用语言(Domain Specified Language,DSL)。表是关系型数据库的概念,用在批处理中。在流计算中,为了引入动态表的概念(Dynamic Table),用来表达数据流表。

  • 结构化API

       SQL是Flink的结构化API,是最高层次的计算API,与Table API基本等价,          区别在于使用的方式。SQL与Table API可以混合使用,SQL可以操作             Table API 定义的表,Table API也能操作SQL定义的表和中间结果。


三、数据流


数据流是核心数据抽象,表示一个持续产生的数据流。

DataStream体系如图:

640.png

DataStreamSource本身就是一个DataStream。DataStreamSink、AsyncDataStream、BroadcastDataStream、BroadcastConnectedDataStream、QueryableDataStream都是对一般DataStream对象封装。


  • DataStream

       DataStream是Flink数据流的抽象核心,其上定义了对数据流的一系列操作,同时也定义了与其他类型DataStream的相互转换关系。每个DataStream都有一个Transformation对象,表示该DataStream从上游的DataStream使用该Transformation而来。


  • DataStreamSource

       DataStreamSource是DataStream的起点,DataStreamSource在StreamExecutionEnvironment中创建,由StreamExecutionEnvrionment.addSource(SourceFunction)创建而来,其中SourceFunction中包含了DataStreamSource从数据源读取数据的具体逻辑。


  • DataStreamSink

       数据从DataSourceStream中读取,经过中间的一系列处理操作,最终需要写出到外部存储,通过DataStream.addSink(SinkFunction)创建而来,其中SinkFunction定义了写出数据到外部存储的逻辑。


  • KeyedStream

       KeyedStream用来表示根据指定的key进行分组的数据流。一个KeyedStream可以通过调用DataStream.keyBy()来获得。而在KeyedStream上进行任何Transformation都将转变回DataStream。在现实中,KeyedStream把key的信息写入了Transformation中。每条记录只能访问所属Key的状态,其上的聚合函数可以方便地操作和保存对应key的状态。


  • WindowedStream & AllWindowedStream

       WindowedStream代表了根据key分组且基于WindowAssigner切分窗口的数据流。所以WindowedStream都是从KeyedStream衍生而来的。在WindowedStream上进行任何Transformation也都将转变回DataStream。


  • JoinedStreams & CoGroupedStreams

       Join是CoGroup的一种特例,JoinedStreams底层 使用CoGroupedStreams来实现。

640.png

 两者区别如下:


       CoGrouped侧重的是Group,对数据进行分组,是对同一个key上的两组集合进行操作。


       Join侧重的是数据对,对同一个key的每一对元素进行操作。


  • ConnectedStreams

       ConnectedStreams表示两个数据流的组合,两个数据流可以类型一样,也可以类型不一样。ConnectedStreams适用于两个有关系的数据流的操作,共享state。


  • BroadcastStream & BroadcastConnectedStream

       BroadcastStream 实际上是对一个普通DataStream的封装,提供了DataStream的广播行为。


       BroadcastConnectedStream 一般由DataStream/KeyedDataStream与BroadcastStream 连接而来,类似于ConnectedStream。


  • IterativeStream

       IterativeDataStream 是对一个DataStream的迭代操作,从逻辑上来说,包含IterativeStream的Dataflow是一个有向有环图,在底层执行层面上,Flink对其进行了特殊处理。


  • AsyncDataStream

       AysncDataStream是个工具,提供在DataStream上使用异步函数的能力。


四、数据流API


       DataStreamAPI是Flink流计算的最常用的API,相比于Table & SQL API更加底层。


4.1 数据读取


       数据读取的API定义在StreamExecutionEnvironmanet,这是Flink流计算应用的起点,第一个DataStream就是从数据读取API中构造出来的。


  • 从内存中读取


640.png


  • 文件中读取


640.png


  • Socke接入数据


640.png


  • 自定义读取

640.png

640.png

4.2 处理数据

DataStreamAPI 使用Fluent风格处理数据,在开发的时候其实是在编写一个DataStream转换过程,形成了DataStream处理链。

640.png

从图中可以看到,并不是所有的DataStream都可以互相转换。

  • Map

       接收1个元素,输出1个元素。Map应用在DataStream上,输出结果为DataStream。  DataStream#map运算对应的是MapFunction,其类泛型为MapFunction,T代表输入数据类型,O代表操作结果输出类型。


640.png


  • FlatMap

       接收1个元素,输出0、1、...、N个元素。该类运算应用在DataStream上,输出结果为DataStream。DataStream#flatMap对应的接口是FlatMapFuncion,其类泛型为FlatMapFunction,T代表输入数据类型,O代表操作结果输出类型。


640.png


  • Filter

       过滤数据,如果返回true则该元素继续向下传递,如果为false则将该元素过滤掉。该类运算应用在DataStream上,输出结果为DataStream。DataStream#filter接口对应的是FilterFunction,其类泛型为FilterFunction,T代表输出和输出的数据类型。


640.png


  • KeyBy

       将数据流元素进行逻辑上的分组,具有相同Key的记录将被划分到同一组。KeyBy()使用Hash Partition实现。该运算应用在DataStream上,输出结果为KeyedStream。输出的数据流类型为KeyedStream,其中T代表KeyedStream中元素数据类型,KEY代表逻辑Key的数据类型。


640.png


        注意以下两种数据不能作为key。

  1. POJO类未重写hashCode(),使用了默认的Object.hashCode()。
  2. 数组类型。


  • Reduce

       按照KeyedStream中的逻辑分组,将当前数据与最后一次的Reduce结果进行合并,合并逻辑由开发者自己实现。该类运算应用在KeyedStream上,输出结果为DataStream。ReduceFuntion中T代表KeyedStream中元素的数据类型。


640.png


相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
3月前
|
分布式计算 数据处理 Apache
Spark和Flink的区别是什么?如何选择?都应用在哪些行业?
【10月更文挑战第10天】Spark和Flink的区别是什么?如何选择?都应用在哪些行业?
414 1
|
3月前
|
SQL 消息中间件 分布式计算
大数据-124 - Flink State 01篇 状态原理和原理剖析:状态类型 执行分析
大数据-124 - Flink State 01篇 状态原理和原理剖析:状态类型 执行分析
100 5
|
26天前
|
消息中间件 JSON 数据库
探索Flink动态CEP:杭州银行的实战案例
本文由杭州银行大数据工程师唐占峰、欧阳武林撰写,介绍Flink动态CEP的定义、应用场景、技术实现及使用方式。Flink动态CEP是基于Flink的复杂事件处理库,支持在不重启服务的情况下动态更新规则,适应快速变化的业务需求。文章详细阐述了其在反洗钱、反欺诈和实时营销等金融领域的应用,并展示了某金融机构的实际应用案例。通过动态CEP,用户可以实时调整规则,提高系统的灵活性和响应速度,降低维护成本。文中还提供了具体的代码示例和技术细节,帮助读者理解和使用Flink动态CEP。
398 2
探索Flink动态CEP:杭州银行的实战案例
|
19天前
|
存储 物联网 大数据
探索阿里云 Flink 物化表:原理、优势与应用场景全解析
阿里云Flink的物化表是流批一体化平台中的关键特性,支持低延迟实时更新、灵活查询性能、无缝流批处理和高容错性。它广泛应用于电商、物联网和金融等领域,助力企业高效处理实时数据,提升业务决策能力。实践案例表明,物化表显著提高了交易欺诈损失率的控制和信贷审批效率,推动企业在数字化转型中取得竞争优势。
75 14
|
3月前
|
消息中间件 监控 Java
大数据-109 Flink 体系结构 运行架构 ResourceManager JobManager 组件关系与原理剖析
大数据-109 Flink 体系结构 运行架构 ResourceManager JobManager 组件关系与原理剖析
96 1
|
3月前
|
存储 SQL 分布式计算
大数据-127 - Flink State 04篇 状态原理和原理剖析:状态存储 Part2
大数据-127 - Flink State 04篇 状态原理和原理剖析:状态存储 Part2
33 0
|
3月前
|
存储 消息中间件 大数据
大数据-126 - Flink State 03篇 状态原理和原理剖析:状态存储 Part1
大数据-126 - Flink State 03篇 状态原理和原理剖析:状态存储 Part1
85 0
|
3月前
|
存储 SQL 分布式计算
大数据-125 - Flink State 02篇 状态原理和原理剖析:广播状态
大数据-125 - Flink State 02篇 状态原理和原理剖析:广播状态
61 0
|
3月前
|
消息中间件 NoSQL Kafka
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
250 0
|
消息中间件 监控 Java
从零编写第一个 Flink 应用
Apache Flink 是一个流计算引擎。本文主要介绍如何从零编写一个统计单词出现次数的 Flink 应用(后面简称为 WordCount)。由于 Flink 概念很多,对初学者会造成极大困扰,所以本文不会涉及太多概念,即使没有 Flink 基础也可以完成本文的示例应用。
312 0
从零编写第一个 Flink 应用

热门文章

最新文章