过往flink笔记文章
2024年最新Flink教程,从基础到就业,大家一起学习--基础篇-CSDN博客
2024年最新Flink教程,从基础到就业,大家一起学习--入门篇-CSDN博客
一、Flink集群角色
Flink是一个开源的流处理框架,用于在无界和有界数据流上进行有状态的计算。在Flink集群中,不同的角色承担着不同的职责,共同协作完成数据处理任务。以下是对Flink集群中主要角色的详细解析:
客户端(Client):代码由客户端获取并做转换,之后提交给JobManger
TaskManager:就是真正“干活的人”,数据的处理操作都是它们来做的。在Flink中算子的执行和一些处理逻辑都是TaskManager来处理的
JobManager:就是Flink集群里的“管事人”,对作业进行中央调度管理;而它获取到要执行的作业后,会进一步处理转换,然后分发任务给众多的TaskManager。其实JobManager就是老大,因为Flink是一个分布式的处理引擎,自然会有多个节点,那么多个节点肯定需要有一个东西来管理,JobManager就是负责管理
注意:Flink是一个非常灵活的处理框架,它支持多种不同的部署场景(例如yarn或者自己管理),还可以和不同的资源管理平台方便地集成。所以接下来我们会先做一个简单的介绍,让大家有一个初步的认识,之后再展开讲述不同情形下的Flink部署
1. JobManager
角色描述:
JobManager是Flink集群中的主节点,扮演着集群管理者的角色,负责协调和管理整个作业的执行过程。它是控制应用执行的主进程,每个应用都应该被唯一的JobManager所控制执行。
主要职责:
- 作业调度:负责接收客户端提交的作业,并将作业分配给TaskManager进行执行。
- 作业管理:管理作业的执行状态,监控作业的运行情况,并在必要时进行作业的重新调度和恢复。
- 状态管理:负责管理作业的状态信息,包括检查点、保存点等状态数据的生成和管理。
- 资源分配:向ResourceManager请求资源,并将资源分配给TaskManager运行作业。
高可用性:
JobManager的高可用性对整个集群的稳定性和可靠性至关重要。在高可用设置中,可能有多个JobManager,其中一个始终是leader,其他的则是standby。
2. TaskManager
角色描述:
TaskManager是Flink集群中的工作节点,负责实际执行作业的任务。它是实际负责执行计算的Worker,也被称为“Worker”。
主要职责:
- 任务执行:接收JobManager分配的任务,并在本地执行任务的计算逻辑。
- 状态管理:保存和恢复任务的状态信息,包括内存状态和持久化状态。
- 数据交换:与其他TaskManager之间进行数据交换和通信,实现数据的传输和流动。
资源管理:
TaskManager管理其所在节点上的资源信息,如内存、磁盘、网络等,并在启动时将资源状态向JobManager汇报。为了对资源进行隔离和增加允许的task数,TaskManager引入了slot的概念,每个slot是一个线程,用于执行一个或多个算子。
3. ResourceManager
角色描述:
ResourceManager是Flink集群中的资源管理器,负责统一管理和分配集群的计算资源。
主要职责:
- 资源调度:根据作业的需求,向集群中的JobManager分配计算资源,确保作业能够顺利执行。
- 容错管理:监控集群中的节点状态和资源利用情况,并在发生故障时进行资源调度和重新分配。
- 动态扩缩容:根据作业的负载情况和集群资源的变化,动态调整集群的规模,以提高资源利用率和作业的执行效率。
4. Dispatcher
角色描述:
Dispatcher是Flink集群中的调度器,负责接收客户端提交的作业,并将作业分发给JobManager进行执行。
主要职责:
- 作业调度:接收客户端提交的作业,并将作业分配给JobManager进行执行。
- 作业管理:管理作业的执行状态,监控作业的运行情况,并在必要时进行作业的重新调度和恢复。
Dispatcher还提供了REST接口,用于提交Flink应用程序执行,并为每个提交的作业启动一个新的JobMaster。它还运行Flink WebUI,用来提供作业执行信息。
5. Blob Server
角色描述:
Blob Server是Flink集群中的资源分发服务器,负责管理和分发作业的依赖资源。
主要职责:
- 资源管理:保存和管理作业的依赖资源,如JAR包、库文件等。
- 资源分发:向JobManager和TaskManager分发作业的依赖资源,确保作业能够顺利执行。
6. ZooKeeper
角色描述:
ZooKeeper是Flink集群中的协调服务,负责管理集群中的元数据和状态信息。
主要职责:
- 元数据管理:保存和管理集群中的元数据信息,如作业配置、状态信息等。
- 状态同步:保持集群中各个节点之间的状态同步,确保集群的一致性和可靠性。
7. Client
角色描述:
Client是Flink程序提交的客户端,不是运行时和程序执行的一部分。
主要职责:
- 当用户提交一个Flink程序时,会首先创建一个Client。该Client首先会对用户提交的Flink程序进行预处理,并提交到Flink集群中处理。
- Client需要从用户提交的Flink程序配置中获取JobManager的地址,并建立到JobManager的连接,将Flink Job提交给JobManager。
总结
Flink集群通过多个角色的协同工作,实现了高效、可靠的数据流处理。每个角色都承担着特定的职责,共同确保了作业的顺利执行和集群的稳定运行。
二、集群搭建
1、集群规划
节点服务器 | hadoop102 | hadoop103 | hadoop104 |
角色 | JobManager TaskManager | TaskManager | TaskManager |
把管理者JobManager部署在102上并且在102、103、104上各部署一个TaskManager
2、下载并解压安装包
(1)下载安装包flink-1.17.0-bin-scala_2.12.tgz,将该jar包上传到hadoop102节点服务器的/opt/software路径上。
flink 1.17所有资料jar包和资料都在这里,如果觉得积分不太合理请大家评论区留言
(2)在/opt/software路径上解压flink-1.17.0-bin-scala_2.12.tgz到/opt/module路径上。
tar -zxvf flink-1.17.0-bin-scala_2.12.tgz -C /opt/module/
3、修改集群配置
(1)进入conf路径,修改flink-conf.yaml文件,指定hadoop102节点服务器为JobManager
vim /opt/module/flink-1.17.0/con/flink-conf.yaml
修改如下内容
# JobManager节点地址.
jobmanager.rpc.address: hadoop102
jobmanager.bind-host: 0.0.0.0
rest.address: hadoop102
rest.bind-address: 0.0.0.0
# TaskManager节点地址.需要配置为当前机器名
taskmanager.bind-host: 0.0.0.0
taskmanager.host: hadoop102
(2)修改workers文件,指定hadoop102、hadoop103和hadoop104为TaskManager
vim /opt/module/flink-1.17.0/con/flink-conf.yaml/workers
修改如下内容:
hadoop102
hadoop103
hadoop104
(3)修改masters文件
vim /opt/module/flink-1.17.0/con/flink-conf.yaml/masters
修改如下内容:
hadoop102:8081
(4)另外,在flink-conf.yaml文件中还可以对集群中的JobManager和TaskManager组件进行优化配置,主要配置项如下:
- jobmanager.memory.process.size:对JobManager进程可使用到的全部内存进行配置,包括JVM元空间和其他开销,默认为1600M,可以根据集群规模进行适当调整。
- taskmanager.memory.process.size:对TaskManager进程可使用到的全部内存进行配置,包括JVM元空间和其他开销,默认为1728M,可以根据集群规模进行适当调整。
- taskmanager.numberOfTaskSlots:对每个TaskManager能够分配的Slot数量进行配置,默认为1,可根据TaskManager所在的机器能够提供给Flink的CPU数量决定。所谓Slot就是TaskManager中具体运行一个任务所分配的计算资源。
- parallelism.default:Flink任务执行的并行度,默认为1。优先级低于代码中进行的并行度配置和任务提交时使用参数指定的并行度数量。
4、分发安装目录
(1)配置修改完毕后,将Flink安装目录发给另外两个节点服务器。
xsync flink-1.17.0/
(2)修改hadoop103的 taskmanager.host
进入到hadoop103中
vim /opt/module/flink-1.17.0/conf/flink-conf.yaml
修改如下内容:
# TaskManager节点地址.需要配置为当前机器名
taskmanager.host: hadoop103
(3)修改hadoop104的 taskmanager.host
vim /opt/module/flink-1.17.0/conf/flink-conf.yaml
修改如下内容:
# TaskManager节点地址.需要配置为当前机器名
taskmanager.host: hadoop104
5、启动集群
(1)在hadoop102节点服务器上执行start-cluster.sh启动Flink集群:
cd /opt/module/flink-1.17.0
bin/start-cluster.sh
(2)查看进程情况:
jpsall
6、访问Web UI
启动成功后,同样可以访问http://hadoop102:8081对flink集群和任务进行监控管理。
这里可以明显看到,当前集群的TaskManager数量为3;由于默认每个TaskManager的Slot数量为1,所以总Slot数和可用Slot数都为3。
三、向集群提交作业
在2024年最新Flink教程,从基础到就业,大家一起学习--入门篇-CSDN博客这个文章中我们已经编写读取socket发送的单词并统计单词的个数程序案例。这次我们将以该程序为例,演示如何将任务提交到集群中进行执行。具体步骤如下。
1、环境准备
注意:要执行的程序中,因为是socket,所以连接地址一定要改成当前hadoop102所在的地址,不然会报错
DataStreamSource<String> socket_DS = env.socketTextStream("hadoop102", 9999);
在hadoop102中执行以下命令启动netcat。
nc -lk 9999
2、程序打包
(1)pom文件打包插件
在2024年最新Flink教程,从基础到就业,大家一起学习--入门篇-CSDN博客这个文章中的pom.xml文件中添加打包插件的配置,具体如下
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<excludes>
<exclude>com.google.code.findbugs:jsr305</exclude>
<exclude>org.slf4j:*</exclude>
<exclude>log4j:*</exclude>
</excludes>
</artifactSet>
<filters>
<filter>
<!-- Do not copy the signatures in the META-INF folder.
Otherwise, this might cause SecurityExceptions when using the JAR. -->
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers combine.children="append">
<transformer
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer">
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
(2)关于Flink的provided作用域
下面在Flink的依赖中添加了
<scope>provided</scope>
一般如果在生产环境上部署的时候最好加上这段,将作用域指定为provided,provided表示flink相关的依赖在打包的时候不会打包进去,因为这些依赖在部署到集群中的时候,集群是已经存在了的,所以不需要再打包进去
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java</artifactId> <!-- flink基本依赖 -->
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients</artifactId> <!-- flink客户端 -->
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
在Maven环境中,当你在pom.xml
文件中为某个依赖项(dependency)添加<scope>provided</scope>
时,这表示该依赖项在编译和测试阶段是必需的,但在运行时将不会由Maven的打包插件(如maven-jar-plugin
)包含在最终的jar包中。这是因为运行时环境(比如应用服务器或某些框架如Apache Flink)被期望会提供这些依赖项。
对于Apache Flink来说,当你将Flink作为运行环境时,很多Flink自身的库和API都是运行时环境提供的,因此你不需要在你的应用程序jar包中包含这些库。这包括Flink的核心库、流处理API、批处理API等。
在Flink应用程序的pom.xml
中添加<scope>provided</scope>
的常见场景包括:
-
Flink客户端库:
flink-client_<scala-version>
(用于与Flink集群通信的客户端库)通常被设置为provided
,因为Flink集群已经包含了这些库,你的应用程序在提交到集群时不需要再次包含它们。 -
Scala库:如果你的Flink应用程序是用Scala编写的,并且你希望确保Scala库的版本与Flink集群中使用的版本一致,你可能会将Scala库标记为
provided
。但是,请注意,由于Scala库的版本兼容性问题可能更为复杂,这种做法并不总是必要的或推荐的。 -
第三方库,如果Flink环境已提供:如果某些第三方库也包含在Flink的运行时环境中(这比较少见),你也可能将它们设置为
provided
。
然而,对于大多数Flink应用程序来说,主要的Flink依赖项(如flink-streaming-java_<scala-version>
、flink-connector-kafka_<scala-version>
等)通常不会被设置为provided
,因为它们不是由Flink集群直接提供的,而是你的应用程序在执行时需要这些库。
总的来说,将依赖项设置为provided
是为了确保最终打包的应用程序jar不包含那些在运行时环境中已经存在的库,从而减少jar包的大小和潜在的类路径冲突。在Flink的上下文中,这主要适用于Flink客户端库和某些可能与Flink集群版本紧密相关的库。
(3)设置provided后出现的问题
当把flink的作用域设置成provided之后,原来在本地的程序就会出现报错
程序参考我的这篇文章中的
2024年最新Flink教程,从基础到就业,大家一起学习--入门篇-CSDN博客
关于流处理Socket的程序,现在本地再次运行该程序,可能就会出现报错,表示找不到依赖,其实就是provided在编译的时候屏蔽了Flink的相关依赖
(4)provided问题的解决方法
点击编辑配置
但是如果程序有很多的话总不能一个个勾选,那么就点击Application下面的Defaults,给后面的程序配置一个模版,把选项勾选上,后面所有运行的程序都会按照这个配置来运行
(5)程序打包
插件配置完毕后,可以使用IDEA的Maven工具执行package命令,但是建议每次打包前都先点击一下clean,清除一下之前打包的jar包,不然之前打包的jar没有清除再打包的话可能会出现问题,然后点击package打包,出现如下提示即表示打包成功。
出现[INFO] BUILD SUCCESS 就是打包成功了
打包完成后,在target目录下即可找到所需JAR包,JAR包会有两个,flink_flink-1.0-SNAPSHOT.jar和original-flink_flink-1.0-SNAPSHOT.jar
但是如果我们在pom文件中加入了provided作用域的话,这两个没啥区别
- flink_flink-1.0-SNAPSHOT.jar:
- 这是一个通常包含了你所有代码、依赖库以及可能经过了一些构建步骤(如Maven的
maven-shade-plugin
插件处理)的jar包。 - 如果你在Maven或Gradle配置中使用了如
maven-shade-plugin
或shadowJar
等插件,这个jar包可能经过了类重定位(Relocation)、资源合并等处理,以确保jar包中的类路径(classpath)问题最小化,避免因为依赖冲突导致的运行时错误。 - 这个jar包是推荐用于部署到Flink集群(包括Flink Web UI)上的版本,因为它应该是经过了所有必要的处理,可以直接在Flink环境中运行。
- 这是一个通常包含了你所有代码、依赖库以及可能经过了一些构建步骤(如Maven的
- original-flink_flink-1.0-SNAPSHOT.jar:
- 这个jar包通常是一个未经过Maven或Gradle中任何特殊插件处理的原始jar包。它可能只是简单地包含了你的源代码和编译后的字节码,以及通过Maven或Gradle依赖管理功能解析和下载的依赖库。
- 这个jar包可能不包含类重定位、资源合并等处理,因此可能更容易遇到类路径冲突或依赖问题。
- 一般来说,这个jar包不推荐直接用于生产环境的部署,因为它可能不是为Flink集群的特定环境优化过的。
最好使用flink_flink-1.0-SNAPSHOT.jar来部署到Flink Web UI上。这个jar包已经过适当的构建处理,更适合在Flink环境中运行。确保你的构建配置(如Maven的pom.xml
或Gradle的build.gradle
)已经针对Flink的部署需求进行了适当的配置,包括但不限于类重定位、资源处理等。
3、在Web UI上提交作业
(1)任务打包完成后,我们打开Flink的WEB UI页面,在右侧导航栏点击“Submit New Job”,然后点击按钮“+ Add New”,选择要上传运行的JAR包,如下图所示。
JAR包上传完成,如下图所示:
(2)点击该JAR包,出现任务配置页面,进行相应配置。
主要配置程序入口主类的全类名,任务运行的并行度,任务运行所需的配置参数和保存点路径等,如下图所示,配置完成后,即可点击按钮“Submit”,将任务提交到集群运行。
这样就可以直接复制出需要运行的程序的全包名
注意提交之前先确认是否开启了netcat,如果没有开启会报错的
(3)任务提交成功之后,可点击左侧导航栏的“Running Jobs”查看程序运行列表情况。
(4)第二种方式查看运行情况
先点击Task Manager,然后点击右侧的192.168.10.104服务器节点
点击Stdout,就可以看到hello单词的统计
注意:如果hadoop104节点没有统计单词数据,可以去其他TaskManager节点查看。
(5)测试
在socket端口中输入内容
(6)结束程序
点击该任务,可以查看任务运行的具体情况,也可以通过点击“Cancel Job”结束任务运行。
4、命令行提交作业
前提是已经启动了flink集群
除了通过WEB UI界面提交任务之外,也可以直接通过命令行来提交任务。这里为方便起见,我们可以先把jar包直接上传到hadoop102目录flink-1.17.0下(这个不是必须的,可以是别的目录下)
(1)首先需要启动集群。
[atguigu@hadoop102 flink-1.17.0]$ bin/start-cluster.sh
(2)在hadoop102中执行以下命令启动netcat。
[atguigu@hadoop102 flink-1.17.0]$ nc -lk 7777
(3)执行启动命令
再次打开一个hadoop102的窗口,进入到flink的安装路径下,在命令行使用flink run命令提交作业。
bin/flink run -m hadoop102:8081 -c wordcount.flink_wc_socket ./flink_flink-1.0-SNAPSHOT.jar
-
bin/flink
:这是Flink安装目录下的bin
子目录中的flink
脚本,用于执行Flink的各种命令。 -
run
:这是flink
脚本的一个子命令,用于提交作业到Flink集群执行。 -
-m hadoop102:8081
:这个参数指定了Flink集群的Master节点(JobManager)的地址和端口。在这个例子中,Master节点位于hadoop102
这台机器上,并且监听在8081
端口上。这是Flink集群管理界面(Web UI)和作业提交的默认端口。 -
-c wordcount.flink_wc_socket
:这个参数指定了作业的主类(Main Class)的全限定名。在这个例子中,wordcount.flink_wc_socket
是包含main
方法的类的全限定名,这个类是作业的入口点。Flink会加载这个类,并执行其中的main
方法来启动作业。 -
./flink_flink-1.0-SNAPSHOT.jar
:这是要提交的Flink作业的JAR包路径。在这个例子中,JAR包名为flink_flink-1.0-SNAPSHOT.jar
,位于当前目录下(由./
表示)。这个JAR包包含了作业的所有依赖和编译后的类文件,是Flink作业执行的必要组件。
(4)在浏览器中打开Web UI
在浏览器中打开Web UI,http://hadoop102:8081查看应用执行情况。
用netcat输入数据,可以在TaskManager的标准输出(Stdout)看到对应的统计结果。
(5)在/opt/module/flink-1.17.0/log路径中,可以查看TaskManager节点。
cat flink-atguigu-standalonesession-0-hadoop102.out