文章目录
Flink(一):flink安装入门和运行架构
flink是什么?
Apache Flink是2014年12月份诞生的一个基于内存流计算引擎。
ApacheFlink是一个用于在无界和有界数据流上进行有状态计算的框架和分布式处理引擎。Flink被设计成在所有常见的集群环境中运行,以内存速度和任何规模执行计算。
Flink 特点
- 可以处理有界和无界数据流。
- 可以运在任何位置。(第三方资源管理器yarn,k8s等 和 自带资源管理器)
- 以任何规模运行应用程序
- 随处部署应用程序
- 命令执行
- 远程部署
- 图形界面(比较常用的)
- 充分利用内存性能

Flink和Spark比较
- Spark底层计算是批处理模型,在批处理基础上模拟流,从而导致了流计算实时性较低(微批处理)
- Flink底层计算是连续的流计算模型,在流计算上模拟批处理,既可以保证流的实时性又可以实现批处理

安装和入门
安装
快速入门

- 导入依赖
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-streaming-scala -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>1.10.0</version>
</dependency>
- 引入插件
传送门 - WordCount入门程序
package com.baizhi.flink
import org.apache.flink.streaming.api.scala._
object FlinkQuickStart {
def main(args: Array[String]): Unit = {
//1.创建执行环境
val environment = StreamExecutionEnvironment.getExecutionEnvironment
//设置并行度
//environment.setParallelism(2)
//本地运行环境
//val environment = StreamExecutionEnvironment.createLocalEnvironment(3)
//2.创建DataStream
val text = environment.socketTextStream("hadoop10", 9999)
//3.对text数据进行常规转换
val result = text.flatMap(line=>line.split("\\s+"))
.map(word=>(word,1))
//keyBy就是对上面的数据做分组处理,根据0号元素分组。也就是根据输入的单词分组
.keyBy(0) //类似于spark中的reducebykey;groupbykey
.keyBy(0)
.sum(1);
//4.控制台打印结果
result.print();
//5.执行流计算任务
environment.execute("myDataStreamJobTask")
}
}
程序部署
-
本地 执行(直接在idea《开发工具》中运行代码)
-
通过nc命令监听端口号9999
nc -lk 9999
Note:必须保证nc已经安装完成
-
客户端程序修改为本地运行环境
也可以直接使用
StreamExecutionEnvironment.getExecutionEnvironmentval environment = StreamExecutionEnvironment.createLocalEnvironment(3) -
运行程序:执行main方法
-
在Linux的nc界面输入内容,在开发工具的控制台查看输出结果

-
-
远程脚本部署
-
客户端程序修改为自动识别运行环境
val environment = StreamExecutionEnvironment.getExecutionEnvironment -
通过mvn package生成jar包
-
把生成的jar传输到Linux系统的/tmp/flink目录下

-
通过执行flink_home/bin目录下的flink文件的run action,提交job

说明
-c,--class <classname> Class with the program entry point ("main()" method). Only needed if the JAR file does not specify the class in its manifest. 指定启动类 -d,--detached If present, runs the job in detached mode 后台提交 -p,--parallelism <parallelism> The parallelism with which to run the program. Optional flag to override the default value specified in the configuration. 指定并行度 -m,--jobmanager <arg> Address of the JobManager (master) to which to connect. Use this flag to connect to a different JobManager than the one specified in the configuration. 提交目标主机必须保证在监听9999端口号
所有的action/option/args都不需要记忆。通过./flink --help查看帮助文档
也可以通过 ./flink --help查看对应action的帮助文档。其中位置可以是run/list/info/cancel…
查看运行中的job

[root@flink bin]# ./flink list --running --jobmanager flink.baizhiedu.com:8081查看所有job

[root@flink bin]# ./flink list --all --jobmanager flink.baizhiedu.com:8081取消指定job

查看程序执行计划
[root@flink bin]# ./flink info -c com.baizhi.flink.FlinkQuickStart -p 3 /tmp/flink/FlinkQuickStart-1.0-SNAPSHOT.jar访问https://flink.apache.org/visualizer/,将上述命令执行之后的json复制过去查看程序执行计划[
-
-
Web UI部署
通过访问flink的web界面,提交job完成部署






-
跨平台部署
- 修改程序的运行环境代码,并指定并行度
val jar = "F:\\flink\\FlinkQuickStart\\target\\FlinkQuickStart-1.0-SNAPSHOT.jar"; val environment = StreamExecutionEnvironment.createRemoteEnvironment("flink.baizhiedu.com",8081,jar); //设置并行度 environment.setParallelism(3);- 通过mvn package将程序打包
- 运行main方法完成部署
运行架构
Tasks and Operator Chains(任务和算子链)
flink中,
一个main方法表示一个job,
一个job包含了很多算子,
这些算子会通过某种规则连接在一起(算子链),
很多算子连接在一起,形成了一个概念-task,【类比spark的stage】,
一个task有多少个并行度,就有几个subtask。
subtask是flink程序运行的最小单元。
与Spark不同的地方在于Spark是通过RDD的依赖关系实现Stage的划分而Flink是通过 Operator Chain的概念实现Task的拆分。该方式将多个算子归并到一个task中,从而优化计算,减少Thread-to-Thread的通信成本。

- Task - 等价spark中的Stage,每个Task都有若个Subtask
- Subtask - 等价于一个线程,是Task中的一个子任务
- Operator Chain - 将多个算子归并到一个Task的机制,归并原则类似于SparkRDD的宽窄依赖
Job Managers, Task Managers, Clients
Flink在运行的过程中,有两种类型的进程组成
-
Job Manager - (也称为master)负责协调分布式执行。负责任务调度,协调检查点,协调故障恢 复等。等价于Spark中的Master+Driver的功能。通常一个集群中至少有1个Active的JobManager,如果在HA模式下其他处于StandBy状态。
-
Task Manager - (也称为Worker) 真正负责Task执行计算节点,同时需要向JobManager汇报自身状态信息和工作负荷。通常一个集群中有若干个TaskManager,但必须至少一个。
-
Client - Flink中的Client并不是集群计算的一部分,Client仅仅准备和提交dataflow给JobManager。提交完成之后,可以直接退出,也可以保持连接以接收执行进度,因此Client并不负责任务执行过程中调度。Client可以作为触发执行的Java/Scala程序的一部分运行,也可以在命令行窗口中运行。
类似Spark中的Driver,但又特别不同,因为Spark Driver负责任务调度和恢复

task slot [task 插槽]
task slot是代表一个taskmanager的计算能力,所有的task slot会平分taskmanager的资源,
由job中的task的最大并行度决定该任务执行所需最少的task slot,同一个job下的不同task的subtask间共享task slot
,一个任务的并行度不能大于task slot的数量,否则任务启动失败。
如果同一个Job下的不同Task的subtask间不能共享slot,就会造成非密集型subtask的阻塞,从而浪费内存。
Note:
- 非密集型任务:source()/map()。操作占用内存量小
- 密集型任务:keyBy()/window()/apply()。操作过程中涉及shuffle,会占用大量内存
Checkpoint/Savepoint
- checkpoint是flink程序中做了设置,flink服务器会自动定期执行,将状态中的数据持久化到对应的存储介质。新的checkpoint执行完成之后,会把老的checkpoint丢弃掉。
- savepoint是手动版的checkpoint,需要程序员手动执行。但是新的checkpoint完成时不会自动过期,需要手动清理。
State Backends
在checkpoint中数据持久化到哪里,由他决定。
- The MemoryStateBackend:jobmanager的内存
- The FsStateBackend:文件系统,比如hdfs
- The RocksDBStateBackend:DB–flink的内置数据库,基于内存+磁盘以k-v结构存储数据
本文介绍了Apache Flink的基础知识,包括其作为内存流计算引擎的特点,与Spark的比较,以及详细安装和入门教程。文章还探讨了Flink的运行架构,如Task、Operator Chains、Job Managers、Task Managers、Clients和Task Slots,以及Checkpoint和State Backends的重要性。
887

被折叠的 条评论
为什么被折叠?



