文章目录

  • 一.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 timestamp精度 flink每秒处理速度_flink

  • 低延迟 高吞吐 良好的容错性:每秒处理百万级别事件,毫秒级别延迟
  • 精确消费一次
  • 支持事件时间和处理时间语义

三.Flink 流处理架构的演进

  • 传统的分析处理
  • flink timestamp精度 flink每秒处理速度_big data_02

  • 演进1 :分析处理架构
  • flink timestamp精度 flink每秒处理速度_flink_03

  • 演进2:Lambda架构

flink timestamp精度 flink每秒处理速度_hdfs_04

  • 演进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界面运行

flink timestamp精度 flink每秒处理速度_big data_05

         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模式
  • flink timestamp精度 flink每秒处理速度_big data_06

  • 访问 http://192.168.1.100:8081/#/overview 可以对Flin集群和任务进行监控和管理
  • flink timestamp精度 flink每秒处理速度_big data_07

  • Yarn模式
  • Session-cluster

flink timestamp精度 flink每秒处理速度_hdfs_08

    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的提交过程

flink timestamp精度 flink每秒处理速度_hdfs_09

  • 任务提交流程(yarn)