学习Flink:实践培训 本次培训的目标和范围 本培训介绍了Apache Flink,包括足够的内容让你开始编写可扩展的流式ETL,分析和事件驱动的应用程序,同时省略了很多(最终重要的)细节.本书的重点是为Flink管理状态和时间的API提供直接的介绍,希望在掌握了这些基础知识后,你能更好地从更详细的参考文档中获取其余需要了解的内容.每一节末尾的链接将引导你到可以学习更多知识的地方. 具体来说,您将学习 如何实现流数据处理管道 Flink如何以及为何管理国家 如何使用事件时间来持续计算准确的分析…
可查询的状态 注意:可查询状态的客户端API目前处于不断发展的状态,对所提供接口的稳定性不做保证.在即将到来的Flink版本中,客户端的API很可能会有突破性的变化. 简而言之,该功能将Flink的托管键值(分区)状态(参见Working with State)暴露给外界,并允许用户从Flink外部查询作业的状态.对于某些场景来说,可查询状态消除了与外部系统(如键值存储)进行分布式操作/交易的需求,而这往往是实践中的瓶颈.此外,该功能对于调试目的可能特别有用. 注意事项 当查询一个状态对象时,该…
术语表 Flink Application Cluster Flink应用集群是一个专用的Flink集群,它只执行一个Flink应用的Flink作业.Flink集群的寿命与Flink应用的寿命绑定. Flink Job Cluster Flink Job Cluster是一个专用的Flink Cluster,它只执行一个Flink Job.Flink Cluster的寿命与Flink Job的寿命绑定. Flink Cluster 一个分布式系统由(通常)一个JobManager和一个或多个Fl…
Flink架构 Flink是一个分布式系统,为了执行流式应用,需要对计算资源进行有效的分配和管理.它集成了所有常见的集群资源管理器,如Hadoop YARN.Apache Mesos和Kubernetes,但也可以设置为独立集群甚至作为库运行. 本节包含对Flink架构的概述,并描述其主要组件如何交互执行应用程序并从故障中恢复. Flink集群的解剖 Flink运行时由两种类型的进程组成:一个JobManager和一个或多个TaskManagers. 客户端不是运行时和程序执行的一部分,而是用来…
通过状态快照进行容错 状态后台 Flink管理的键控状态是一种碎片化的.键/值存储,每项键控状态的工作副本都被保存在负责该键的任务管理员的本地某处.操作员的状态也被保存在需要它的机器的本地.Flink会定期对所有状态进行持久化快照,并将这些快照复制到某个更持久的地方,比如分布式文件系统. 在发生故障的情况下,Flink可以恢复你的应用程序的完整状态,并恢复处理,就像什么都没有发生过一样. Flink管理的这种状态被存储在状态后端中.状态后端有两种实现--一种是基于RocksDB的,它是一个嵌入式…
利用表格API进行实时报告 Apache Flink提供的Table API是一个统一的.关系型的API,用于批处理和流处理,即在无边界的.实时的流或有边界的.批处理的数据集上以相同的语义执行查询,并产生相同的结果.Flink中的Table API通常用于简化数据分析.数据管道化和ETL应用的定义. 你将建设什么? 在本教程中,您将学习如何构建一个实时的仪表盘,以按账户跟踪金融交易.该管道将从Kafka读取数据,并将结果写入MySQL,通过Grafana可视化. 先决条件 本演练假设你对Java…
使用DataStream API进行欺诈检测 Apache Flink提供了一个DataStream API,用于构建强大的.有状态的流式应用.它提供了对状态和时间的精细控制,这使得高级事件驱动系统的实现成为可能.在这个分步指南中,你将学习如何使用Flink的DataStream API来构建一个有状态的流应用. 你在建造什么? 在数字时代,信用卡诈骗是一个日益严重的问题.犯罪分子通过行骗或入侵不安全的系统来盗取信用卡号码.盗取的号码通过进行一次或多次小额购物来测试,通常是一美元或更少.如果这样…
流式分析 事件时间和水印 介绍 Flink明确支持三种不同的时间概念. 事件时间:事件发生的时间,由产生(或存储)该事件的设备记录的时间 摄取时间:Flink在摄取事件时记录的时间戳. 处理时间:您的管道中的特定操作员处理事件的时间. 为了获得可重复的结果,例如,在计算某一天股票在交易的第一个小时内达到的最高价格时,您应该使用事件时间.这样一来,结果就不会依赖于计算的时间.这种实时应用有时会使用处理时间,但这样一来,结果就会由该小时内恰好处理的事件决定,而不是由当时发生的事件决定.基于处理时间的…
Flink操作训练场 在各种环境中部署和操作Apache Flink的方法有很多.无论这种多样性如何,Flink集群的基本构件保持不变,类似的操作原则也适用. 在这个操场上,你将学习如何管理和运行Flink Jobs.您将看到如何部署和监控应用程序,体验Flink如何从Job故障中恢复,并执行日常操作任务,如升级和重新缩放. 这个游乐场的构造 这个游乐场由一个长寿的Flink Session Cluster和一个Kafka Cluster组成. 一个Flink Cluster总是由一个JobMa…
本地安装 按照以下几个步骤下载最新的稳定版本并开始使用. 第一步:下载 为了能够运行Flink,唯一的要求是安装了一个有效的Java 8或11.你可以通过以下命令检查Java的正确安装. java -version 下载1.12.0版本,并解压. $ tar -xzf flink-1.12.0-bin-scala_2.11.tgz $ cd flink-1.12.0-bin-scala_2.11 第二步:启动群集 Flink通过一个bash脚本来启动一个本地集群. $ ./bin/start-c…
用户自定义函数 大多数操作都需要用户定义的函数.本节列出了如何指定这些函数的不同方法.我们还涵盖了累加器,它可以用来深入了解您的Flink应用. Lambda函数 在前面的例子中已经看到,所有的操作都接受lambda函数来描述操作. val data: DataSet[String] = // [...] data.filter { _.startsWith("http://") } val data: DataSet[Int] = // [...] data.reduce { (i1…
管理状态的自定义序列化 本页面的目标是为需要使用自定义状态序列化的用户提供指导,涵盖了如何提供自定义状态序列化器,以及实现允许状态模式演化的序列化器的指南和最佳实践. 如果你只是简单地使用Flink自己的序列化器,这个页面是不相关的,可以忽略. 使用自定义状态序列器 当注册一个托管操作符或键控状态时,需要一个StateDescriptor来指定状态的名称,以及状态的类型信息.类型信息被Flink的类型序列化框架用来为状态创建合适的序列化器. 也可以完全绕过这一点,让Flink使用自己的自定义序列…
状态方案的演变 Apache Flink流媒体应用通常被设计为无限期或长时间运行.与所有长期运行的服务一样,应用程序需要更新以适应不断变化的需求.这对于应用程序所针对的数据模式也是一样的,它们会随着应用程序的发展而发展. 本页提供了关于如何演进状态类型的数据模式的概述.当前的限制在不同的类型和状态结构(ValueState.ListState等)中有所不同. 请注意,本页面上的信息仅在您使用由Flink自己的类型序列化框架生成的状态序列化器时相关.也就是说,在声明你的状态时,所提供的状态描述符并…
状态后台 Flink提供了不同的状态后端,指定状态的存储方式和位置. 状态可以位于Java的堆上或离堆.根据你的状态后端,Flink还可以为应用程序管理状态,这意味着Flink处理内存管理(必要时可能会溢出到磁盘),以允许应用程序持有非常大的状态.默认情况下,配置文件flink-conf.yaml决定了所有Flink作业的状态后端. 然而,默认的状态后端可以在每个作业的基础上被重写,如下所示. 有关可用的状态后端.其优势.限制和配置参数的更多信息,请参见部署与操作中的相应章节. val env…
检查点 Flink中的每一个函数和操作符都可以是有状态的(详情请看使用状态).有状态的函数在单个元素/事件的处理过程中存储数据,使得状态成为任何类型的更复杂操作的关键构建模块. 为了使状态具有容错性,Flink需要对状态进行检查点.检查点允许Flink恢复流中的状态和位置,使应用程序具有与无故障执行相同的语义. 关于流式容错的文档详细描述了Flink的流式容错机制背后的技术. 前置条件 Flink的检查点机制与流和状态的持久存储交互.一般来说,它需要 一个能在一定时间内重放记录的持久(或耐用)数…
广播状态模式 在本节中,您将了解如何在实践中使用广播状态.请参考状态流处理,了解状态流处理背后的概念. 提供的API 为了展示所提供的API,我们将在介绍它们的全部功能之前先举一个例子.作为我们的运行示例,我们将使用这样的情况:我们有一个不同颜色和形状的对象流,我们希望找到相同颜色的对象对,并遵循特定的模式,例如,一个矩形和一个三角形.我们假设有趣的模式集会随着时间的推移而演变. 在这个例子中,第一个流将包含具有颜色和形状属性的 Item 类型的元素.另一个流将包含规则. 从Items流开始,我…
有状态程序 在本节中,您将了解Flink为编写有状态程序提供的API.请看一下Stateful Stream Processing来了解有状态流处理背后的概念. 带键值的数据流 如果要使用键控状态,首先需要在DataStream上指定一个键,这个键应该用来分割状态(也包括流中的记录本身).你可以在DataStream上使用keyBy(KeySelector)指定一个键.这将产生一个KeyedDataStream,然后允许使用keyed状态的操作. key selector函数将一条记录作为输入,…
状态和容错 在本节中,您将了解Flink为编写有状态程序提供的API.请看一下Stateful Stream Processing来了解有状态流处理背后的概念. 下一步去哪里? Working with State: Shows how to use state in a Flink application and explains the different kinds of state. The Broadcast State Pattern: Explains how to connect…
内置水印生成器 正如在Generating Watermarks一文中所描述的,Flink提供了抽象,允许程序员分配自己的时间戳和发射自己的水印.更具体地说,可以通过实现WatermarkGenerator接口来实现. 为了进一步简化此类任务的编程工作,Flink自带了一些预先实现的时间戳分配器.本节提供了它们的列表.除了它们的开箱即用的功能外,它们的实现可以作为自定义实现的范例. 单调增加的时间戳 周期性水印生成的最简单的特殊情况是当给定源任务看到的时间戳以升序出现时.在这种情况下,当前的时间…
生成水印 在本节中,您将了解 Flink 提供的 API,用于处理事件时间时间戳和水印.关于事件时间.处理时间和摄取时间的介绍,请参考事件时间的介绍. 水印策略介绍 为了使用事件时间,Flink需要知道事件的时间戳,这意味着流中的每个元素都需要分配其事件时间戳.这通常是通过使用TimestampAssigner从元素中的某个字段访问/提取时间戳来完成的. 时间戳分配与生成水印是同步进行的,水印告诉系统事件时间的进展.你可以通过指定一个WatermarkGenerator来配置. Flink AP…
事件时间 在本节中,您将学习如何编写时间感知的Flink程序.请看一下及时流处理,了解及时流处理背后的概念. 关于如何在Flink程序中使用时间的信息请参考windowing和ProcessFunction. 需要注意的是,为了使用事件时间感知操作,程序需要使用直接为数据定义事件时间并自己发射水印的源,或者程序必须在源之后注入一个时间戳分配器&水印生成器.这些函数描述了如何访问事件时间戳,以及事件流表现出何种程度的无序性. 下一步去哪里? Generating Watermarks: Shows…
执行模式(批处理/流处理) DataStream API 支持不同的运行时执行模式,您可以根据用例的要求和作业的特点从中选择.DataStream API 有一种 "经典 "的执行行为,我们称之为 STREAMING 执行模式.这应该用于需要连续增量处理并预计无限期保持在线的非绑定作业.此外,还有一种批式执行模式,我们称之为BATCH执行模式.这种执行作业的方式更容易让人联想到批处理框架,如MapReduce.这应该用于有边界的作业,对于这些作业,你有一个已知的固定输入,并且不会连续运…
Flink DataStream API编程指南 Flink中的DataStream程序是对数据流实现转换的常规程序(如过滤.更新状态.定义窗口.聚合).数据流最初是由各种来源(如消息队列.套接字流.文件)创建的.结果通过汇流返回,例如可以将数据写入文件,或标准输出(例如命令行终端).Flink程序可以在各种环境下运行,独立运行,或者嵌入到其他程序中.执行可以发生在本地JVM中,也可以发生在许多机器的集群中. 为了创建你自己的Flink DataStream程序,我们鼓励你从一个Flink程序的…
及时的流处理 介绍 及时流处理是有状态流处理的一种扩展,其中时间在计算中起着一定的作用.其中,当你做时间序列分析时,当做基于某些时间段(通常称为窗口)的聚合时,或者当你做事件处理时,事件发生的时间很重要时,都是这种情况. 在下面的章节中,我们将着重介绍一些您在使用及时Flink应用时应该考虑的主题. 时间概念:事件时间和处理时间 当在流程序中提到时间时(例如定义窗口),可以提到不同的时间概念. - 处理时间.处理时间指的是正在执行相应操作的机器的系统时间.
当流程序在处理时间上运行时,所有基于时…
有状态的流处理 什么是状态? 虽然数据流中的许多操作一次只看一个单独的事件(例如事件解析器),但有些操作会记住多个事件的信息(例如窗口操作符).这些操作被称为有状态操作.一些有状态操作的例子. - 当一个应用程序搜索某些事件模式时,状态将存储到目前为止遇到的事件序列. - 当按分钟/小时/天聚合事件时,状态会保存待聚合的事件. - 当在数据点流上训练机器学习模型时,状态会保存模型参数的当前版本. - 当需要管理历史数据时,状态可以有效访问过去发生的事件.Flink需要了解状态,以便使用检查点和保…
概念-概览 实践培训解释了作为Flink的API基础的有状态和及时流处理的基本概念,并提供了这些机制如何在应用中使用的例子.有状态的流处理是在数据管道和ETL的背景下介绍的,并在容错部分进一步发展.在 "流分析 "一节中介绍了及时的流处理. 本概念深度部分提供了对Flink的架构和运行时如何实现这些概念的更深入理解. Flink的API Flink为开发流式/批处理应用提供了不同层次的抽象. - 最底层的抽象只是提供有状态和及时的流处理.它通过处理函数嵌入到DataStream API…
事件驱动的应用 处理函数 简介 ProcessFunction将事件处理与定时器和状态结合起来,使其成为流处理应用的强大构件.这是用Flink创建事件驱动应用的基础.它与RichFlatMapFunction非常相似,但增加了定时器. 例子 如果你做过 "流分析 "培训中的实战练习,你会记得它使用TumblingEventTimeWindow来计算每个司机在每个小时内的小费总和,像这样. // compute the sum of the tips per hour for each…
数据管道和ETL 对于Apache Flink来说,一个非常常见的用例是实现ETL(提取.转换.加载)管道,从一个或多个源中获取数据,进行一些转换和/或丰富,然后将结果存储在某个地方.在这一节中,我们将看看如何使用Flink的DataStream API来实现这种应用. 请注意,Flink的Table和SQL API很适合许多ETL用例.但无论你最终是否直接使用DataStream API,对这里介绍的基础知识有一个扎实的理解都会证明是有价值的. 无状态转换 本节介绍了map()和flatmap…
DataStream API介绍 本次培训的重点是广泛地介绍DataStream API,使你能够开始编写流媒体应用程序. 哪些数据可以流化? Flink的DataStream APIs for Java和Scala将让你流式处理任何它们可以序列化的东西.Flink自己的序列化器被用于 基本类型,即:字符串.长型.整数.布尔型.数组 复合类型.Tuples, POJOs, and Scala case classes. 而Flink又回到了Kryo的其他类型.也可以在Flink中使用其他序列化器…
本文翻译自flink官网:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/stream/operators/windows.html Windows是处理无限流的核心.Windows将流分成有限大小的“存储桶”,我们可以在其上应用计算.本文档重点介绍如何在Flink中执行窗口,以及程序员如何从其提供的功能中获得最大收益. 窗口式Flink程序的一般结构如下所示.第一个段指的是键控流,第二个段指的是非键控流.正如我们所…