Flink 学习记录

大数据--Flink

Flink 概念

Apache Flink是一个框架和分布式处理引擎,用于对无边界和有边界的数据流进行有状态的计算。Flink被设计为可以在所有常见集群环境中运行,并能以内存速度和任意规模执行计算。

状态的概念

所谓状态,就是在流式计算过程中将算子(Flink提供了丰富的用于数据处理的函数,这些函数称为算子)的中间结果(需要持续聚合计算,依赖后续的数据记录)保存在内存或者文件系统中,等下一个事件进入算子后可以从之前的状态中获取中间结果,以便计算当前的结果(当前结果的计算可能依赖于之前的中间结果),从而无须每次都基于全部的原始数据来统计结果,极大地提升了系统性能。

利用内存性能保障状态一致性

有状态的 Flink 程序针对本地状态访问进行了优化。任务的状态始终保留在内存中,如果状态大小超过可用内存,则会保存在能高效访问的磁盘数据结构中。任务通过访问本地(通常在内存中)状态来进行所有的计算,从而产生非常低的处理延迟。Flink 通过定期和异步地对本地状态进行持久化存储来保证故障场景下精确一次的状态一致性。

事件驱动

事件可以理解为消息。 事件驱动的应用程序是一种状态应用程序,flink会从一个或者多个流中注入事件,通过触发计算对注入的事件作出反应

批与流

  • 批处理
  • 批处理的特点是有界、持久、大量,非常适合需要访问全套记录才能完成的计算工作,一般用于离线统计。
  • 流处理
  • 流处理的特点是无界、实时, 无需针对整个数据集执行操作,而是对通过系统传输的每个数据项执行操作,一般用于实时统计。
  • 流处理区别于批处理最主要的两点是:
  1. 流即是流,不必人为地将它分割为文件;
  2. 时间的定义被明确地写入应用程序代码(如以上代码的时间窗口),而不是与摄取、计算和调度等过程牵扯不清

无边界数据流和边数据流

Flink最强悍的一点其实就是万物皆流,一切都是流形式,离线数据被称为有界流,实时数据被称为无界流

无边界数流数据: 有定义流的开始,也有定义流的结束。有界流可以在摄取所有数据后再进行计算。有界流所有数据可以被排序,所以并不需要有序摄取。有界流处理通常被称为批处理。如:电商交易数据,PM2.5检测等等。

有边界数据流: 有定义流的开始,也有定义流的结束。有界流可以在摄取所有数据后再进行计算。有界流所有数据可以被排序,所以并不需要有序摄取。有界流处理通常被称为批处理。其实,在一定程度上,有边界数据可以看作是无边界数据的一个子集。

Flink主要优势

1.同时支持高吞吐、低延迟

每秒处理数百万条事件的同时能够保持毫秒级延迟。而同类框架Spark Streaming在流式计算中无法做到低延迟保障。Apache Storm可以做到低延迟,但无法满足高吞吐的要求

2.支持有状态计算

每一个具有一定复杂度的流处理应用都是有状态的,任何运行基本业务逻辑的流处理应用都需要在一定时间内存储所接收的事件或中间结果,以供后续的某个时间点(例如收到下一个事件或者经过一段特定时间)进行访问并进行后续处理,

3.支持事件时间

两个时间概念

  1. 事件时间,即事件实际发生的时间。更准确地说,每一个事件都有一个与它相关的时间戳,并且时间戳是数据记录的一部分(比如手机或者服务器的记录)。事件时间其实就是时间戳,
  2. 处理时间,即事件被处理的时间。处理时间其实就是处理事件的机器所测量的时间,即事件传输到计算框架处理时,系统主机的当前时间。

时间是流处理框架的一个重要组成部分。目前大多数框架计算采用的都是系统处理时间(Process Time),也就是事件传输到计算框架处理时,系统主机的当前时间。Flink除了支持处理时间外,还支持事件时间(Event Time),根据事件本身自带的时间戳(事件的产生时间)进行结果的计算,例如窗口聚合、会话计算、模式检测和基于时间的聚合等。这种基于事件驱动的机制使得事件即使乱序到达,Flink也能够计算出精确的结果,保证了结果的准确性和一致性。

4.支持高可用性配置

Flink可以与YARNHDFSZooKeeperk8s等紧密集成,配置高可用,从而可以实现快速故障恢复、动态扩容、7×24小时运行流式应用等作业。

支持快照恢复

Flink可以将任务执行的快照保存在存储介质上,当需要停机运维等操作时,下次启动可以直接从事先保存的快照恢复原有的计算状态,使得任务继续按照停机之前的状态运行。此外,Flink还支持在不丢失应用状态的前提下更新作业的程序代码,或进行跨集群的作业迁移。

5.提供了不同层级的API

1.Stateful Stream Processing API

Flink中处理有状态流最底层的接口,它通过Process Function(低阶APIFlink提供的最具表达力的底层接口)嵌入DataStream API中,允许用户自由地处理一个或多个流中的事件,并使用一致的容错状态。此外,用户可以注册事件时间和处理时间回调,从而允许程序实现复杂的计算。用户可以通过这个API接口操作状态、时间等底层数据。

使用Stateful Stream Process API接口可以实现非常复杂的流式计算逻辑,开发灵活性非常强,但是用户使用成本也相对较高。

2,DataStream/DataSet API

DataStream API用于处理无界数据集,即流处理;DataSet API用于处理有界数据集,即批处理。这两种API都提供了用于数据处理的通用操作,例如各种形式的转换、连接、聚合等

3 .Table API

Table API构建在DataStream/DataSet API之上,提供了大量编程接口,例如GroupByKeyJoin等操作,是批处理和流处理统一的关系型API

Table API的原理是将内存中的DataStream/DataSet数据集在原有的基础上增加Schema信息,将数据类型统一抽象成表结构,然后通过Table API提供的接口处理对应的数据集,从而简化数据分析。

4.SQL API

Flink提供的最高级别的抽象是SQL API。这种抽象在语义和表达方式上均类似于Table API,但是将程序表示为SQL查询表达式。SQL抽象与Table API紧密交互,并且可以对Table API中定义的表执行SQL查询.

Flink应用场景

在实际生产的过程中,大量数据在不断地产生,例如金融交易数据、互联网订单数据、GPS定位数据、传感器信号、移动终端产生的数据、通信信号数据等,以及我们熟悉的网络流量监控、服务器产生的日志数据,这些数据最大的共同点就是实时从不同的数据源中产生,然后再传输到下游的分析系统。

实时智能推荐

利用Flink流计算帮助用户构建更加实时的智能推荐系统,对用户行为指标进行实时计算,对模型进行实时更新,对用户指标进行实时预测,并将预测的信息推送给Web/App端,帮助用户获取想要的商品信息,另一方面也帮助企业提高销售额,创造更大的商业价值。

复杂事件处理

例如工业领域的复杂事件处理,这些业务类型的数据量非常大,且对数据的时效性要求较高。我们可以使用Flink提供的CEP(复杂事件处理)进行事件模式的抽取,同时应用FlinkSQL进行事件数据的转换,在流式系统中构建实时规则引擎。

实时欺诈检测

在金融领域的业务中,常常出现各种类型的欺诈行为。运用Flink流式计算技术能够在毫秒内就完成对欺诈判断行为指标的计算,然后实时对交易流水进行规则判断或者模型预测,这样一旦检测出交易中存在欺诈嫌疑,则直接对交易进行实时拦截,避免因为处理不及时而导致的经济损失

实时数仓与ETL

结合离线数仓,通过利用流计算等诸多优势和SQL灵活的加工能力,对流式数据进行实时清洗、归并、结构化处理,为离线数仓进行补充和优化。另一方面结合实时数据ETL处理能力,利用有状态流式计算技术,可以尽可能降低企业由于在离线数据计算过程中调度逻辑的复杂度,高效快速地处理企业需要的统计结果,帮助企业更好的应用实时数据所分析出来的结果。

流数据分析

实时计算各类数据指标,并利用实时结果及时调整在线系统相关策略,在各类投放、无线智能推送领域有大量的应用。流式计算技术将数据分析场景实时化,帮助企业做到实时化分析Web应用或者App应用的各种指标。

实时报表分析

实时报表分析说近年来很多公司采用的报表统计方案之一,其中最主要的应用便是实时大屏展示。利用流式计算实时得出的结果直接被推送到前段应用,实时显示出重要的指标变换,最典型的案例就是淘宝的双十一实时战报。

Flink程序结构

一个Flink应用程序由3部分构成,或者说将Flink的操作算子可以分成3部分,分别为SourceTransformationSink

· Source:数据源部分。负责读取指定存储介质中的数据,转为分布式数据流或数据集,例如readTextFile()socketTextStream()等算子

· Transformation:数据转换部分。负责对一个或多个数据流或数据集进行各种转换操作,并产生一个或多个输出数据流或数据集,例如map()flatMap()keyBy()等算子。

· Sink:数据输出部分。负责将转换后的结果数据发送到HDFS、文本文件、MySQLElasticsearch等目的地,数据输出部分。负责将转换后的结果数据发送到HDFS、文本文件、MySQLElasticsearch等目的地,

数据传输服务DTS

数据传输服务DTSData Transmission Service)是实时数据流服务,支持关系型数据库(RDBMS)、非关系型的数据库(NoSQL)、数据多维分析(OLAP)等数据源间的数据交互,集数据同步、迁移、订阅、集成、加工于一体,构建安全、可扩展、高可用的数据架构。

数据同步功能旨在帮助用户实现两个数据源之间的数据实时同步。

数据迁移功能旨在帮助用户方便、快速地实现各种数据源之间的数据迁移,适用于数据上云迁移、阿里云内部跨实例数据迁移、数据库拆分扩容等业务场景。

数据校验是数据传输服务DTSData Transmission Service)提供的用于监控源库与目标库数据差异的功能,支持在不停服的情况下对源库和目标库进行数据校验,帮助您及时发现数据不一致的问题。

业务数据库和数据仓库区别

业务数据库与数据仓库的区别实际讲的是 OLTP OLAP 的区别。

操作型处,叫联机事务处 OLTPOn-Line Transaction Processing,),也可以称面向交的处系统,它是针对具体业务在数据库联机的日常操作,通常对少数记录进查询、修改。用户较为关心操 作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管的主要手段,主要用于操作型处

分析型处,叫联机分析处 OLAPOn-Line Analytical Processing 一般针对某些主题的历史数据进分析,支持管决策。

为了表示跟OLTP的数据库(database)在数据量和复杂度上的不同,一般称OLAP的操作对象为数据仓库data warehouse),简称数仓。数据库仓库中的数据,往往来源于多个数据库,以及相应的业务日志。

现在日常环境运维使用阿里的DTS构件数仓。

CDC

CDC 的全称是 Change Data Capture ,在广义的概念上,只要是能捕获数据变更的技术,我们都可以称之为 CDC 。目前通常描述的 CDC 技术主要面向数据库的变更,是一种用于捕获数据库中数据变更的技术.

基于查询的 CDC

离线调度查询作业,批处理。把一张表同步到其他系统,每次通过查询去获取表中最新的数据;

无法保障数据一致性,查的过程中有可能数据已经发生了多次变更;

不保障实时性,基于离线调度存在天然的延迟。

基于日志的 CDC

实时消费日志,流处理,例如 MySQL binlog 日志完整记录了数据库中的变更,可以把 binlog 文件当作流的数据源;

保障数据一致性,因为 binlog 文件包含了所有历史变更明细;

保障实时性,因为类似 binlog 的日志文件是可以流式消费的,提供的是实时数据。

ETL

采集+计算+传输

书籍:Flink原理与实践  鲁蔚征

     

博客:

https://oreki.blog.csdn.net/article/details/113759891

Flink学习记录之max与maxBy

几个要点:

  1. max/maxBy均只能对Tuple类型数据集生效
  2. max只能作用于Tuple数据集的某一列
  3. maxBy可以作用于整个Tuple行

max只能作用于它指定的那列,其它列它不保证。maxBy相对来说理解更容易点,比如通常从mysql中查询最大的那条记录。

归约聚合(reduce)

reduce是跟在keyBy后面的,这时作用于reduce的类是一个KeyStream的类,reduce会保存之前计算的结果,然后和新的数据进行累加,所以每次输出的都是历史所有的数据的总和。

它可以对已有的
数据进行归约处理,把每一个新输入的数据和当前已经归约出来的值,再做一个聚合计算。与简单聚合类似,reduce 操作也会将 KeyedStream 转换为 DataStream。它不会改变流的元
素数据类型,所以输出类型和输入类型是一样的。调用 KeyedStream 的 reduce 方法时,需要传入一个参数,实现 ReduceFunction 接口。

@Public
@FunctionalInterface
public interface ReduceFunction<T> extends Function, Serializable {

    /**
     * The core method of ReduceFunction, combining two values into one value of the same type. The
     * reduce function is consecutively applied to all values of a group until only a single value
     * remains.
     *
     * @param value1 The first value to combine.
     * @param value2 The second value to combine.
     * @return The combined value of both input values.
     * @throws Exception This method may throw exceptions. Throwing an exception will cause the
     *     operation to fail and may trigger recovery.
     */
    T reduce(T value1, T value2) throws Exception;
}
Flink 归约聚合(reduce)_flink reduce_响彻天堂丶的博客-CSDN博客

物理分区

随机分区(shuffle)
最简单的重分区方式就是shuffle,通过调用DataStream的.shuffle()方法,将上游数据随机分配到下游的并行任务中。


轮询分区(Round-Robin)
轮询也是常见的重分区方式,通过调用DataStream的.rebalance()方法,将上游的数据平均分配到下游所有的并行任务中。


重缩放分区(rescale)
重缩放分区和轮询分区非常类型,当调用resacle()方法时,底层调用的其实就是Round-Robin算法进行轮询。
不同的是,rescale重缩放分区会将上游不同的数据来源分为不同的“团体”,在下游的同一团体内,对所有slot进行轮询分发。
从底层实现上看,rebalance 和 rescale 的根本区别在于任务之间的连接机制不同。rebalance 将会针对所有上游任务(发送数据方)和所有下游任务(接收数据方)之间建立通信通道,这是一个笛卡尔积的关系;而 rescale 仅仅针对每一个任务和下游对应的部分任务之间建立通信通道,节省了很多资源。

广播(broadcast)
严格意义上来说,广播并不能算作重分区的一种方式,它会将数据在所有分区都保留一份。通过调用.broadCast()方法,将上游输入数据发送到下游所有的并行任务中。

全局分区(global)
全局分区也是一种特殊的分区方式,通过调用.global()方法,会将所有的输入流数据都发送到下游算子的第一个并行子任务中去。这就相当于强行让下游任务并行度变成了 1,所以使用这个操作需要非常谨慎,可能对程序造成很大的压力。

自定义分区
当 Flink 提供的所有分区策略都不能满足用户的需求时, 我们可以通过使用partitionCustom()方法来自定义分区策略。

public class _14CustomPartitionTest {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 按照奇偶数进行分区
        DataStreamSource<Integer> streamSource = env.fromElements(1, 2, 3, 4, 5, 6, 7, 8);

        // 参数1:自定义的Partitioner分区器
        streamSource.partitionCustom(new Partitioner<Integer>() {
            @Override
            public int partition(Integer key, int numPartitions) {
                return key % 2;
            }
        }, new KeySelector<Integer, Integer>() { // 参数2:应用分区器的字段,或者直接像keyBy一样直接指定字段或者索引
            @Override
            public Integer getKey(Integer value) throws Exception {
                return value;
            }
        })
                .print();

        env.execute();
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值