Flink 大数据 学习详情

参考视频:

尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili

核心目标:

数据流上有状态计算

具体说明: Apache Flink是一个 框架分布式处理引擎 ,用于对 无界(eg:kafka)有界(eg:文本) 数据流进行有状态计算

有状态: 存储中间的结果或者计算结果,保存在flink内部(内存/RockSDB),定期存储到磁盘

状态在内存中: 速度快,但可靠性差

状态在分布式系统中:速度慢,但可靠性高

特点:

高吞吐和低延迟:

每秒处理数百万个事件,毫秒级延迟

结果的准确性:

Flink提供了事件时间(event-time) 和处理时间(processing-time)语义。对于乱序事件流,事件时间语义仍然能提供一致且准确的结果

精确一次(exactly-once)的状态一致性保证

可以连接到最常用的存储系统:

Kafka,Hive,JDBC,HDFS,Redis等

高可用:

本身高可用的设置,加上与 K8s,YARN和Mesos的紧密集成,再加上从故障中快速恢复和动态扩展任务的能力,Flink能做到以极少的停机时间7*24全天候运行

Flink和SparkStreaming比较

本质:spark streaming是批处理(RDD模型),flink是流处理

|-------|-----------|--------------------|
| | Flink | Streaming |
| 计算模型 | 流计算 | 微批处理 |
| 时间语义 | 事件时间,处理时间 | 处理时间 |
| 窗口 | 多,灵活 | 少,不灵活(窗口必须是批次的整数倍) |
| 状态 | 有 | 无 |
| 流式sql | 有 | 无 |

ps:

Flink提供了三种时间语义,以满足不同计算场景的需求:处理时间,事件时间和注入时间。

  • 处理时间(Processing Time):一种直观的时间语义,表示数据进入算子并开始处理的实际时间点。
  • 事件时间(Event Time):表示事件实际发生的时间,通常在消息的时间戳字段中找到。由于可能会有数据乱序的问题,但它能保证精确度高的计算场景。
  • 注入时间(Ingestion Time):介于处理时间和事件时间之间的折中选择,代表数据进入Flink处理系统的时间。

Flink分层API

|--------------|-------------------------------------------------------|
| 最高层 | SQL(最好用) |
| 声明式领域专用语言 | Table API(像表一样处理数据,还不够好用) |
| 核心APIs | DataStream(数据流,流计算,高版本一般都用流计算) / DataSet API(数据集,批处理) |
| 底层APIs(处理函数) | 有状态流处理 |

有状态流处理:

通过底层API(处理函数),对最原始数据加工处理。底层API与DataStream API相集成,可以处理复杂的计算

DataStream API(流处理) 和 DataSet API(批处理)

封装了底层处理函数,提供了通用的模块,比如转换(transformations,包括map,flatmap等) ,连接(join),聚合(aggregations),窗口(windows)操作等。

注意:Flink1.12以后,DataStream API已经实现真正的批流一体,所以DataSet API已经过时

Table API

以表未中心的声明式编程,其中表可能会动态变化。 Table API遵循关系模型:表有二维数据结构,类似于关系数据库中的表;同时API提供可比较的操作,例如:select,project,group-by,aggregate等。 我们可以在表与 DataStream / DataSet之间无缝切换,以允许程序将Table API 与DataStream / DataSet 混合使用

SQL

这一层在语法与表达能力上与Table API类似,但是以SQL查询表达式的形式表现程序。

SQL抽象与Table API交互密切,同时SQL查询可以直接在Table API定义的表上执行

Flink快速上手

bash 复制代码
		<dependency>
			<groupId>org.apache.flink</groupId>
			<artifactId>flink-streaming-java</artifactId>
            <version>1.17.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.flink</groupId>
			<artifactId>flink-clients_2.10</artifactId>
            <version>1.17.0</version>
		</dependency>

看视频吧,不同的引包写法有差异

Flink集群部署

组件流程介绍

flink提交作业和执行任务,需要几个关键组件:

客户端(client):代码由客户端获取 并作转换 ,之后提交给 jobManager

JobManager:就是flink集群里的"管事人",对作业进行中央调度管理;而它获取到要执行的作业后,会进一步处理转换 ,然后分发任务给众多的TaskManager

TaskManager:就是真正"干活的人",数据的处理操作都是它们来做的

注意:

流程:

Flink Client -> 一个JobManager(协调调度中心) -> N个TaskManager(工作节点)

多个备用 JobManager

Flink是一个非常灵活的处理框架,它支持多种不同的部署场景,还可以和不同的资源管理平台方便地集成

集群搭建:

集群规划:

|-------|------------------------|-------------|-------------|
| 节点服务器 | hadoop102 | hadoop103 | hadoop104 |
| 角色 | JobManager,TaskManager | TaskManager | TaskManager |

下载解压安装包

eg:flink-1.17.0-bin-scala_2.12.tgz

vim flink-conf.yaml

bash 复制代码
jobmanager.rpc.address: hadoop102 (rpc连接的地址)
jobmanager.bind-host: 0.0.0.0 (任何机器都可以访问)
rest.address: hadoop102 (Rest Api访问地址)
rest.bind-address: 0.0.0.0

taskmanager.bind-host: 0.0.0.0
taskmanager.host: hadoop102 (不同服务器配置相应的ip)


还可更改
jobmanager.rpc.port:6123
jobmanager.memory.process.size:48g (jobmanager进程可使用的全部内存,包括JVM和其他开销,默认1600M)
taskmanager.memory.process.size:8g (taskmanager进程可使用的全部内存,包括JVM和其他开销,默认1728M)
taskmanager.numberOfTaskSlots: 24 (对每个taskmanager能够分配的slot数量进行配置,默认1,可根据cpu进行决定)
parellelism.default: 8 # 并行数量,默认1,优先级低于代码中进行的并行度配置
high-availability: zookeeper
high-availability.storageDir: ftp://sjsy:[email protected]:6600/flink/ha/
high-availability.zookeeper.quorum: zk01:2181,zk02:2181,zk03:2181
jobmanager.execution.failover-strategy: region
#历史服务器
jobmanager.archive.fs.dir: ftp://sjsy:[email protected]:6600/flink/completed-jobs/
historyserver.web.address: 0.0.0.0
historyserver.web.port: 8082
historyserver.archive.fs.dir: ftp://sjsy:[email protected]:6600/flink/completed-jobs/
heartbeat.timeout: 180000
akka.ask.timeout: 60s
web.timeout: 1000000
state.checkpoints.num-retained: 3

vim workers

bash 复制代码
hadoop102
hadoop103
hadoop104

vim masters(jobmanager)

bash 复制代码
hadoop102:8081
//可以多个
hadoop105:8081
hadoop106:8081
...

命令行启动(也可以手动上传)

1 上传

2

bash 复制代码
bin/flink run -m hadoop102:8081 -c com.chinaoly.wc.WordCountStream ./FlinkTutorial-1.17-1.0-SNAPSHOT.jar 

-m :后面跟 jobmanager的ip端口
-c : 后面跟全类名 
最后,相对路径或者绝对路径

部署模式

会话模式(Session Mode

单作业模式(Per-Job Mode)

应用模式(Application Mode)

会话模式(Session Mode)

最符合常规思维,我们先启动一个集群,保持一个会话,在这个会话中通过客户端提交作业。

集群启动时所以资源都已经确定,所以所有提交的作业会竞争集群中的资源。

会话模式比较适用于: 单个规模小,执行时间短的大量作业

单作业模式(Per-Job Mode)

会话模式因为资源共享会导致很多问题,所以为了更好地隔离资源,我们可以考虑为每个提交的作业启动一个集群,这就是所谓的单作业模式

作业完成后,集群就会关闭,所以资源也会释放

这些特性使得单作业模式在生产环境运行中更加稳定,所以是 实际应用的首选模式

需要注意:Flink本身无法直接这样允许,所以单作业模式一般需要借助一些资源管理框架来启动集群,比如 YARN,Kubernates(K8S)

应用模式(Application Mode)

前面提到的两种模式下,应用代码都是在客户端执行,然后由客户端提交到JobManager的。但是这种方式客户端需要占用大量网络带宽,去下载依赖和把二进制数据发送给JobManager;加上很多情况下我们提交作业用的是同一个客户端,就会加重客户端所在节点的资源消耗。

所以解决方法是: 我们不要客户端了,直接把应用提交到JobManager上运行。 而这也就代表着,我们需要为每一个提交的应用单独启动一个JobManager,也就是创建一个集群。这个JobManager只为执行一个应用而存在,执行结束后JobManager也就关闭了。这就是所谓的应用模式。

应用模式与单作业模式,都是提交作业后才创建集群;单作业模式是通过客户端来提交的,客户端解析出的每一个作业对应一个集群;而应用模式下,是直接由JobManager执行应用程序的。

运行模式

standalone运行模式

yarn运行模式

K8S运行模式

独立(Standalone)运行模式

独立模式是独立运行的,不依赖任何外部的资源管理平台;当然独立也是有代价的: 如果资源不足,或者出现故障,没有自动扩展或重分配资源的保证,必须手动处理,所以独立模式一般只使用在开发测试或者作业非常少的情景下。

此模式Flink自己管理资源

比如页面提交运行,打包成一个完成的jar,命令运行等。

|-------|----------------------------------------------------------------------------------------------|
| 会话模式 | 支持,默认 |
| 单作业模式 | 不支持,单作业模式需要借助一些资源管理平台 |
| 应用模式 | 可是实现,应用模式下不会提前创建集群,所以不能调用start-cluster.sh脚本。我们可以使用同样在bin目录下的standalone-job.sh来创建一个JobManager |
| | |

启动/停止,参考standalone脚本

Yarn运行模式(重点)

yarn上部署过程: 客户端把flink应用提交给yarn的ResourceManager,Yarn的ResourceManager会启动ApplicationMaster,ApplicationMaster会向ResourceManager注册,申请NodeManager申请资源和容器,并且监控;这些容器上,Flink会部署JobManager和TaskMAnager的实例,从而启动集群。

Flink会根据运行在JobManager上的作业所需要的Slot数量动态分配TaskManager资源

注意:确保安装hadoop,至少在2.2版本以上,并且集群中由HDFS服务

flink和hadoop的依赖集成,配置,加上

bash 复制代码
sudo vim /etc/profile.d/my_env.sh

HADOOP_HOME=/opt/moduae/hadoop-3.3.4
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# flink需要的
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HADOOP_CLASSPATH=`hadoop classpath` 

source /etc/profile.d/my_env.sh

Yarn的运行模式需要先申请一个YARN会话(Yarn Session)来启动Flink集群

bash 复制代码
bin/yarn-session.sh -nm mytest


查看可以使用的参数
bin/yarn-session.sh --help 

-d: 分离模式,如果不想让Flink YARN客户端一致前台运行,可以使用这个参数,即后台运行
-j: 指定jar包
-jm(-jobManagerMemory):  配置JobManager所需内存,默认单位MB
-nm(-name): 配置在YARN UI界面上显示的任务名
-qu: 指定Yarn队列
-tm(-taskManagerMemory): 配置TaskManager所需内存,默认单位MB

在hadoop里查看任务,hadoop里代理了端口,此处进入

注意:yarn模式会自动覆盖flink配置信息

Session部署模式
bash 复制代码
bin/flink run -c com.全类名.WordCount lib/FlinkTutorial-1.17-1.0-SNAPSHOT.jar

关闭
1 去yarn的WebUi页面关闭
2 启动的时候会打印
echo "stop" | ./bin/yarn-session.sh -id application_2322223334_003(yarn页面的应用id)
Per-job部署模式(标记为过时,但还能用)
bash 复制代码
启动
bin/flink run -d -t yarn-per-job -c lib/com.全类名.WordCount FlinkTutorial-1.0-SNAPSHOT.jar

查看
bin/flink list
bin/flink list -t yarn-per-job -Dyarn.application.id=application_XXX_YY

取消/停止(页面也可以停止)
bin/flink cancel -t yarn-per-job -Dyarn.application.id=application_XXX_YY <jobId>
注意:application_XXX_YY 是当前应用的ID,<jobId>是作业的id,如果取消作业,这个Flink集群也会停止

如果报错,但不影响
Trying to access closed classloader...
解决方法:
flink-conf.yml中配置:
classloader.check-leaked-classloader: false

WebUI访问:

http://hadoop102:8081/

脚本

bash 复制代码
停止运行
bin/stop-cluster.sh

查看
xcall jps
jps

standalone模式脚本

bash 复制代码
standalone模式下运行,需要把jar包放到lib下面
bin/standalone-job.sh start --job-classname com.chinaoly.SocketStreamWordCount

停止standalone
bin/standalone-job.sh stop

taskmanager脚本

bash 复制代码
启动taskmanager
bin/taskmanager.sh start

停止taskmanager
bin/taskmanager.sh stop

yarn运行模式脚本

bash 复制代码
session部署模式
bin/flink run -c com.全类名.WordCount lib/FlinkTutorial-1.17-1.0-SNAPSHOT.jar

per-job部署模式

参考文档:

【大数据】Flink 架构(三):事件时间处理-CSDN博客

Flink架构、原理与部署测试_未来链flink-CSDN博客

相关推荐
阿里云大数据AI技术2 小时前
ES Serverless 8.17王牌发布:向量检索「火力全开」,智能扩缩「秒级响应」!
大数据·运维·serverless
Mikhail_G2 小时前
Python应用变量与数据类型
大数据·运维·开发语言·python·数据分析
G皮T3 小时前
【Elasticsearch】映射:null_value 详解
大数据·elasticsearch·搜索引擎·映射·mappings·null_value
大霸王龙4 小时前
软件工程的软件生命周期通常分为以下主要阶段
大数据·人工智能·旅游
点赋科技4 小时前
沙市区举办资本市场赋能培训会 点赋科技分享智能消费新实践
大数据·人工智能
YSGZJJ5 小时前
股指期货技术分析与短线操作方法介绍
大数据·人工智能
Doker 多克5 小时前
Flink CDC —部署模式
大数据·flink
Guheyunyi5 小时前
监测预警系统重塑隧道安全新范式
大数据·运维·人工智能·科技·安全
酷爱码6 小时前
Spring Boot 整合 Apache Flink 的详细过程
spring boot·flink·apache
问道飞鱼6 小时前
Flink 高可用集群部署指南
flink·部署·批处理·流式批处理