学习Flink:实践培训

本次培训的目标和范围

本培训介绍了Apache Flink,包括足够的内容让你开始编写可扩展的流式ETL,分析和事件驱动的应用程序,同时省略了很多(最终重要的)细节。本书的重点是为Flink管理状态和时间的API提供直接的介绍,希望在掌握了这些基础知识后,你能更好地从更详细的参考文档中获取其余需要了解的内容。每一节末尾的链接将引导你到可以学习更多知识的地方。

具体来说,您将学习

  • 如何实现流数据处理管道
  • Flink如何以及为何管理国家
  • 如何使用事件时间来持续计算准确的分析结果?
  • 如何在连续流上构建事件驱动的应用程序?
  • Flink是如何提供具有精确只读语义的容错、有状态的流处理的?

本培训主要介绍四个关键概念:流数据的连续处理、事件时间、有状态的流处理和状态快照。本页介绍了这些概念。

注 伴随本培训的是一套实践练习,它将指导你学习如何使用所介绍的概念。每一节的最后都提供了相关练习的链接。

流处理

流是数据的天然栖息地。无论是来自网络服务器的事件,还是来自股票交易所的交易,或者是来自工厂车间机器的传感器读数,数据都是作为流的一部分被创建的。但当你分析数据时,你可以围绕有界流或无界流来组织处理,你选择哪种范式都会产生深远的影响。

当你处理一个有边界的数据流时,批处理是工作的范式。在这种操作模式下,你可以选择在产生任何结果之前摄取整个数据集,这意味着,例如,可以对数据进行排序,计算全局统计,或产生一个总结所有输入的最终报告。

另一方面,流处理涉及无边界的数据流。至少在概念上,输入可能永远不会结束,因此你不得不在数据到达时持续处理数据。

在Flink中,应用程序由流式数据流组成,这些数据流可以通过用户定义的操作符进行转换。这些数据流形成定向图,从一个或多个源开始,到一个或多个汇结束。

通常,程序中的变换和数据流中的操作符之间是一对一的对应关系。但有时,一个变换可能由多个运算符组成。

一个应用程序可能会消耗来自流媒体源的实时数据,如消息队列或分布式日志,如Apache Kafka或Kinesis。但flink也可以消耗来自各种数据源的有界历史数据。同样,Flink应用正在产生的结果流也可以被发送到各种各样的系统,这些系统可以作为汇接。

并行数据流

Flink中的程序本质上是并行和分布式的。在执行过程中,一个流有一个或多个流分区,每个操作员有一个或多个操作员子任务。操作员子任务相互独立,在不同的线程中执行,也可能在不同的机器或容器上执行。

运算符子任务的数量就是该特定运算符的并行性。同一程序的不同运算符可能具有不同的并行性水平。

流可以在两个操作符之间以一对一(或转发)的模式或以再分配的模式传输数据。

  • 一对一的流(例如上图中Source和map()操作符之间)保留了元素的分区和排序。这意味着map()操作符的子任务[1]将看到与Source操作符的子任务[1]所产生的元素顺序相同的元素。
  • 重新分配流(如上面map()和keyBy/window之间,以及keyBy/window和Sink之间)会改变流的分区。每个操作者子任务都会根据所选的转换将数据发送到不同的目标子任务。例如keyBy()(通过散列密钥来重新分区)、broadcast()或rebalance()(随机重新分区)。在重分配交换中,元素之间的排序只在每一对发送和接收子任务中被保留(例如,map()的子任务[1]和keyBy/window的子任务[2])。所以,例如,上面所示的keyBy/window和Sink运算符之间的再分配,引入了关于不同密钥的聚合结果到达Sink的顺序的非确定性。

及时的流式处理

对于大多数流式应用来说,能够用处理实时数据的相同代码重新处理历史数据是非常有价值的--无论如何,都能产生确定性的、一致的结果。

此外,关注事件发生的顺序,而不是事件交付处理的顺序,并且能够推理出一组事件何时(或应该)完成也是至关重要的。例如,考虑电子商务交易,或金融贸易中涉及的一系列事件。

通过使用记录在数据流中的事件时间戳,而不是使用处理数据的机器的时钟,可以满足这些及时流处理的要求。

有状态的流处理

Flink的操作可以是有状态的。这意味着一个事件的处理方式可以取决于之前所有事件的累积效果。状态可以用于一些简单的事情,例如计算每分钟的事件以显示在仪表板上,或者用于一些更复杂的事情,例如计算欺诈检测模型的功能。

一个Flink应用是在分布式集群上并行运行的。一个给定的操作者的各种并行实例将以不同的线程独立执行,一般来说,它们将在不同的机器上运行。

一个有状态操作符的并行实例集实际上是一个分片的键值存储。每一个并行实例负责处理一组特定键的事件,这些键的状态被保存在本地。

下图显示了一个作业,在作业图中的前三个操作符上运行的并行度为2,终止于一个并行度为1的sink。第三个操作符是有状态的,你可以看到在第二个和第三个操作符之间发生了一个完全连接的网络洗牌。这是在通过一些键来对流进行分区,这样所有需要一起处理的事件将一起被处理。

状态总是在本地访问,这有助于Flink应用实现高吞吐量和低延迟。您可以选择将状态保存在JVM堆上,如果状态太大,则保存在高效组织的磁盘数据结构中。

通过状态快照进行容错

Flink能够通过状态快照和流重放的组合,提供容错、精确的一次性语义。这些快照捕获了分布式管道的整个状态,记录了进入输入队列的偏移以及整个作业图中因摄取了该点数据而产生的状态。当发生故障时,源会被重卷,状态被恢复,并恢复处理。如上所述,这些状态快照是异步捕获的,不会妨碍正在进行的处理。

Flink-v1.12官方网站翻译-P005-Learn Flink: Hands-on Training的更多相关文章

  1. Flink-v1.12官方网站翻译-P002-Fraud Detection with the DataStream API

    使用DataStream API进行欺诈检测 Apache Flink提供了一个DataStream API,用于构建强大的.有状态的流式应用.它提供了对状态和时间的精细控制,这使得高级事件驱动系统的 ...

  2. Flink-v1.12官方网站翻译-P015-Glossary

    术语表 Flink Application Cluster Flink应用集群是一个专用的Flink集群,它只执行一个Flink应用的Flink作业.Flink集群的寿命与Flink应用的寿命绑定. ...

  3. Flink-v1.12官方网站翻译-P004-Flink Operations Playground

    Flink操作训练场 在各种环境中部署和操作Apache Flink的方法有很多.无论这种多样性如何,Flink集群的基本构件保持不变,类似的操作原则也适用. 在这个操场上,你将学习如何管理和运行Fl ...

  4. Flink-v1.12官方网站翻译-P022-Working with State

    有状态程序 在本节中,您将了解Flink为编写有状态程序提供的API.请看一下Stateful Stream Processing来了解有状态流处理背后的概念. 带键值的数据流 如果要使用键控状态,首 ...

  5. Flink-v1.12官方网站翻译-P016-Flink DataStream API Programming Guide

    Flink DataStream API编程指南 Flink中的DataStream程序是对数据流实现转换的常规程序(如过滤.更新状态.定义窗口.聚合).数据流最初是由各种来源(如消息队列.套接字流. ...

  6. Flink-v1.12官方网站翻译-P014-Flink Architecture

    Flink架构 Flink是一个分布式系统,为了执行流式应用,需要对计算资源进行有效的分配和管理.它集成了所有常见的集群资源管理器,如Hadoop YARN.Apache Mesos和Kubernet ...

  7. Flink-v1.12官方网站翻译-P006-Intro to the DataStream API

    DataStream API介绍 本次培训的重点是广泛地介绍DataStream API,使你能够开始编写流媒体应用程序. 哪些数据可以流化? Flink的DataStream APIs for Ja ...

  8. Flink-v1.12官方网站翻译-P025-Queryable State Beta

    可查询的状态 注意:可查询状态的客户端API目前处于不断发展的状态,对所提供接口的稳定性不做保证.在即将到来的Flink版本中,客户端的API很可能会有突破性的变化. 简而言之,该功能将Flink的托 ...

  9. Flink-v1.12官方网站翻译-P008-Streaming Analytics

    流式分析 事件时间和水印 介绍 Flink明确支持三种不同的时间概念. 事件时间:事件发生的时间,由产生(或存储)该事件的设备记录的时间 摄取时间:Flink在摄取事件时记录的时间戳. 处理时间:您的 ...

随机推荐

  1. ElasticSearch教程——filter与query对比(转学习使用)

    一.数据准备 PUT /company/employee/2 { "address": { "country": "china", &quo ...

  2. LeetCode 面试题16.18.模式匹配

    模式匹配 题目: 你有两个字符串,即pattern和value. pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式.例如,字符串" ...

  3. “==”和equals的区别

    区别: (1)比较基本数据类型时 只能采用"==",比较的是数值; (2)当比较引用数据类型时 "==" 比较的是引用对象的内存地址; 而equals分两种情况 ...

  4. Popup中ListBox的SelectChange事件关闭弹出窗体后主窗体点击无效BUG

    WPF的BUG!弹出框的 自定义控件里有Popup, Popup里面放一个ListBox 在ListBox中的SelectionChange事件触发关闭弹出框后,主窗体存在一定概率卡死(但点击标题又能 ...

  5. web网上书店总结(jsp+servlet)

    web网上书店总结 前端的首页.效果如下: 基本上按照页面有的内容对其实现功能.按照用户划分功能模块,有后台管理员和普通用户,登录的时候会判断账户的类别,例如0权限代表普通用户登录,1权限代表管理员登 ...

  6. 【MySQL】1托2 ab复制 一个主机两个slave操作手册

    所有实验环境全部是新建的,如果不是新建的mysql一定要备份!!! 环境:CentOS release 6.8 x64 master:192.168.25.100 slave1: 192.168.25 ...

  7. 电子邮箱、邮件地址、网站地址正则表达式!几个有用的RE、regex、regexp!

    几个常用的正则表达式! r"\w[-\w\.]*@\w[-\w]*(\.\w[-\w]*)+" 这个是电子邮件地址的. r"<TAG\b[^>]*<(. ...

  8. 5.2 Spring5源码--Spring AOP源码分析二

    目标: 1. 什么是AOP, 什么是AspectJ 2. 什么是Spring AOP 3. Spring AOP注解版实现原理 4. Spring AOP切面原理解析 一. 认识AOP及其使用 详见博 ...

  9. ts类与修饰符

    最近在用egret做游戏,就接触到了ts,刚开始的时候觉得类挺难的,毕竟大多数的JavaScript工程师工作中不怎么需要用到这个,但是学起来就不愿意撒手了,真香! typescript其实是es6的 ...

  10. 算法模板 - C++ 高精度运算

    C++算法板子 高精度 高精度推荐用python来写,python有大整数,这里写的是关于C++的高精度运算模板 1.高精 * 低精 #include <iostream> #includ ...