flink从入门到真香(flink介绍)(代码片段)

author author     2022-12-11     481

关键词:

关于概念的东西,其实官网说的很全,对于个人理解就是,flink、spark等等大数据处理平台就是把原来需要我们自己实现的功能,全部框架封装好,像是跨机器的大规模计算、内存/cpu等等资源管理、状态管理(锁还有恢复机制等等)框架全部封装好了,作为开发来说就只需要关心自己要实现的业务就可以了

以下内容来自官网,从3个方面介绍Flink:

架构

Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。

接下来,我们来介绍一下 Flink 架构中的重要方面。

处理***和有界数据
任何类型的数据都可以形成一种事件流。信用卡交易、传感器测量、机器日志、网站或移动应用程序上的用户交互记录,所有这些数据都形成一种流。

数据可以被作为 *** 或者 有界 流来处理。

***流 有定义流的开始,但没有定义流的结束。它们会无休止地产生数据。***流的数据必须持续处理,即数据被摄取后需要立刻处理。我们不能等到所有数据都到达再处理,因为输入是无限的,在任何时候输入都不会完成。处理***数据通常要求以特定顺序摄取事件,例如事件发生的顺序,以便能够推断结果的完整性。

有界流 有定义流的开始,也有定义流的结束。有界流可以在摄取所有数据后再进行计算。有界流所有数据可以被排序,所以并不需要有序摄取。有界流处理通常被称为批处理

技术图片

Apache Flink 擅长处理***和有界数据集 精确的时间控制和状态化使得 Flink 的运行时(runtime)能够运行任何处理***流的应用。有界流则由一些专为固定大小数据集特殊设计的算法和数据结构进行内部处理,产生了出色的性能。

通过探索 Flink 之上构建的 用例 来加深理解。

部署应用到任意地方

Apache Flink 是一个分布式系统,它需要计算资源来执行应用程序。Flink 集成了所有常见的集群资源管理器,例如 Hadoop YARN、 Apache Mesos 和 Kubernetes,但同时也可以作为独立集群运行。

Flink 被设计为能够很好地工作在上述每个资源管理器中,这是通过资源管理器特定(resource-manager-specific)的部署模式实现的。Flink 可以采用与当前资源管理器相适应的方式进行交互。

部署 Flink 应用程序时,Flink 会根据应用程序配置的并行性自动标识所需的资源,并从资源管理器请求这些资源。在发生故障的情况下,Flink 通过请求新资源来替换发生故障的容器。提交或控制应用程序的所有通信都是通过 REST 调用进行的,这可以简化 Flink 与各种环境中的集成。

运行任意规模应用

Flink 旨在任意规模上运行有状态流式应用。因此,应用程序被并行化为可能数千个任务,这些任务分布在集群中并发执行。所以应用程序能够充分利用无尽的 CPU、内存、磁盘和网络 IO。而且 Flink 很容易维护非常大的应用程序状态。其异步和增量的检查点算法对处理延迟产生最小的影响,同时保证精确一次状态的一致性。

Flink 用户报告了其生产环境中一些令人印象深刻的扩展性数字

处理每天处理数万亿的事件,
应用维护几TB大小的状态, 和
应用在数千个内核上运行。

利用内存性能

有状态的 Flink 程序针对本地状态访问进行了优化。任务的状态始终保留在内存中,如果状态大小超过可用内存,则会保存在能高效访问的磁盘数据结构中。任务通过访问本地(通常在内存中)状态来进行所有的计算,从而产生非常低的处理延迟。Flink 通过定期和异步地对本地状态进行持久化存储来保证故障场景下精确一次的状态一致性。

技术图片

应用

Apache Flink 是一个针对***和有界数据流进行有状态计算的框架。Flink 自底向上在不同的抽象级别提供了多种 API,并且针对常见的使用场景开发了专用的扩展库。

在本章中,我们将介绍 Flink 所提供的这些简单易用、易于表达的 API 和库。

流处理应用的基本组件

可以由流处理框架构建和执行的应用程序类型是由框架对 流、状态、时间 的支持程度来决定的。在下文中,我们将对上述这些流处理应用的基本组件逐一进行描述,并对 Flink 处理它们的方法进行细致剖析。

显而易见,(数据)流是流处理的基本要素。然而,流也拥有着多种特征。这些特征决定了流如何以及何时被处理。Flink 是一个能够处理任何类型数据流的强大处理框架。

有界 和 *** 的数据流:

流可以是***的;也可以是有界的,例如固定大小的数据集。Flink 在***的数据流处理上拥有诸多功能强大的特性,同时也针对有界的数据流开发了专用的高效算子。

实时 和 历史记录 的数据流:

所有的数据都是以流的方式产生,但用户通常会使用两种截然不同的方法处理数据。或是在数据生成时进行实时的处理;亦或是先将数据流持久化到存储系统中——例如文件系统或对象存储,然后再进行批处理。Flink 的应用能够同时支持处理实时以及历史记录数据流。

状态

只有在每一个单独的事件上进行转换操作的应用才不需要状态,换言之,每一个具有一定复杂度的流处理应用都是有状态的。任何运行基本业务逻辑的流处理应用都需要在一定时间内存储所接收的事件或中间结果,以供后续的某个时间点(例如收到下一个事件或者经过一段特定时间)进行访问并进行后续处理。

应用状态是 Flink 中的一等公民,Flink 提供了许多状态管理相关的特性支持,其中包括:

多种状态基础类型:Flink 为多种不同的数据结构提供了相对应的状态基础类型,例如原子值(value),列表(list)以及映射(map)。开发者可以基于处理函数对状态的访问方式,选择最高效、最适合的状态基础类型。

插件化的State Backend:

State Backend 负责管理应用程序状态,并在需要的时候进行 checkpoint。Flink 支持多种 state backend,可以将状态存在内存或者 RocksDB。RocksDB 是一种高效的嵌入式、持久化键值存储引擎。Flink 也支持插件式的自定义 state backend 进行状态存储。

精确一次语义:

Flink 的 checkpoint 和故障恢复算法保证了故障发生后应用状态的一致性。因此,Flink 能够在应用程序发生故障时,对应用程序透明,不造成正确性的影响。

超大数据量状态:

Flink 能够利用其异步以及增量式的 checkpoint 算法,存储数 TB 级别的应用状态。

可弹性伸缩的应用:

Flink 能够通过在更多或更少的工作节点上对状态进行重新分布,支持有状态应用的分布式的横向伸缩。

时间

时间是流处理应用另一个重要的组成部分。因为事件总是在特定时间点发生,所以大多数的事件流都拥有事件本身所固有的时间语义。进一步而言,许多常见的流计算都基于时间语义,例如窗口聚合、会话计算、模式检测和基于时间的 join。流处理的一个重要方面是应用程序如何衡量时间,即区分事件时间(event-time)和处理时间(processing-time)。

Flink 提供了丰富的时间语义支持。

事件时间模式:
使用事件时间语义的流处理应用根据事件本身自带的时间戳进行结果的计算。因此,无论处理的是历史记录的事件还是实时的事件,事件时间模式的处理总能保证结果的准确性和一致性。
Watermark 支持:
Flink 引入了 watermark 的概念,用以衡量事件时间进展。Watermark 也是一种平衡处理延时和完整性的灵活机制。
迟到数据处理:
 当以带有 watermark 的事件时间模式处理数据流时,在计算完成之后仍会有相关数据到达。这样的事件被称为迟到事件。Flink 提供了多种处理迟到数据的选项,例如将这些数据重定向到旁路输出(side output)或者更新之前完成计算的结果。
处理时间模式:
 除了事件时间模式,Flink 还支持处理时间语义。处理时间模式根据处理引擎的机器时钟触发计算,一般适用于有着严格的低延迟需求,并且能够容忍近似结果的流处理应用。
分层 API
Flink 根据抽象程度分层,提供了三种不同的 API。每一种 API 在简洁性和表达力上有着不同的侧重,并且针对不同的应用场景。

下文中,我们将简要描述每一种 API 及其应用,并提供相关的代码示例。

ProcessFunction

ProcessFunction 是 Flink 所提供的最具表达力的接口。ProcessFunction 可以处理一或两条输入数据流中的单个事件或者归入一个特定窗口内的多个事件。它提供了对于时间和状态的细粒度控制。开发者可以在其中任意地修改状态,也能够注册定时器用以在未来的某一时刻触发回调函数。因此,你可以利用 ProcessFunction 实现许多有状态的事件驱动应用所需要的基于单个事件的复杂业务逻辑。

下面的代码示例展示了如何在 KeyedStream 上利用 KeyedProcessFunction 对标记为 START 和 END 的事件进行处理。当收到 START 事件时,处理函数会记录其时间戳,并且注册一个时长4小时的计时器。如果在计时器结束之前收到 END 事件,处理函数会计算其与上一个 START 事件的时间间隔,清空状态并将计算结果返回。否则,计时器结束,并清空状态。

/**

DataStream API

DataStream API 为许多通用的流处理操作提供了处理原语。这些操作包括窗口、逐条记录的转换操作,在处理事件时进行外部数据库查询等。DataStream API 支持 Java 和 Scala 语言,预先定义了例如map()、reduce()、aggregate() 等函数。你可以通过扩展实现预定义接口或使用 Java、Scala 的 lambda 表达式实现自定义的函数。

下面的代码示例展示了如何捕获会话时间范围内所有的点击流事件,并对每一次会话的点击量进行计数。

// 网站点击 Click 的数据流
DataStream<Click> clicks = ...

DataStream<Tuple2<String, Long>> result = clicks
  // 将网站点击映射为 (userId, 1) 以便计数
  .map(
    // 实现 MapFunction 接口定义函数
    new MapFunction<Click, Tuple2<String, Long>>() 
      @Override
      public Tuple2<String, Long> map(Click click) 
        return Tuple2.of(click.userId, 1L);
      
    )
  // 以 userId (field 0) 作为 key
  .keyBy(0)
  // 定义 30 分钟超时的会话窗口
  .window(EventTimeSessionWindows.withGap(Time.minutes(30L)))
  // 对每个会话窗口的点击进行计数,使用 lambda 表达式定义 reduce 函数
  .reduce((a, b) -> Tuple2.of(a.f0, a.f1 + b.f1));

SQL & Table API

Flink 支持两种关系型的 API,Table API 和 SQL。这两个 API 都是批处理和流处理统一的 API,这意味着在无边界的实时数据流和有边界的历史记录数据流上,关系型 API 会以相同的语义执行查询,并产生相同的结果。Table API 和 SQL 借助了 Apache Calcite 来进行查询的解析,校验以及优化。它们可以与 DataStream 和 DataSet API 无缝集成,并支持用户自定义的标量函数,聚合函数以及表值函数。

Flink 的关系型 API 旨在简化数据分析、数据流水线和 ETL 应用的定义。

下面的代码示例展示了如何使用 SQL 语句查询捕获会话时间范围内所有的点击流事件,并对每一次会话的点击量进行计数。此示例与上述 DataStream API 中的示例有着相同的逻辑。

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

Flink 具有数个适用于常见数据处理应用场景的扩展库。这些库通常嵌入在 API 中,且并不完全独立于其它 API。它们也因此可以受益于 API 的所有特性,并与其他库集成。

复杂事件处理(CEP):

模式检测是事件流处理中的一个非常常见的用例。Flink 的 CEP 库提供了 API,使用户能够以例如正则表达式或状态机的方式指定事件模式。CEP 库与 Flink 的 DataStream API 集成,以便在 DataStream 上评估模式。CEP 库的应用包括网络***检测,业务流程监控和欺诈检测。

DataSet API:

DataSet API 是 Flink 用于批处理应用程序的核心 API。DataSet API 所提供的基础算子包括map、reduce、(outer) join、co-group、iterate等。所有算子都有相应的算法和数据结构支持,对内存中的序列化数据进行操作。如果数据大小超过预留内存,则过量数据将存储到磁盘。Flink 的 DataSet API 的数据处理算法借鉴了传统数据库算法的实现,例如混合散列连接(hybrid hash-join)和外部归并排序(external merge-sort)。

Gelly:

Gelly 是一个可扩展的图形处理和分析库。Gelly 是在 DataSet API 之上实现的,并与 DataSet API 集成。因此,它能够受益于其可扩展且健壮的操作符。Gelly 提供了内置算法,如 label propagation、triangle enumeration 和 page rank 算法,也提供了一个简化自定义图算法实现的 Graph API。


flink从入门到真香(flink环境部署-集群standalone模式)

FlinkStandalone模式部署集群是最简单的一种部署方式,不依赖于其他的组件,另外还支持YARN/Mesos/K8S等模式下的部署Standalone执行架构图:1)client客户端提交任务给Jobmanager2)JobManager负责申请任务运行所需要的资源并管理任务和资... 查看详情

flink从入门到真香(1-分别使用流模式和批模式运行第一个demo)(代码片段)

基本概念部分,批处理和流处理的区别批处理在大数据世界有着悠久的历史,比较典型的就是spark。批处理主要操作大容量静态数据集,并在计算过程完成后返回结果。批处理模式中使用的数据集通常符合下列特征:(1)有界:... 查看详情

flink流式计算从入门到实战一(代码片段)

文章目录一、理解Flink与流计算1、初识Flink2、Flink的适用场景3、流式计算梳理二、Flink安装部署1、Flink的部署方式2、获取Flink3、实验环境与前置软件4、集群搭建5、Standalone模式启动6、Yarn模式提交任务6.1、首先在yarn上启动yarn-sess... 查看详情

flink流式计算从入门到实战二(代码片段)

文章目录三、Flink运行架构1、JobManager和TaskManager2、并发度与Slots3、开发环境搭建4、提交到集群执行5、并行度分析6、Flink整体运行流程Flink流式计算实战专题二==楼兰三、Flink运行架构这一章重点是分析清楚运行架构以及并... 查看详情

flink流式计算从入门到实战五(代码片段)

文章目录八、Flink项目实战1、需求背景2、数据流程设计3、应用实现4、实现效果分析Flink流式计算实战专题五==楼兰八、Flink项目实战​这一个章节,我们来找一个常见的流式计算场景,将Flink真正用起来。1、需求背... 查看详情

flink流式计算从入门到实战三(代码片段)

文章目录四、FlinkDataStreamAPI1、Flink程序的基础运行模型2、Environment运行环境3、Source3.1基于File的数据源3.2基于Socket的数据源3.3基于集合的数据源3.4从Kafka读取数据3.5自定义Source4、Sink4.1输出到到控制台4.2输出到文件4.3输出到Socket4.4... 查看详情

《从0到1学习flink》——flink写入数据到elasticsearch(代码片段)

前言前面FLink的文章中我们已经介绍了说Flink已经有很多自带的Connector。1、《从0到1学习Flink》——DataSource介绍2、《从0到1学习Flink》——DataSink介绍其中包括了Source和Sink的,后面我也讲了下如何自定义自己的Source和Sink。那么今... 查看详情

flink流式计算从入门到实战四(代码片段)

文章目录六、FlinkTableAPI和FlinkSQL1、TableAPI和SQL是什么?2、如何使用TableAPI3、基础编程框架3.1创建TableEnvironment3.2将流数据转换成动态表Table3.3将Table重新转换为DataStream4、扩展编程框架4.1临时表与永久表4.2AppendStream和RetractStream4... 查看详情

从0到1flink的成长之路-tableapi&sql入门案例(代码片段)

入门案例依赖依赖<!--Either...--><dependency><groupId>org.apache.flink</groupId><artifactId>flink-table-api-java-bridge_2.11</artifactId><version>1.10.0</version> 查看详情

从0到1flink的成长之路-tableapi&sql入门案例(代码片段)

入门案例:流计算使用FlinkTableAPI和SQL分别对流计算编写入门案例,具体如下所示。SQL案例FlinkSQL流式数据处理案例演示,官方Example案例,具体代码如下所示:packagexx.xxxxxx.flink.start.stream;importlombok.*;importorg.apache... 查看详情

flink从入门到精通100篇(二十四)-对flinksqlclient源码做深度解析(代码片段)

前言本文基于Flink1.12-SNAPSHOT,使用sqlclient命令行提交insert语句进行整个流程的分析。sql-client.sh embedded --update "INSERT INTO user_log_sink2 SELECT * FROM user_log"Initializethe 查看详情

flink从入门到精通100篇(二十三)-flink实战应用案例:如何清理过期的checkpoint目录?(代码片段)

目录FlinkCheckpoint目录的清除策略生产环境应该选择哪种清除策略生产环境必须定期脚本清理Checkpoint和Savepoint目录RocksDB增量Checkpoint实现原理如何合理地删除Checkpoint目录?通过解析FlinkCheckpoint的元数据信息来合理清理Checkpoint信息1... 查看详情

《从0到1学习flink》——flink项目如何运行?(代码片段)

...学习Flink》——Mac上搭建Flink1.6.0环境并构建运行简单程序入门中其实提到过了Flink自带的UI界面,今天我们就来看看如何将我们的项目打包在这里发布运行。准备编译打包项目代码就拿我之前的文章《从0到1学习Flink》——Flink写... 查看详情

flink从入门到精通系列(代码片段)

1、Flink概述ApacheFlink是一个框架和分布式处理引擎,用于在,无边界和有边界数据流上进行有状态的计算,Flink能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。ApacheFlink功能强大,支持开... 查看详情

《从0到1学习flink》——flinkdatatransformation(转换)(代码片段)

前言在第一篇介绍Flink的文章《《从0到1学习Flink》——ApacheFlink介绍》中就说过Flink程序的结构Flink应用程序结构就是如上图所示:1、Source:数据源,Flink在流处理和批处理上的source大概有4类:基于本地集合的source、基于文件的sour... 查看详情

flink从入门到精通系列文章

戳更多文章:1-Flink入门2-本地环境搭建&构建第一个Flink应用3-DataSetAPI4-DataSteamAPI5-集群部署6-分布式缓存7-重启策略8-Flink中的窗口9-Flink中的TimeFlink时间戳和水印Broadcast广播变量FlinkTable&SQLFlink实战项目实时热销排行Flink写入Red... 查看详情

《从0到1学习flink》——介绍flink中的streamwindows(代码片段)

...。在这篇文章中,我们将讨论用于流处理的窗口的概念,介绍Flink的内置窗口,并解释它对自定义窗口语义的支持。什么是Windows?下面我们结合一个现实的例子来说明。就拿交通传感器的示例:统计经过某红绿灯的汽车数量之和... 查看详情

flink入门-流处理(代码片段)

入门需要掌握:从入门demo理解、flink系统架构(看几个关键组件)、安装、使用flink的命令跑jar包+flink的webUI界面的监控、常见错误、调优一、入门demo:统计单词个数0、单词txt文本内容(words.txt):helloworldhelloflinkhellojava1、DataSetapi... 查看详情