Flink 入门系列文章主要是为想要学习Flink 的人搭建一个通用框架,帮助他们快速上手使用Flink。学习Flink最有效的方法就是先了解框架和概念,然后练习写代码,然后再看官网。
Flink 概述分为四篇文章。第一篇文章为《了解Flink》,第二篇文章为《架构和原理》,第四篇文章为《DataStream》。
官网地址https://nightlies.apache.org/flink/flink-docs-release-1.15/zh/
1、友情提示
如果你是早期入门Flink,可以按照思路,直接编写Flink程序,直接运行main方法,无需搭建环境。我遇到了很多第一次尝试Flink 的学生,但对不同的配置、提交的作业和复杂的概念感到沮丧。前期最好的上手方式就是直接手写代码,在main方法中运行demo,快速理解概念。上手之后就可以练习集群环境、提交各种作业、各种操作。复杂的概念。现在让我们正式进入正题。
2、大白话
简单来说,Flink 是一个实时处理数据任务的框架,可以让开发者在执行数据处理任务时无需担心高可用性、性能或其他问题。如果您有需要执行的数据任务,例如数据监控、数据分析或数据同步,可以考虑使用Flink。所谓的流计算涉及计算连续的数据流并将中间计算结果存储在内存或外部存储中。这就是有状态流计算。
3、示例代码
通过两段简单的代码,您可以看到Flink如何使用相同的API和运算符实现流和批集成,从而大大减少开发人员的工作量。
本例使用的Flink版本为15.4,代码地址:https://github.com/yclxiao/flink-blog.git
3.1. 批量数据词频统计
//1. 创建执行环境StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment(); //2. 读取数据源DataStreamString textStream=env.fromCollection(Arrays.asList( 'java,c++,php,java,spring' , 'hadoop ) , scala', 'c++,jvm,html,php'));//3.数据转换DataStreamTuple2String, Integer wordCountStream=textStream //将数据源中的单词进行分割,每个单词记录为1。通过。收集向下游发送数据。 { out.collect(new Tuple2(word, 1)); } } } ) //Group Words.keyBy(value - value.f0) //对给定组中的单词数量进行滚动加法统计。 a, b) - new Tuple2(a.f0, a.f1 + b.f1));//4. 数据输出。字节被打印到控制台。 wordCountStream.print('WordCountBatch========').setParallelism(1);//5.启动任务env.execute(WordCountBatch.class.getSimpleName());词频统计-流式数据
//1. 创建执行环境StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment(); //2. 读取数据源DataStreamString textStream=env.socketTextStream('localhost', 9999, '\n'); //3. 数据转换DataStreamTuple2String , Integer wordCountStream=textStream //将数据源中的单词进行拆分,将每个单词记录为1,并通过out.collect 将数据流向下游flatMap(new FlatMapFunctionString, Tuple2String, Integer() { @Override public void flatMap Send to operator ( String value, CollectorTuple2String, Integer out) throws Exception { for (String word : value.split('\\s')) { out.collect(new Tuple2(word, 1)) } } } ) //对单词进行分组。keyBy(value - value.f0) //对组内单词数进行滚动加法统计。 reduce((a, b) - new Tuple2(a.f0, a.f1 + b .f1));//4.数据输出。字节被打印到控制台。 wordCountStream.print('WordCountStream=======').setParallelism(1); //5.启动任务env.execute(WordCountStream.class.getSimpleName()); Flink 使用无界数据框架和分布式处理用于流和有界数据流的状态计算的引擎。 Flink虽然是原生的流处理系统,但它也基于流计算引擎的计算能力提供了批处理API用于处理批量数据,真正实现了批流一体化。
Flink 支持有状态计算。在流计算过程中,算子的中间结果存储在内存或文件系统中,当下一个事件进入算子后,可以从之前的状态中检索中间结果来计算当前的结果,这是必要的。将会消失。它根据后续事件计算当前结果,因此所有原始数据都用于计算统计结果,这显着提高了系统的性能。所有具有一定复杂程度的流计算应用程序都是有状态的。执行基本业务逻辑的流处理应用程序需要保存一定时间内接受的事件或中间结果。
Flink 支持事件时间。除了支持处理时间之外,Flink 还支持事件时间,即根据事件本身的时间戳(事件的生成时间)计算结果。这种事件驱动的机制使得Flink 即使在事件无序到达的情况下也能计算出准确的结果,保证结果的准确性和一致性。
Flink 支持高可用性。 Flink 可以实现流式应用程序的快速灾难恢复、动态扩展和24/7 执行等操作。 Flink 还支持在不丢失应用程序状态的情况下更新作业的程序代码。 Flink 可以将任务执行的快照保存到存储介质中,当需要进行关闭操作或维护等操作时,可以在下次启动时直接从之前保存的快照恢复原始计算状态,让任务执行可以继续运行。关机前的状况。
Flink具有高吞吐量。更高的吞吐量可以提高资源利用率并降低系统开销。
Flink 具有出色的容错能力。 Flink 的容错机制是基于分布式快照的,其中CheckPoint 机制会保存流处理作业在特定时间点的状态,并在任务异常终止时默认从上次保存的完整快照重新启动任务进行恢复。
Flink 提供了不同级别的API。 Flink 为流处理和批处理提供了不同级别的API。每个API根据不同的应用场景使用不同级别的API来降低系统耦合。
4、什么是Flink
事件驱动:根据传入事件流触发计算、状态更新或其他外部操作。关键应用包括欺诈预防、异常检测、基于规则的警报和业务流程监控。
数据分析:从原始数据中提取有价值的信息和指标。该信息可以写入外部数据库系统或以内部状态的形式维护。
数据管道:数据管道和ETL(提取、转换、加载)作业具有相似的目标,并且可以转换、丰富数据并将数据从一个存储系统移动到另一个存储系统。与传统的周期性ETL 不同,Flink 以连续流模式运行。
5、应用场景
存储层:Flink 本身不提供分布式文件系统,因此Flink 的分析大部分依赖于外部存储。
调度层:Flink 带有一个简单的资源调度器,称为Standalone。如果您的集群中没有资源管理器,您可以使用自己的独立调度程序。当然,Flink 还支持在其他集群管理器上运行,例如Hadoop YARN 和Apache Mesos。
计算层:Flink 的核心是一个计算引擎,它调度、分发和监控由许多计算任务组成、运行在多个工作机或计算集群上的应用程序,并基于API 工具层提供服务。
工具层:基于Flink运行时,Flink提供了流处理(DataStream API)和批处理(DataSetAPI)的各种计算接口,可以在其上实现基于流处理的CEP(例如复杂事件处理库)。不同应用程序类型的库。 )、TableSQL(结构化表处理库)、基于批处理的Gelly(图计算库)、FlinkML(机器学习库)、TableSQL(结构化表处理库)。
6、主要组件
Flink 的编程例程经过修改,允许开发人员执行一组任务,而不必担心性能或高可用性等棘手问题。
有界数据集:定义数据流的开始并定义数据流的结束会产生有界数据集。
批处理:处理有限的数据集通常称为批处理。
无限数据集:定义数据流的开始而不定义数据流的结束会产生无限的数据集。无限的数据集不断生成新数据,没有边界。
流处理:对无限数据集的处理称为流处理。
受限和非受限转换:受限和非受限数据集实际上是相对的概念。如果每分钟、每小时或每天计算一次数据,则认为该时段的数据相对有限。可以将有限的数据流发送到计算引擎,一次处理一个数据流。在这种情况下,可以认为数据相对不受限制。有界和无界数据集可以相互转换。 Flink 通过这种方式来整合绑定和非绑定的数据集,从而将批处理和流处理集成在一组可以同时完成批处理和流处理任务的流引擎中。
7、Flink编程模型
配置:Flink 应用程序由三部分组成:源、转换和接收器。
固定例程编程:
创建执行环境、加载源数据、转换数据、输出转换结果、触发任务执行
8、Flink程序结构
9.1. 什么是算子?
Flink 提供了一组丰富的数据处理函数,称为算子。说白了,Flink 提供了一套可调用的数据处理函数。用户无需担心函数内如何处理交换的数据。
9.2. 原生流处理和微批处理之间的差异
本机流处理:
微批量处理:
9.3,处理时间
处理时间分为最多一次、至少一次和恰好一次。
最多一次:每个数据最多处理一次,数据可能会丢失。
At-Leat-Once:每个数据至少被处理一次,以避免数据丢失,但数据可能会被重复处理。
一次性:每条数据仅处理一次,不会丢失数据或重复处理。
Storm实现了At-Least-Once,允许数据至少被处理一次,但不能保证数据恰好被处理一次。这会产生重复数据处理的问题,因此对类进行计数的要求可能会导致错误。
Spark Streaming 和Flink 都实现了Exactly-Once,即数据被处理一次,即每条记录只处理一次,不会丢失数据,并且可以重复处理。
9、补充概念
本文首先用简单的概念和通俗易懂的语言解释了Flink是什么以及它的使用场景,然后提供了一个简单的demo。随后给出了一些广泛的概念框架。我希望这有帮助。
版权声明:本文转载于网络,版权归作者所有。如有侵权,请联系本站编辑删除。