大数据学习-Flink引擎 | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第3天
上节课老师讲了SQL语句的处理过程,并着重讲了其中的Optimizer即查询优化器环节,这节课我们要学的是著名的Flink引擎。
Flink概述
Apache Flink的数据流编程模型在有限和无限数据集上提供单次事件(event-at-a-time)处理。在基础层面,Flink程序由流和转换组成。 “从概念上讲,流是一种(可能永无止境的)数据流记录,转换是一种将一个或多个流作为输入并因此产生一个或多个输出流的操作”。
Apache Flink包括两个核心API:用于有界或无界数据流的数据流API和用于有界数据集的数据集API。Flink还提供了一个表API,它是一种类似SQL的表达式语言,用于关系流和批处理,可以很容易地嵌入到Flink的数据流和数据集API中。Flink支持的最高级语言是SQL,它在语义上类似于表API,并将程序表示为SQL查询表达式。
这是wiki上对Flink引擎的概述,简而言之,Flink就是一个框架和分布式处理引擎。
Apache Flink的诞生背景
-
要理解Apache Flink的背景,我们首先要了解什么是大数据、大数据计算架构发展史、为什么需要流式计算。
-
大数据是什么我在第一篇文章已经发表了自己的看法,这里记录一下课上的内容,大数据(BIG DATA):指无法在一定时间内用常规软件工具对其进行获取、存储、管理和处理的数据集合,具有Value(价值化)、Volumes(海量化)、Velocity(快速化)、 Variety(多样化) 等特点
-
大数据计算框架发展史直接用截图了
- 为什么需要流式计算:大数据的实时性带来的价值更大,比如可以在交易时实时计算风险、视频软件的实时兴趣以及业务的实时监测,大家对实时性的需求,改变了大数据的计算架构。 发生了从批式计算(一批一批,也叫离线计算)到流式计算(数据像水流一样处理,更快)的改变,
为什么Apache Flink会脱颖而出
这个问题我们也会从流式计算引擎的发展历程、流式计算引擎对比、WhyFlink三个方面来讲述
-
大数据差不多已经经历了将近二十年的发展,计算框架从MapReduce到Hadoop再到Spark一直到Flink,经历了大大小小的变革,具体的各位可以自己了解~~(我也不知道QAQ)~~
-
流式计算框架对比
-
这里是一段从Apache Flink社区的搬运内容,就不记了。
Apache Flink开源生态
Flink有一个丰富的开源生态,从Kafka、RocketMQ到Hive、HDFS等,都能很好的对接
Flink整体架构
这部分主要从Flink分层架构、总体架构、作业展示、以及如何做到流批一体等方面来讲述的 ,今天先学前三个部分的内容。
Flink分层架构
1、 SDK(软件开发工具包)层 ,Flink的SDK目前主要有三类,SQL/Table、DataStream、Python;
2.执行引擎层(Runtime层):将流水线上的作业(不论是哪种语言API传过来的数据,不论是流还是批)都转化为DAG图,调度层再把DAG转化为分布式环境下的Task,Task之间通过Shuffle传输数据。
3.状态存储层:负责存储算子的状态信息
4.资源调度层:目前Flink可以支持部署在多种环境
Flink总体架构
一个Flink集群,主要包含以下两个核心组件:
1.JobManager(JM):由ResourceManager、jobMaster、Dispatcher组成,负责整个任务的协调工作包括:调度task、触发协调Task做Checkpoint、协调容错恢复等;
2.TaskManager(TM):负责执行一个DataFlow Graph的各个task以及data streams的buffer和数据交换。
Client端会先把用户的操作逻辑进行处理,之后再转交给JM来生成一个具体的物理执行图来把Task分发给相应的TM来执行.
Flink作业实例
流式的WordCount示例,从kafka中读取一个实时数据流,每10S统计一次单词出现次数,DataStream实现代码如下:
DataStream<String> Lines=env.addSource(new FlinkKafkaConsumer<>(...));
DataStream<String> events=lines.map((line)->parse(line));
DataStream<Statistics>stats=events
.keyBy(event->event.id)
.timeWindow(Time.seconds(10))
.apply(new MyWindowAggregationFunction());
stats.addSink(new BucketingSink(path));
说实话明明语法都知道但是就是看不懂