文章目录
快速入门
流式Wordcount
package com.belle
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
object _1StreamWordCount {
def main(args: Array[String]): Unit = {
// 1.初始化流计算环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
// 修改并行度
env.setParallelism(1)
// 2.导入隐式转换
import org.apache.flink.streaming.api.scala._
// 3.读取数据
val lines = env.socketTextStream("127.0.0.1", 9999)
// 4.转换和处理数据
val res = lines.flatMap(_.split(" "))
.map((_, 1))
.keyBy(0)
.sum(1)
// 5.打印结果
res.print()
// 6.启动流计算程序
env.execute("StreamWordCount")
}
}
批式Wordcount
package com.belle
import org.apache.flink.api.scala._
object _2BatchWordCount {
def main(args: Array[String]): Unit = {
val env = ExecutionEnvironment.getExecutionEnvironment
val dataPath = getClass.getResource("/wc.txt")
val data = env.readTextFile(dataPath.getPath)
data.flatMap(_.split(" ")).map((_, 1)).groupBy(0).sum(1).print()
}
}
安装和部署
基本架构
-
client
与 JobManager 构建 Akka 连接,然后将任务提交到 JobManager,通过和 JobManager 之间进行交互获取任务执行状态。
-
JobManager
JobManager 负责整个 Flink 集群任务的调度以及资源的管理,为提交的应用分配相应的 TaskSlots 资源并命令 TaskManger 启动从客户端中获取的应用,触发 Checkpoints 操作
-
TaskManager
负责具体的任务执行
安装和部署
集群模式:
-
准备三台机器 172.17.209.3、172.17.209.4、172.17.209.5 实现免密登录
-
下载 flink-1.10.0-bin-scala_2.12.tgz 解压
-
编辑 conf/flink-conf.yaml 配置文件
taskmanager.numberOfTaskSlot 参数默认值为 1,修改成 3。表示数每一个 TaskManager 上有 3 个 Slot- flink-conf.yaml 文件中的几个重要参数进行分析:
jobmanager.heap.size:JobManager 节点可用的内存大小。
taskmanager.heap.size:TaskManager 节点可用的内存大小。
taskmanager.numberOfTaskSlots:每台机器可用的 Slot 数量,建议和节点 CPU 的数量保持一致。
parallelism.default:默认情况下 Flink 任务的并行度。 - 上面参数中所说的 Slot 和 parallelism 的区别:
Slot 是静态的概念,是指 TaskManager 具有的并发执行能力。
parallelism 是动态的概念,是指程序运行时实际使用的并发能力。
设置合适的 parallelism 能提高运算效率。
- flink-conf.yaml 文件中的几个重要参数进行分析:
-
编辑 conf/slaves 配置文件
sz19f-bdc-dev-172-17-209-3.belle.lan sz19f-bdc-dev-172-17-209-4.belle.lan sz19f-bdc-dev-172-17-209-5.belle.lan
-
编辑 conf/masters 配置文件
sz19f-bdc-dev-172-17-209-3.belle.lan:8081
-
将172.17.209.3上分发到其他两台服务器
-
启动flink集群
-
访问web UI
http://172.17.209.3:8081/#/overview
提交任务方式
-
通过命令提交任务
-
上传jar包[如果提示找不到主类,先maven clean 再build project 之后maven package]
-
执行命令: 在执行命令之前先确保 nc -lk 8888 是否启动
bin/flink run -d -c com.belle._1StreamWordCount /root/flink_study-1.0-SNAPSHOT.jar -d选项表示提交 job 之后,客户端结束并退出
-
查看job执行结果
-
-
通过 WebUI 提交 job 到集群
Flink提交到Yarn
flink on yarn的交互图解:
Flink on Yarn 两种模式
-
第1种模式(Session-Cluster):是在 YARN 中提前初始化一个 Flink 集群(称为 Flink yarn-session),开辟指定的资源,以后的 Flink 任务都提交到这里。这种方式创建的 Flink 集群会独占资源,不管 有没有 Flink 任务在执行,YARN 上面的其他任务都无法使用这些资源。
-
第2种模式(Per-Job-Cluster):每次提交 Flink 任务都会创建一个新的 Flink 集群, 每个 Flink 任务之间相互独立、互不影响,管理方便。任务执行完成之后创建的 Flink 集群也会消失,不会额外占用资源,按需使用,这使资源利用率达到最大,在工作中推 荐使用这种模式。
Note: Flink on Yarn 还需要两个先决条件:
a.配置 Hadoop 的环境变量
b.下载 Flink 提交到 Hadoop 的连接器(jar 包),并把 jar 拷贝到 Flink 的 lib 目录下
Session-Cluster模式(Flink yarn-session )
-
先启动 Hadoop 集群,然后通过命令启动一个 Flink 的 yarn-session 集群
bin/yarn-session.sh -n 3 -s 3 -nm flink_test -d 其中 yarn-session.sh 后面支持多个参数: -n,--container <arg> 表示分配容器的数量(也就是 TaskManager 的数量)。 -D <arg> 动态属性。 -d,--detached 在后台独立运行。 -jm,--jobManagerMemory <arg>:设置 JobManager 的内存,单位是 MB。 -nm,--name:在 YARN 上为一个自定义的应用设置一个名字。 -q,--query:显示 YARN 中可用的资源(内存、cpu 核数)。 -qu,--queue <arg>:指定 YARN 队列。 -s,--slots <arg>:每个 TaskManager 使用的 Slot 数量。 -tm,--taskManagerMemory <arg>:每个 TaskManager 的内存,单位是 MB。 -z,--zookeeperNamespace <arg>:针对 HA 模式在 ZooKeeper 上创建 NameSpace。 -id,--applicationId <yarnAppId>:指定 YARN 集群上的任务 ID,附着到一个后台独 立运行的 yarn session 中。
查看在yarn上申请的AppMaster
-
查看WebUI, 查看Flink 的 yarn-session 集群
本地文件系统中会产生一个临时文件/tmp/.yarn-properties-root
-
提交Job 会提交到Yarn上执行
bin/flink run -d -c com.belle._1StreamWordCount /root/flink_study-1.0-SNAPSHOT.jar
-
停止yarn-session 集群
yarn application -kill application_1591951576383_3044
Pre-Job-Cluster 模式(yarn-cluster)
-
提交job
bin/flink run -m yarn-cluster -ys 3 -ynm flink_test2 -c com.belle._1StreamWordCount /root/flink_study-1.0-SNAPSHOT.jar 相对于 Yarn-Session 参数而言,只是前面加了 y -d,--detached:设置在后台运行。 -yjm,--jobManagerMemory<arg>:设置 JobManager 的内存,单位是 MB。 -ytm,--taskManagerMemory<arg>:设置每个 TaskManager 的内存,单位是 MB。 -ynm,--name:给当前 Flink application 在 Yarn 上指定名称。 -yq,--query:显示 yarn 中可用的资源(内存、cpu 核数) -yqu,--queue<arg> :指定 yarn 资源队列 -ys,--slots<arg> :每个 TaskManager 使用的 Slot 数量。 -yz,--zookeeperNamespace<arg>:针对 HA 模式在 Zookeeper 上创建 NameSpace -yid,--applicationID<yarnAppId> : 指定 Yarn 集群上的任务 ID,附着到一个后台独 立运行的 Yarn Session 中。