zoukankan      html  css  js  c++  java
  • 【翻译】了解Flink-概览 -- Learn Flink-Overview

    了解Flink: 上手手册


    翻译来源 Learn Flink:Overview , Learn Flink: Hands-on Training

    手册目标和范围

    本手册介绍了Apache Flink的简介,其中包括了足够多的让您开始编写可伸缩的流ETL,分析和事件驱动的应用程序的知识,同时省略了许多(极为重要的)细节。重点在与对管理状态和时间的Flink APIs进行了直截了当的介绍,并期望您会掌握了这些基础知识,从而能更好掌握详细参考文档中的其余知识。每个部分末尾的链接将带您到更多了解信息的地方。

    具体来说,您将学习:

    • 如何实现流数据处理管道
    • Flink怎样和为什么管理状态
    • 怎么使用事件时间来一致地计算准确的分析
    • 怎么在连续流上构建事件驱动的应用程序
    • Flink怎样能够以刚好一次的语义提供容错的,有状态的流处理

    本手册重点关注四个关键概念:流数据的连续处理,事件时间,有状态流处理和状态快照。本页面介绍了这些概念。

    注意:在此手册的基础上,我们进行了一系列动手练习,它们将指导您学习如何使用所介绍的概念。每节末尾都提供了相关练习的链接。

    流处理

    流是数据的自然栖息地。无论是来自Web服务器的事件,来自证券交易所的交易数据,还是来自工厂车间机器上的传感器读数,数据都将作为流的一部分创建。但是,当您分析数据时,您可以围绕有界流或无界流来组织处理,并且这种模式的选择会对接下来的结果影响很深。

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

    另一方面,流处理涉及无界的数据流。至少从概念上讲,输入可能永远不会结束,因此您被迫在数据到达时对其进行连续处理。

    在Flink中,应用程序由可以被用户定义的算子转换的流媒体数据流组成。这些数据流形成有向图,这些图以一个或多个开始,并以一个或多个接收器结束。

    通常程序中的转换与数据流中的算子之间存在一一对应的关系。但是,有时,一个转换可能包含多个算子。

    应用程序可能会消耗来自流源(例如消息队列或分布式日志,例如Apache Kafka或Kinesis)的实时数据。但是flink也可以使用来自各种数据源的有界的历史数据。同样,可以将Flink应用程序产生的结果流发送到可以作为接收器连接的各种系统。

    并行数据流

    Flink中的程序本质上是并行的和分布式的。在执行期间,一个 流具有一个或多个流分区,并且每个算子具有一个或多个算子子任务。算子子任务彼此独立,并在不同的线程中执行,并且可能在不同的机器或容器上执行。

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

    流可以在两个算子之间按一对一(或 转发)模式或重新分布模式传输数据:

    • 一对一的流(例如 ,上图中的Source和map()算子之间)保留元素的分区和排序。这意味着map()算子的subtask [1]h和Source算子的subtask [1]看见相同元素,并且元素的顺序也相同。
    • 重新分布流(如上面的map()和keyBy/window之间以及keyBy/window和Sink之间)会更改流的分区。每个算子子任务都将数据发送到不同的目标子任务,具体取决于所选的转换。例如,keyBy() (通过hashing key方式重新分区),broadcast() ,或 rebalance() (随机地重新分区)。在重新分区转换中,元素之间的顺序仅在每对发送和接收子任务中间保留(例如,map()的subtask [1]和的keyBy/window的subtask [2]))。因此,例如,上面显示的keyBy/window和Sink算子之间的重新分布引入了不确定性,即关于不同键的聚合结果到达Sink的顺序。

    及时的流处理

    对于大多数流应用程序而言,能够使用相同代码重新处理实时历史数据,并产生确定性和一致的结果这件事是非常棒的。

    注意事件发生的顺序(并不是把事件发送进行处理的顺序),并能够推理出一组事件何时(或应该)完成,这至关重要。例如,电子商务交易或金融交易中涉及的事件。

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

    有状态流处理

    Flink的操作可以是有状态的。这意味着如何处理一个事件可能取决于该它之前发生的所有事件的累积结果。状态可以用于简单的事情(例如,每分钟统计要显示在仪表板上的事件),也可以用于更复杂的事情(例如,用于欺诈检测模型的计算功能)。

    Flink应用程序在分布式群集上并行运行。给定算子的各种并行实例将在单独的线程中独立执行,并且通常将在不同的机器上运行。

    有状态算子的并行实例集实际上是分片key-value存储。每个并行实例负责处理特定keys组的事件,并且这些keys的状态保存在本地。

    在下的作业图中显示了作业运行情况,横跨前三个算子的并行度为2,终止接收器并行度为1。第三个算子是有状态的,您可以看到第二个算子和第三个算子之间正在发生完全连接的网络混洗。这样做是为了通过某些键对流进行分区,以便所有需要一起处理的事件都将被处理到。

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

    通过状态快照进行容错

    Flink能通过状态快照和流重放的组合使用提供容错和恰好一次的语义。这些快照获取分布式管道的整个状态,保存进入到输入队列的偏移量和整个作业图的从读入数据的那一刻起的状态。发生故障时,将重新回退源,重新加载状态,并恢复处理。如上所述,这些状态快照是异步捕获的,而不会妨碍正在进行的处理。

  • 相关阅读:
    config Doku wiki
    [转载]【python】ipython与python的区别
    数组和指针
    C++初始化数据成员
    RSA算法原理
    C++四种cast
    百度笔试准备2
    百度笔试准备1
    百度面试准备
    C++的空类中默认产生哪些类成员函数
  • 原文地址:https://www.cnblogs.com/qlxm/p/14513565.html
Copyright © 2011-2022 走看看