3.flink-部署模式(三)
1.local模式
2.standalone
修改conf/flink-conf.yaml
# 必选
# 指定jobmanager的hostname
jobmanager.rpc.address: node01
# 可选
# 指定jobmanager的port
jobmanager.rpc.port: 6123
# 指定jobmanager的可用堆内存量(单位为MB)
jobmanager.heap.size: 1024
# 指定每个taskmanager的可用内存量(单位为MB)
taskmanager.heap.size: 1024
# 指定每个taskmanager的可用cpu数量
taskmanager.numberOfTaskSlots: 1
# 程序默认并行度
parallelism.default: 1
# 是否在TaskManager启动时预先分配TaskManager管理的内存
taskmanager.memory.preallocate: false
# 指定web ui的port
rest.port: 8081
# 临时目录
io.tmp.dirs: /usr/local/flink-1.6.1/tmp
修改conf/slaves
# 指定用于启动TaskManager的节点
node02
node03
启动或关闭集群
bin/start-cluster.sh
bin/stop-cluster.sh
或:
# 启动一个JobManager
bin/jobmanager.sh ((start|start-foreground) cluster)|stop|stop-all
# 启动一个TaskManager
bin/taskmanager.sh start|start-foreground|stop|stop-all
重要参数详解
# jobManager 的IP地址
jobmanager.rpc.address: localhost
# JobManager 的端口号
jobmanager.rpc.port: 6123
# JobManager JVM heap 内存大小
jobmanager.heap.size: 1024m
# TaskManager JVM heap 内存大小
taskmanager.heap.size: 1024m
# 每个 TaskManager 提供的任务 slots 数量大小
taskmanager.numberOfTaskSlots: 1
# 程序默认并行计算的个数
parallelism.default: 1
# 文件系统来源
fs.default-scheme
高可用性配置
# 指定是否开启HA,可以选择'NONE'或者'zookeeper'
high-availability: zookeeper
# 文件系统路径,让Flink在高可用性设置中持久保存元数据
high-availability.storageDir: hdfs://flink/ha/
# zookeeper集群中主节点的ip和port
high-availability.zookeeper.quorum: localhost:2181
# 默认是open,如果zookeeper security启用了该值会更改成creator
high-availability.zookeeper.client.acl: open
容错和检查点配置
# 用于存储和检查点状态
# state.backend: filesystem
# 存储检查点的数据文件和元数据的默认目录
# state.checkpoints.dir: hdfs://namenode-host:port/flink-checkpoints
# savepoints的默认目标目录(可选)
# state.savepoints.dir: hdfs://namenode-host:port/flink-checkpoints
# 用于启用/禁用增量checkpoints的标志
# state.backend.incremental: false
web 前端配置
# 基于Web的运行时监视器侦听的地址.
# jobmanager.web.address: 0.0.0.0
# Web的运行时监视器端口
rest.port: 8081
# 是否从基于Web的jobmanager启用作业提交
jobmanager.web.submit.enable: false
高级配置
# 指定临时文件目录
io.tmp.dirs: /tmp
# 是否应在TaskManager启动时预先分配TaskManager管理的内存
taskmanager.memory.preallocate: false
# 类加载解析顺序,是先检查用户代码jar(“child-first”)还是应用程序类路径(“parent-first”)。默认设置指示首先从用户代码jar加载类
# classloader.resolve-order: child-first
# 用于网络缓冲区的JVM内存的分数。这决定了TaskManager可以同时拥有多少流数据交换通道以及通道缓冲的程度。如果作业被拒绝或者您收到系统没有足够缓冲区的警告,请增加此值或下面的最小/最大值。另请注意,“taskmanager.network.memory.min”和“taskmanager.network.memory.max”可能会覆盖此分数。
# taskmanager.network.memory.fraction: 0.1
# taskmanager.network.memory.min: 67108864
# taskmanager.network.memory.max: 1073741824
Flink 集群安全配置
# 指示是否从Kerberos ticket缓存中读取
# security.kerberos.login.use-ticket-cache: true
# 包含用户凭据的Kerberos密钥表文件的绝对路径
# security.kerberos.login.keytab: /path/to/kerberos/keytab
# 与 keytab 关联的Kerberos主体名称
# security.kerberos.login.principal: flink-user
# 以逗号分隔的登录上下文列表,用于提供Kerberos凭据(例如,`Client,KafkaClient`使用凭证进行ZooKeeper身份验证和Kafka身份验证)
# security.kerberos.login.contexts: Client,KafkaClient
Zookeeper 安全配置
# 覆盖以下配置以提供自定义ZK服务名称
# zookeeper.sasl.service-name: zookeeper
# 该配置必须匹配"security.kerberos.login.contexts"中的列表(含有一个)
# zookeeper.sasl.login-context-name: Client
HistoryServer
# 你可以通过bin/historyserver.sh (start|stop)命令启动和关闭 HistoryServer
# 将已完成的作业上传到的目录
# jobmanager.archive.fs.dir: hdfs://node01:9000/completed-jobs/
# 基于Web的HistoryServer的地址
# historyserver.web.address: 0.0.0.0
# 基于Web的HistoryServer的端口号
# historyserver.web.port: 8082
# 以逗号分隔的目录列表,用于监视已完成的作业
# historyserver.archive.fs.dir: hdfs://node01:9000/completed-jobs/
# 刷新受监控目录的时间间隔(以毫秒为单位)
# historyserver.archive.fs.refresh-interval: 10000
Flink Scala shell代码测试
针对初学者,开发的时候容易出错,如果每次都打包进行调试,比较麻烦,并且也不好定位问题,可以在Scala Shell命令行下进行调试。
Scala Shell方式支持流处理和批处理。当启动Shell命令行之后,两个不同的ExecutionEnvironments会被自动创建。
使用senv(Stream)和benv(Batch)分别去处理流处理和批处理程序。(类似于Spark-Shell中sc变量)
bin/start-scala-shell.sh [local|remote|yarn] [options]
scala> val text = benv.fromElements("hello you","hello world")
scala> val counts = text.flatMap { _.toLowerCase.split("//W+") }.map { (_, 1) }.groupBy(0).sum(1)
scala> counts.print()
测试提交作业
bin/flink run /usr/local/flink-1.6.1/examples/batch/WordCount.jar \
--input /root/zookeeper.out \
--output /root/flink-out
Flink高可用(HA)集群部署
JobManager 高可用(HA):
JobManager协调每个Flink任务部署。它负责任务调度和资源管理。
默认情况下,每个Flink集群只有一个JobManager,这将导致一个单点故障(SPOF):如果JobManager挂了,则不能提交新的任务,并且运行中的程序也会失败。
使用JobManager HA,集群可以从JobManager故障中恢复,从而避免SPOF(单点故障) 。 用户可以在Standalone或 YARN集群 模式下,配置集群高可用
JobManager HA说明:
Standalone集群的高可用
Standalone模式(独立模式)下JobManager的高可用性的基本思想是,任何时候都有一个 Master JobManager ,并且多个Standby JobManagers 。 Standby JobManagers可以在Master JobManager 挂掉的情况下接管集群成为Master JobManager。 这样保证了没有单点故障,一旦某一个Standby JobManager接管集群,程序就可以继续运行。 Standby JobManager和Master JobManager实例之间没有明确区别。 每个JobManager都可以成为Master或Standby节点
Yarn 集群高可用
Flink On Yarn的HA 其实主要是利用Yarn自己的job恢复机制
Flink Standalone 集群 HA 配置步骤:
1. HA 集群环境规划
使用三台节点实现两主两从集群(由于测试环境性能限制,不能开启太多虚拟机,其实使用三台和四台机器在安装配置上没有本质区别)
Jobmanager:node01, node02【一个active,一个standby】
Taskmanager:node02, node03
zookeeper: node01, node02, node03【生产环境建议使用外置zk集群】
注意:
要启用JobManager高可用性,必须将高可用性模式设置为zookeeper,配置一个ZooKeeper quorum,并配置一个 masters文件,存储所有JobManager hostname及其WebUI端口号。
Flink 利用ZooKeeper实现运行中的JobManager节点之间的分布式协调。ZooKeeper是独立于Flink的服务,它通过主从选举制和轻量级状态一致性存储来提供高度可靠的分布式协调。
2. 开始配置+启动
集群内所有节点的配置都一样,所以先从第一台机器node01开始配置
ssh node01
#首先按照之前配置standalone的参数进行修改
vi conf/flink-conf.yaml
jobmanager.rpc.address: node01
vi conf/slaves
node02
node03
# 然后修改配置HA需要的参数
vi conf/masters
node01:8081
node02:8081
vi conf/flink-conf.yaml
high-availability: zookeeper
high-availability.zookeeper.quorum: node01:2181, node02:2181, node03:2181
# ZooKeeper节点根目录,其下放置所有集群节点的 namespace
high-availability.zookeeper.path.root: /flink
# ZooKeeper节点集群 id,其中放置了集群所需的所有协调数据
high-availability.cluster-id: /cluster_one
# 建议指定HDFS的全路径。如果某个Flink节点没有配置HDFS的话,不指定全路径无法识别
# StorageDir存储了恢复一个JobManager所需的所有元数据。
high-availability.storageDir: hdfs:\\node01:9000/flink/ha
# 把node01节点上修改好配置的flink安装目录分发到其他节点
scp -rq flink-1.6.1 node02:/usr/local
scp -rq flink-1.6.1 node03:/usr/local
# 【先启动Hadoop服务】
sbin/start-all.sh
# 【再启动zk服务】
bin/zkServer.sh start
# 启动 flink standalone HA 集群,在node01节点上启动如下命令
bin/start-cluster.sh
# 启动之后会显示如下日志信息
Starting HA cluster with 2 masters. Starting standalonesession daemon on host node01. Starting standalonesession daemon on host node02. Starting taskexecutor daemon on host node02. Starting taskexecutor daemon on host node03.
3. 验证HA集群进程
查看机器进程会发现如下情况【此处只列出Flink自身的进程信息,不包含zk,hadoop进程信息】
登录node01节点
执行 jps:
20159 StandaloneSessionClusterEntrypoint
登录node02节点
执行 jps:
7795 StandaloneSessionClusterEntrypoint
8156 TaskManagerRunner
登录node03节点
执行 jps:
5046 TaskManagerRunner
因为Jobmanager节点都会启动web服务,也可以通过web界面进行验证
访问 http://node01:8081/#/jobmanager/config
发现以下信息:
注意:此时即使访问 node02:8081 也会跳转回 node01:8081 因为现在node01是active的Jobmanager。
4. 模拟 jobmanager 进程挂掉
现在node01节点上的Jobmanager是active状态。我们手动把这个进程kill掉来模拟进程挂掉的情况,来验证node02上的standby状态的Jobmanager是否可以正常切换到active状态。
ssh node01
执行 jps:
20159 StandaloneSessionClusterEntrypoint
kill 20159
5. 验证 HA 切换
node01节点上的Jobmanager进程被手动kill掉了,然后node02上的Jobmanager会自动切换为active,中间需要有一个时间差,要稍微等一下。
访问 http://node02:8081/#/jobmanager/config
如果可以正常访问并且能看到Jobmanager的信息变为node02,则表示Jobmanager节点切换成功。
6. 重启之前kill掉的Jobmanager
进入到node01机器
ssh node01
执行下面命令启动Jobmanager
bin/jobmanager.sh start
启动成功之后,可以访问 http://node01:8081/#/jobmanager/config
这个节点重启之后,就变为standby状态了。node02还是active。
Flink on yarn 集群 HA 配置
1. HA 集群环境规划
Flink-On-Yarn的HA其实是利用Yarn自己的恢复机制。
在这需要用到zk,主要是因为虽然Flink-On-Yarn Cluster HA 依赖于 Yarn 自己的集群机制,但是 Flink Job 在恢复时,需要依赖检查点产生的快照,而这些快照虽然配置在HDFS,但是其元数据信息保存在Zookeeper中,所以我们还要配置Zookeeper的信息。
2. 开始配置+启动
主要在node01这个节点上配置即可
首先需要修改Hadoop中 yarn-site.xml 中的配置,设置提交应用程序的最大尝试次数
<property>
<name>yarn.resourcemanager.am.max-attempts</name>
<value>4</value>
<description>
The maximum number of application master execution attempts. </description>
</property>
# 把修改后的配置文件同步到Hadoop集群的其他节点
scp -r etc/hadoop/yarn-site.xml node02:/usr/local/hadoop-2.7.3/etc/hadoop/
scp -r etc/hadoop/yarn-site.xml node03:/usr/local/hadoop-2.7.3/etc/hadoop/
然后修改Flink部分相关配置
可以解压一份新的Flink-1.6.1安装包
tar -zxvf flink-1.6.1-bin-hadoop27-scala_2.11.tgz
修改配置文件【标红的目录名称建议和 standalone HA 中的配置区分开】
vi conf/flink-conf.yaml
high-availability: zookeeper
high-availability.zookeeper.quorum: node01:2181, node02:2181, node03:2181
high-availability.storageDir: hdfs://node01:9000/flink/ha-yarn
high-availability.zookeeper.path.root: /flink-yarn
yarn.application-attempts: 10
3. 启动Flink-On-Yarn,测试 HA
先启动Zookeeper和Hadoop
bin/zkServer.sh start
sbin/start-all.sh
再在node01上启动 Flink 集群
cd /usr/local/flink-1.6.1
bin/yarn-session.sh -n 2
其中 -n 2 代表启动TaskManager的数量
到Resoucemanager的web界面上查看对应的Flink集群在哪个节点上
Jobmanager进程就在对应的节点的(YarnSessionClusterEntrypoint)进程里面
所以想要测试Jobmanager的HA情况,只需要拿YarnSessionClusterEntrypoint这个进程进行测试即可。
执行下面命令手动模拟kill掉Jobmanager(YarnSessionClusterEntrypoint)、
ssh node02
jps
5325 YarnSessionClusterEntrypoint
kill 5325
然后去Yarn的web界面进行查看
发现这个程序的 AttemptId 变为00002了
注意:针对上面配置文件中的一些配置参数的详细介绍信息可以参考此文章
https://blog.csdn.net/xu470438000/article/details/79633824
但是需要注意一点,此链接文章中使用的Flink版本是 1.4.2。我们使用的版本是1.6.1,这两个版本中的一些参数名称会有细微不同。但是参数的含义基本没有什么变化。
3.yarn模式
1.第一种:
【yarn-session.sh(开辟资源)+flink run(提交任务)】
启动一个一直运行的flink集群
./bin/yarn-session.sh -n 2 -jm 1024 -tm 1024 [-d]
附着到一个已存在的flink yarn session
./bin/yarn-session.sh -id application_1463870264508_0029
执行任务
./bin/flink run ./examples/batch/WordCount.jar -input hdfs://node01:9000/LICENSE -output hdfs://node01:9000/wordcount-result.txt
停止任务 【web界面或者命令行执行cancel命令】
2.第二种:
【flink run -m yarn-cluster(开辟资源+提交任务)】
启动集群,执行任务
./bin/flink run -m yarn-cluster -yn 2 -yjm 1024 -ytm 1024 ./examples/batch/WordCount.jar
注意:client端必须要设置YARN_CONF_DIR或者HADOOP_CONF_DIR或者HADOOP_HOME环境变量,通过这个环境变量来读取YARN和HDFS的配置信息,否则启动会失败
bin/yarn-session.sh 命令分析:
用法:
必选
-n,--container <arg> 分配多少个yarn容器 (=taskmanager的数量)
可选
-D <arg> 动态属性
-d,--detached 独立运行
-jm,--jobManagerMemory <arg> JobManager的内存 [in MB]
-nm,--name 在YARN上为一个自定义的应用设置一个名字
-q,--query 显示yarn中可用的资源 (内存, cpu核数)
-qu,--queue <arg> 指定YARN队列.
-s,--slots <arg> 每个TaskManager使用的slots数量
-tm,--taskManagerMemory <arg> 每个TaskManager的内存 [in MB]
-z,--zookeeperNamespace <arg> 针对HA模式在zookeeper上创建NameSpace
-id,--applicationId <yarnAppId> YARN集群上的任务id,附着到一个后台运行的yarn session中
bin/flink run 命令分析
run [OPTIONS] <jar-file> <arguments>
"run" 操作参数:
-c,--class <classname> 如果没有在jar包中指定入口类,则需要在这里通过这个参数指定
-m,--jobmanager <host:port> 指定需要连接的jobmanager(主节点)地址,使用这个参数可以指定一个不同于配置文件中的jobmanager
-p,--parallelism <parallelism> 指定程序的并行度。可以覆盖配置文件中的默认值。
默认查找当前yarn集群中已有的yarn-session信息中的jobmanager【/tmp/.yarn-properties-root】:
./bin/flink run ./examples/batch/WordCount.jar -input hdfs://hostname:port/hello.txt -output hdfs://hostname:port/result1
连接指定host和port的jobmanager:
./bin/flink run -m node01:1234 ./examples/batch/WordCount.jar -input hdfs://hostname:port/hello.txt -output hdfs://hostname:port/result1
启动一个新的yarn-session:
./bin/flink run -m yarn-cluster -yn 2 ./examples/batch/WordCount.jar -input hdfs://hostname:port/hello.txt -output hdfs://hostname:port/result1
注意:yarn session命令行的选项也可以使用./bin/flink 工具获得。它们都有一个y或者yarn的前缀
例如:./bin/flink run -m yarn-cluster -yn 2 ./examples/batch/WordCount.jar
flink 提交任务
./bin/flink -c test.WordCount -p 2 jar_path
#查看当前正在执行的任务 job
flinl list
#取消执行的任务 job
flinl cancel
提交到集群
1.standalone
./flink run -c flink.app.BatchWcApp /ext/flinkTest-1.0-SNAPSHOT.jar --input /applog/flink/input.txt --output /applog/flink/output.csv
2.yarn
./flink run -m yarn-cluster -c flink.app.BatchWcApp /ext/flink0503-1.0-SNAPSHOT.jar --input /applog/flink/input.txt --output /applog/flink/output5.csv
flink——env
如果从命令行客户端调用程序以提交到集群,则此方法 返回此集群的执行环境,也就是说,getExecutionEnvironment 会根据查询运行的方 式决定返回什么样的运行环境,是最常用的一种创建执行环境的方式
flink运行环境的获取
1.flink——获取流式数据
val env = StreamExecutionEnvironment.getExecutionEnvironment
//需要调用execute执行
env.execute
2.flink——获取批处理数据
val env = ExecutionEnvironment.getExecutionEnvironment
区别:
流式处理:
初始化对象:StreamExecutionEnvironment
返回类型:DataStream
批处理:
初始化对象:ExecutionEnvironment
返回类型:DataSet
4.Kubernetes 部署
容器化部署时目前业界很流行的一项技术,基于 Docker 镜像运行能够让用户更
加方便地对应用进行管理和运维。容器管理工具中最为流行的就是 Kubernetes
(k8s),而 Flink 也在最近的版本中支持了 k8s 部署模式。
1 ) 搭建Kubernetes集群(略)
2 )
配置各组件的yaml文件
在 k8s 上构建 Flink Session Cluster,需要将 Flink 集群的组件对应的 docker 镜像
分别在 k8s 上启动,包括 JobManager、TaskManager、JobManagerService 三个镜像
服务。每个镜像服务都可以从中央镜像仓库中获取。
3 )启动
Flink Session Cluster
// 启动jobmanager-service 服务
kubectl create -f jobmanager-service.yaml
// 启动jobmanager-deployment服务
kubectl create -f jobmanager-deployment.yaml
// 启动taskmanager-deployment服务
kubectl create -f taskmanager-deployment.yaml
4 ) 访问Flink UI页面
集群启动后,就可以通过 JobManagerServicers 中配置的 WebUI 端口,用浏览器
输入以下 url 来访问 Flink UI 页面了:
http://{JobManagerHost:Port}/api/v1/namespaces/default/services/flink-jobmanage
r:ui/proxy