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与这两者之间切换。

 

posted @   QiaoZhi  阅读(729)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2021-06-06 对象占用内存计算方法
2020-06-06 docker中基于centos7.3搭建tesseract5训练环境以及进行训练
2019-06-06 UML简介
2019-06-06 设计模式简介
2018-06-06 【Eclipse】eclipse生成类图、类交互图、包依赖图
点击右上角即可分享
微信分享提示