在一个企业中,为了最大化的利用集群资源,一般都会在一个集群中同时运行多种类型的 Workload。因此 Flink 也支持在 Yarn 上面运行;
flink on yarn的前提是:****hadoop、hdfs、yarn****均启动
jdk1.8及以上【配置JAVA_HOME环境变量】
ssh免密码登录【集群内节点之间免密登录】
至少****hadoop2.2****
hdfs & yarn
服务器: node1(Master + Slave)
服务器: node2(Slave)
服务器: node3(Slave)
Flink客户端 所在的服务器上, 配置了 HADOOP_CONF_DIR
环境变量即可
Flink在YARN中, 开启一个集群环境, 也就是 在YARN中, 申请一批容器和资源, 然后持续的占用这些资源
在容器内运行JobManager和TaskManager
这个环境中的 JobManager
会持续存在
YARN中, 不会主动停止
当有Flink程序提交的时候, 这个持续存在的JobManager会临时开启所需的TaskManager
供程序运行.
程序运行完成后, 解除开启的TaskManager, 保留当前JobManager继续等待新任务.
bin/yarn-session.sh
可以启动会话模式
常用的参数:
Usage:
Optional
-at,--applicationType <arg> Set a custom application type for the application on YARN
-D <property=value> use value for given property
-d,--detached 后台运行
-h,--help Help for the Yarn session CLI.
-id,--applicationId <arg> Attach to running YARN session
-j,--jar <arg> Path to Flink jar file
-jm,--jobManagerMemory <arg> JobManager内存
-m,--jobmanager <arg> Set to yarn-cluster to use YARN execution mode.
-nl,--nodeLabel <arg> Specify YARN node label for the YARN application
-nm,--name <arg> 设置会话模式程序的名称
-q,--query Display available YARN resources (memory, cores)
-qu,--queue <arg> Specify YARN queue.
-s,--slots <arg> 每个TaskManager应该有几个Slot
-t,--ship <arg> Ship files in the specified directory (t for transfer)
-tm,--taskManagerMemory <arg> 每个TaskManager应该有多少内存可用
-yd,--yarndetached If present, runs the job in detached mode (deprecated; use non-YARN specific option instead)
-z,--zookeeperNamespace <arg> Namespace to create the Zookeeper sub-paths for high availability mode
示例:
bin/yarn-session.sh -s 1 -tm 1024
表示启动YARN会话模式, 每个TaskManager的Slot数量是1
, 每个TaskManager可用1024M内存
注意: 上述参数中没有指定TaskManager的数量
在YARN集群中, TaskManager的数量是如何决定的呢?
因为在配置文件中, 设置了 默认并行度是3
既然是默认3个并行度, 需要3个
subtask线程
运行每个Slot只能供给1个
subtask
运行 , 由于有3个线程, 所以需要3个Slot
又因为, 我们提交的时候指定了 一个TaskManager只允许开启1个
Slot
所以, 我们需要3个
TaskManager
来提供3个Slot 供给3个线程(SubTask)去运行
注意: 在YARN中 不提供设定TaskManager的数量, TaskManager的数量是完全按照:
- 一个TaskManager可以开多少个Slot
- 并行度是多少(需要多少个Slot)
基于这两个来计算出来 需要多少个TaskManager, 那么就开启多少个.
所以在YARN模式中 我们只指定:
- 一个TaskManager可以开多少Slot
- 并行度是多少
基于这2个参数就能计算需要多少TaskManager
在启动过程中会出现错误,是由于flink缺少相关的依赖jar包 只需要将jar导入到flink文件所在的lib目录下重新启动即可
链接:https://pan.baidu.com/s/1RfcaXbFt-n0H3tB8SISfdg?pwd=elwh
提取码:elwh
测试
运行flink自带的单词计数器
flink run ../examples/batch/WordCount.jar
在yarn-session.sh提交后的任务页面中也可以观察到当前提交的任务:
当前 进程id: application_1650291959210_0001
结束当前会话模式
yarn application -kill application_1650291959210_0001
当提交Flink任务到YARN中的时候, 去开启JobManager和TaskManager
程序运行完成后, JobManager
和TaskManager
都被回收
对比会话模式, 独立模式是一次性的
这就是标准的 在YARN中运行程序的流程.
启动独立模式
bin/flink run -m yarn-cluster
会话模式:
适用于有大批量的小任务
频繁的执行
的场景
因为, 提交YARN程序 创建容器这些东西, 会消耗一定的时间
会话模式可以节省不少时间, 因为持续的作为YARN的程序存在, 提交程序反应更快.
不适用于 资源紧张的集群, 因为一直占着资源, 你不运行程序就是浪费.
独立模式:
适用于集群资源紧张, 需要运行的时候 才去占用资源, 并且运行完成后 会及时释放资源.
或者运行的程序的 体量比较大, 大任务 整体运行的时间还是很长的, 那么启动容器的那点时间
就不算什么了.
两种模式 都可以在生产场景下使用, 用哪个根据企业的需求即可.
如果要从YARN会话模式 切换回StandAlone模式, 需要删除/tmp/.yarn-properties-${提交YARN的用户名}
这是一个临时的指向文件, 正常的停止YARN 会话模式 这个文件会正常被删除
如果是非正常的停止了YARN会话模式, 这个文件会保留
这个文件在保留的时候, 会不断的将你的程序提交到YARN会话中, 导致你无法提交到原本想提交的StandAlone
如果是非正常停止会话模式, 请删除这个文件.
StandAlone 是要在每个服务器上 启动对应的角色进程, 比如master的进程和worker的进程.
所以 每一台服务器都需要安装或者解压 flink的安装包.
YARN模式, 是提交到YARN中去, 我们的程序是运行在容器内的, 所以我们只需要一台服务器作为客户端即可.
然后基于这一个Flink客户端, 就可以将内容全部同步到所有的容器内.
所以, 提交到YARN 只需要一台服务器有Flink即可
不需要全部都安装
包括前面学习的Spark也一样, 只要是跑在YARN上, 只需要一台客户端即可
*如果使用的是flink on yarn方式,想切换回standalone模式的话,需要删除文件:【/tmp/.yarn-properties-root】*
*因为默认查找当前yarn集群中已有的yarn-session信息中的jobmanager*
*如果是分离模式运行的YARN* *JOB后,其运行完成会自动删除这个文件*
*但是会话模式的话,如果是kill掉任务,其不会执行自动删除这个文件的步骤,所以需要我们手动删除这个文件。*
*因为默认查找当前yarn集群中已有的yarn-session信息中的jobmanager*
*如果是分离模式运行的YARN* *JOB后,其运行完成会自动删除这个文件*
*但是会话模式的话,如果是kill掉任务,其不会执行自动删除这个文件的步骤,所以需要我们手动删除这个文件。*