文章目录
- 一.Flink 简介
- 1. 1 Flink是什么
- 1. 2 Flink框架解决了Spark中哪些痛点
- 二.Flink的特点
- 三.Flink 流处理架构的演进
- 四.Flink_Hello_World
- 五.Flink部署的三种模式
- 六.Flink之 job提交流程
一.Flink 简介
1. 1 Flink是什么
分布式处理引擎,用于对无界和有界数据流进行状态计算
1. 2 Flink框架解决了Spark中哪些痛点
- Spark 数据精准一次性处理
- 乱序数据 迟到数据
- 低延迟 高吞吐 准确性
- 容错性
二.Flink的特点
- 事件驱动
- 基于流的世界观 在Flink的世界观中,一切都是由流组成,离线的数据是有界流,实时的数据是无界流
批处理: 知晓待处理数据集的范围,程序处理完数据直接退出
流处理:对将要处理数据集的范围是不确定的,程序一致运行等待处理数据
- 分层API
- 低延迟 高吞吐 良好的容错性:每秒处理百万级别事件,毫秒级别延迟
- 精确消费一次
- 支持事件时间和处理时间语义
三.Flink 流处理架构的演进
- 传统的分析处理
- 演进1 :分析处理架构
- 演进2:Lambda架构
- 演进3:Fink 架构
四.Flink_Hello_World
1.编写代码
- 批处理代码
/**
* 批处理 hello world
*/
object WordCount1 {
def main(args: Array[String]): Unit = {
// 创建执行环境
val env = ExecutionEnvironment.getExecutionEnvironment
// 从文件中读取数据
val inputPath = "src/resource/word.txt"
// 1.读取文本执行环境
val inputDS: DataSet[String] = env.readTextFile(inputPath)
// 2.分词之后,对单词进行groupby分组,然后用sum进行聚合
val wordCountDS: AggregateDataSet[(String, Int)] = inputDS.flatMap(_.split(" ")).map((_, 1))
// 以第一个元素进行分组
.groupBy(0)
// 对当前数据的第二个元素求和
.sum(1)
wordCountDS.print()
}
}
- 流处理代码
/**
* 流处理wordcount
*/
object wordStream {
def main(args: Array[String]): Unit = {
//1,获取环境 和批处理的环境不一样
val env = StreamExecutionEnvironment.getExecutionEnvironment
val tool: ParameterTool = ParameterTool.fromArgs(args)
val hostname: String = tool.get("host");
val port: Int = tool.getInt("port");
//2 获取流
val inputDataStream: DataStream[String] = env.socketTextStream(hostname, port);
var resultDatastream: DataStream[(String, Int)] = inputDataStream.flatMap(_.split(" "))
.filter(_.nonEmpty)
.map((_, 1))
.keyBy(0) // 按照第一个元素进行分组
.sum(1) // 按照第二个元素进行求和
// 设置处理任务的线程数
resultDatastream.print().setParallelism(1)
env.execute("启动流式wordcount")
}
}
2.打包 上传集群 注意需要配置sacla的打包插件 否则只打包java代码 并不打包scala代码
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<!--声明绑定到maven的compile阶段 -->
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
3.运行
1)web界面运行
2)命令行提交运行
#运行
./flink run -c com.atguigu.wc.StreamWordCount
FlinkTutorial-1.0-SNAPSHOT-jar-with-dependencies.jar -p 2 --host lcoalhost –port 7777
# 查看运行的job
flik list
# 查看所有job
flink list -a
#取消job
flink cancel jobId
五.Flink部署的三种模式
- standaalone模式
- 访问 http://192.168.1.100:8081/#/overview 可以对Flin集群和任务进行监控和管理
- Yarn模式
- Session-cluster
Session-Cluster 模式需要先启动集群,然后再提交作业,接着会向yarn 申请一块空间后,资源永远保持不变,如果资源满了 下一个作业就无法提交,等其他作业释放资源后才可以提交
所有Flink job共享一个Flink集群的资源 所有作业共享Dispatcher和ResourceManager。适合规模小执行时间短的作业
- Per-Job-Cluster
一个Job 会对应一个集群,每提交一个作业会根据自身的情况,都会单独向yarn申请资源,创建一个新的flink 集群 直到作业执行完成,一个作业的失败与否并不会影响下一个作业的正常提交和运行。独享Dispatcher 和ResourceManager,按需接受资源申请;适合规模大长时间运行的作业。每次提交都会创建一个新的flink 集群,任务之间互相独立,互不影响,方便管理。
+ 启动两种模式
#1.启动Hadoop集群
#2.启动对应的模式
#2.1 yarn-session模式执行以下操作
./yarn-session.sh -n 2 -s 2 -jm 1024 -tm 1024 -nm testLiang -d
其中:
-n(--container):TaskManager 的数量。
-s(--slots): 每个TaskManager 的slot 数量,默认一个slot 一个core,默认每个taskmanager 的slot 的个数为1,有时可以多一些taskmanager,做冗余。
-jm:JobManager 的内存(单位MB)。
-tm:每个taskmanager 的内存(单位MB)。
-nm:yarn 的appName(现在yarn 的ui 上的名字)。
-d:后台执行。
#2.2 启动per-job-cluster模式时 不做任何操作
#3.执行任务
#3.1 yarn-session 模式
./flink run -c com.atguigu.wc.StreamWordCount
FlinkTutorial-1.0-SNAPSHOT-jar-with-dependencies.jar --host lcoalhost –port 7777
#3.2 yarn-per job cluster 模式
./flink run –m yarn-cluster -c com.atguigu.wc.StreamWordCount
FlinkTutorial-1.0-SNAPSHOT-jar-with-dependencies.jar
--host lcoalhost –port 7777
#4.去yarn控制台查看任务状态
http://hadoop101:8088/cluster/apps
#5.停止任务
yarn application --kill application_1577588252906_0001
- k8s模式
六.Flink之 job提交流程
- 运行时四大组件
- Dispatcher:接受应用并提交给JobManager
- JobManager:①对每个Job生成不同的执行图 并且计算出所需要的slot数 ②向RM请求slot③分发执行图到真正的taskManager上
- ResourceManager:管理集群slot。终止空闲的TaskManager,释放计算资源。
- taskManager:真正执行任务的进程 ,启动后TaskManger向RM注册本身的slot数。以便于RM统一管理
- Job的提交过程
- 任务提交流程(yarn)