• Flink简介


    参考官网: https://flink.apache.org/

    截止目前:20220606, flink 最新的版本1.15。本次学习使用Flink1.13 + jdk8 进行学习。

    1. 简单介绍

      Flink 是Apache旗下的一个框架和分布式处理引擎。用于对无界和有界数据流进行有状态计算,核心目标是数据流上的有状态计算(Stateful Computations over Data Streams)。处理的是流式数据(Data Flow),数据流的含义就是数据并不是收集好的,而是像水流一样,逐个到来,逐个处理。所以Flink 适合的场景也就是需要实时处理数据流的场景。

      Flink 被设计再常见的集群环境中运行,以内存执行速度和任意规模来执行计算。

      框架处理流程图如下:

    2.主要应用场景

    1. 电商和市场营销

    比如:实时数据报表、广告投放、实时推荐、PV(PageView)和UV(UserView-根据IP来筛选)统计等。

    2. 物联网(IOT)

    传感器实时数据采集和现实、实时报警、交通运输业

    3. 物流配送和服务业

    订单实时更新、通知信息推送

    4. 银行和金融行业

    实时结算和通知推送、实时检测异常行为。

    3. 核心概念

    1. 有界数据和无界数据

    任何被处理的数据都可以被称为事件流。比如银行账单、机器日期、用户在网站的交互等。

    无界数据:有明确的开始但是没有结束。无界数据能持续不断的被处理。

    有界数据:有明确的开始和结束

    2. 流处理和批处理

    数据流:数据是一个一个来,是一组有序的数据序列。数据是来一个处理一个,这种处理模式就是流处理,也叫做实时处理。

    批量数据(数据集):数据是一批同时到来,是一个有限的数据集。数据是读一批然后一起计算,这种方式叫做批处理,也叫做离线处理。

    打个比喻:聊天和发信息。聊天就可以理解为数据流,信箱就可以理解为批量数据。聊天需要我们时刻关注新消息,会耗费大量精力,工作效率会受到影响。这也是传统的数据处理架构倾向于先收集数据再处理的原因。

    3. 有状态的流处理

      有状态的流处理:现实应用中,我们需要把一些数据保存到数据库或者其他地方进行处理(数据具有状态),处理完成只会更新状态,在传统的架构中,这个状态保存再数据库里,这就是所谓的有状态的流处理。

      可以用下图表示:

       我们需要保护本地状态,防止再处理过程中发生故障导致数据丢失。解决方法可以定期地将应用状态的一致性检查点(checkpoint)存盘,写入远程的持久化存储,遇到故障再去读取进行恢复,这样就保证了更好的容错性。

      有状态的流处理一般有以下几种典型应用。

    (1) 事件驱动型应用

      从一个或多个事件读取数据,并根据到来的事件触发计算、状态更新或其他外部动作。比较典型的是以Kafka 为代表的消息队列。

    (2) 数据分析型应用

      从原始数据中提取信息和发掘规律。传统上是将数据复制到数据仓库,然后批量查询。如果数据有了更新,必须将数据添加到要分析的数据集中,然后重新查询或应用程序。现在的做法一般是将大量数据(日志文件)写入分布式文件系统(HDFS)或HBase 等批量存储数据库,以较低的成本进行大容量存储。 然后可以通过sql-on-hadoop 累的引擎查询和处理数据,比如Hive。这种处理方式就是典型的批处理。

    (3)数据管道型应用

      ETL也就是数据提取、转换、加载,是在存储系统之家转换和移动数据的常用方法。在数据分析的应用中,通常会定期触发ETL 任务,将数据从事务数据库系统复制到分析数据库或数据仓库。数据管道的作用于ETL类似。它们可以转换和扩展数据,也可以在存储系统之家移动数据。只不过流处理来搭建数据管道,这些工作可以连续运行,不需要再周期性触发。 比如:数据管道可以用来监控文件系统目录的新文件、将数据写入事件日志。ETL与数据管道区别如下:

     4. 流处理-lambda 架构

      对于有状态的流处理,当数据越来越多时,必须用分布式的集群架构来获取更大的吞吐量。分布式架构带来的问题就是如何保证数据处理的顺序。

      批处理来说好处理,因为是一批一批处理,可以对一批进行选择、排序; 流处理是一条一条处理,所以比较复杂。因此出现了lambda 架构,lambda 架构可以理解为第一代流处理器和批处理器的简单合并:

       批处理层由传统的批处理器和存储组成,实时层由流处理器实现。数据到达后,两层一起处理,一方面由流处理器实时处理,另一方面写入批处理存储空间,等待皮处理器批量计算。流粗利器快速计算出一个近似结果,将它们写入流处理表中;而皮处理器会定期处理存储中的数据,将准确的结果写入批处理表,并从流处理表中删除不正确的结果。最终,应用程序会合并快速表和批处理表中的结果,并展示出来。(我理解有点类似于分布式事务的最终一致性)。

    5. 新一代流处理器-flink

      先前的流处理器只能在高吞吐和低延迟中二选一,新一代设计兼顾两者。其具备如下特点:

    (1) 高吞吐和低延迟。每秒处理数百万个事件,毫秒级延迟

    (2)结果的准确性:提供了事件时间和处理时间语义。对于乱序事件流,事件时间语义仍然能提供一致且准确的结果。

    (3)精确一次的状态一致性保证

    (4)可以连接常用的存储系统:kafka、es、jdbc、分布式文件系统(HDFS等)

    (5)高可用。本身高可用的设置,加上与K8S、YARN等紧密集成

    (6)能够更新应用程序代码并将作业迁移到不同的Flink 集群,而不丢失应用程序的状态.

    4. Flink分层API

      其整体API分层如下:

     最高层:仅提供了有状态流,将处理函数嵌入到了DataStream API中。

    TableAPI:以表为中心的声明式编程,其中表在表达流数据时会动态变化。遵循关系模型:二维数据结构(类似于关系库的表)。提供类似于select、join、group-by、aggregate 等操作。

    DataStream、DataSet :核心的操作。我们可以在tableAPI与这两者之间切换。

  • 相关阅读:
    Algs4-2.2.24-改进的有序测试
    Algs4-2.2.23-2比较正文中实现的归并和反向复制辅助数组归并之间的性能
    ssh登录卡住问题
    DELL R730安装ESXI虚拟化
    Linux umount的device is busy问题
    shell脚本调试技巧
    git编译安装
    卸载gitlab
    磁盘性能测试方法
    N! HDU 1042
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/16342917.html
Copyright © 2020-2023  润新知