stypora-copy-images-to: img
typora-root-url: ./

Flink Day01:安装部署与快速入门
离线分析:批处理(Batch Processing)
实时分析:流计算(Stream Processing)

Flink 课程代码,使用Java语言编写,数据转换处理时,使用匿名内部类编程,很少使用Lambda表达式
	DataStream
	DataSet

Flink 1.12开始,Flink 流批一体,Flink SQL&Table API 模块功能成熟,可以使用
MapReduce和Spark                        Flink
    批处理                                 流处理(流计算)
        每次处理多条数据                        每次处理1条数据
        很多条数据一起处理                      1条1条数据处理

    批处理                                 流计算
        实时性没有太多要求                      实时性要求很高
        当处理数据时,才运行Task                没有开始处理数据之前,运行Task

01-[了解]-Apache Flink 课程安排

整个大数据课程,分为四大阶段:

  • 1)、HADOOP 离线阶段:基础课程(LINUX + ZOOKEEPER + HADOOP + HIVE)和项目课程(在线教育)
  • 2)、大数据实时存储阶段:HBASE、Kafka、Redis
  • 3)、SPARK 内存分析阶段:基础课程(SCALA + SPARK)
  • 4)、FLINK 流式计算阶段:基础课程(FLINK:批处理、流计算及SQL&Table API)

Flink 基础理论的讲解,涉及到各种重要概念、原理和 API的用法,并且会有大量的示例代码实现:

​ 通过理论和实际的紧密结合,可以使学员对 Flink 有充分的认识和理解,在项目实战中对 Flink 和流式处理应用的场景、以及电商分析业务领域有更深刻的认识;并且通过对流处理原理的学习和与批处理架构的对比,可以对大数据处理架构有更全面的了解,为日后成长为架构师打下基础。

02-[了解]-第1天:课程内容提纲

主要初步使用Flink框架:Flink框架概述和本地模式和Standalone集群部署

1、Flink 框架概述
	Flink功能:官方定义
	流式计算思想(重点)
	Flink技术栈和应用场景
	
2、安装部署(本地模式)
	应用运行架构(JobManager、TaskManagers)
	本地模式运行
	本地集群运行(伪分布式集群)
	运行应用程序:批处理(离线分析)和流计算(实时分析)
	
3、Standalone分布式集群部署
	架构、配置
	运行官方案例
	Standalone HA高可用集群

03-[理解]-Apache Flink之官方定义

Apache Flink 官网:https://flink.apache.org/、下载地址:http://archive.apache.org/dist/

官方定义:Apache Flink is a framework and distributed processing engine for stateful computations over *unbounded and bounded* data streams.

  • 1)、计算框架:类似MapReduce框架,分析数据
  • 2)、分布式计算框架
    • 分析处理数据时,可以启动多个任务Task,同时并行处理
  • 3)、建立在数据流(DataStream)之上状态计算框架
    • 处理的数据为数据流(DataStream)
    • 数据流DataStream:在Flink框架中,将所有数据认为是数据流
      • 静态数据:Bounded Data Stream,有界数据流
      • 动态数据:Unbounded Data Stream,无界数据流,流式数据
  • 4)、状态计算:Stateful Computions
    • Flink程序在处理数据时(针对无界流),记录状态信息
    • 比如以词频统计为例,假设从Kafka消费数据,记录消费偏移量OFFSET,记录每个单词词频

Flink 计算引擎,针对流数据进行处理,来一条数据处理一条数据,所以有界流和无界流。

当Flink框架出现,并且成熟以后,未来的数据分析处理:实时处理分析,Flink框架首选

​ Flink 框架尤其在2019年和2020年发展比较迅速,版本迭代更加频繁,尤其2020年底发布Flink 1.12版本,里程碑版本,流批一体化编程模式,并且Flink Table API和SQL基本稳定,可以用于实际生产环境。

本次课程使用:Flink 1.10版本。

​ Flink 诞生于欧洲的一个大数据研究项目 StratoSphere。该项目是柏林工业大学的一个研究性项目。早期,Flink 是做 Batch 计算的,但是在 2014 年, StratoSphere 里面的核心成员孵化出 Flink,同年将 Flink 捐赠 Apache,并在后来成为 Apache 的顶级大数据项目,同时 Flink计算的主流方向被定位为 Streaming, 即用流式计算来做所有大数据的计算,这就是 Flink 技术诞生的背景。

StratoSphere 批处理计算,按照MapReduce(MR v1)框架设计,很多影子在其中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QTUF2NSM-1620694491508)(/img/1614735779720.png)]

不仅是一个高吞吐、低延迟的计算引擎,同时还提供很多高级的功能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pQ7ggA5S-1620694491509)(/img/1614736092102.png)]

​ 当阿里收购Flink母公司以后,大力推广Flink使用,以及将内部Blink框架功能与Apache Flink框架整合,陆续发布:Flink 1.9.0 版本,Flink 1.10.0(稳当),Flink 1.11.0(过渡版本),Flink 1.12.0(里程碑版本)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dXEmaGKQ-1620694491510)(/img/image-20210510092155217.png)]

04-[掌握]-Apache Flink之流式计算思想

Flink 流式实时计算引擎,如何进行分布式流式数据处理。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W60aDFzg-1620694491511)(/img/1614736615141.png)]

​ 发现使用Flink 框架进行流式计算时,整个流程分为:Source数据源、数据转换Transformation和数据终端Sink,其中从数据源获取数据时,将数据封装到DataStream(数据流),数据处理时,仅仅调用DataStream方法即可,最终将分析数据输出到外部存储。

此时,要注意,Flink 流式计算程序,来一条处理一条数据,真正流计算。

​ Flink应用程序进行分布式流式计算时,如何做到并行计算,如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VFULcN1N-1620694491511)(/img/1614737184715.png)]

​ 对于Flink框架来说每个应用程式运行时,在处理第一条数据之前,需要获取资源,运行Task任务,准备数据到达,一个个阶段处理,针对每条数据来说的,来一条数据处理一条数据。

05-[理解]-Flink 概述之技术栈及应用场景

​ 一个计算框架要有长远的发展,必须打造一个完整的 栈Stack(生态圈)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Pws5r49-1620694491512)(/img/1614737390646.png)]

  • 1)、物理部署层:Flink 支持本地运行、能在独立集群或者在被 YARN 管理的集群上运行, 也能
    部署在云上。
  • 2)、Runtime核心层:提供了支持Flink计算的全部核心实现
  • 3)、API&Libraries层:DataStream、DataSet、Table、SQL API,在学习1.10版本中,主要还是使用DataStreamAPI 和DataSe API。
  • 4)、扩展库:复杂事件处理的CEP、机器学习库FlinkML、图处理库Gelly

Flink 四大基石:Checkpoint、State、Time、Window

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JYf2OS2l-1620694491512)(/img/1614737623721.png)]

Flink 用武之地

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JqnoSTW1-1620694491513)(/img/1614737695168.png)]

官方提出三个方面:Flink框架应用场景:

  • 1)、Event-driven Applications
    • 所有的实时数据处理或者是流式数据处理都应该是属于Data Driven,流计算本质上是Data Driven 计算。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EVmoj6c6-1620694491513)(/img/1614737828298.png)]

  • 2)、Data Analytics Applications
    • 从原始数据中提取有价值的信息和指标,比如实时大屏展示,报表分析展示,双11大屏

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p85lbjGZ-1620694491514)(/img/1614737966043.png)]

  • 3)、Data Pipeline Applications
    • 实时数据ETL转换处理,类似物流项目中三个流式计算程序,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l06W4yPY-1620694491514)(/img/1614738064919.png)]

总结:如果你们公司每天数据量比较大,很多业务场景都是实时的(80%以上),并且有些业务对实时性要求比较高,推荐使用Flink 引擎进行处理数据。

06-[了解]-Flink 概述之扩展性阅读

​ 此外,提供Flink 框架“八卦”新闻,大家可以自己阅读,更加了解Flink框架。

  • 1)、Flink 发展现状,目前来说,Flink在中国发展相当迅速,尤其是阿里在进行推动。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BlNBjpZQ-1620694491515)(/img/1614738294044.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ggvq5qsz-1620694491515)(/img/1614738308219.png)]

Flink 在阿里使用情况(2020.6)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kLQpQYd5-1620694491516)(/img/1614738339577.png)]

为什么选择 Flink

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hJnDmAoh-1620694491516)(/img/1614738387322.png)]

流式计算和批量计算

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PbsEldoX-1620694491517)(/img/1614738443208.png)]

无论Spark框架还是Flink框架,做到流批统一处理分析:

  • 1)、Spark 框架来说:SparkSQL模板

    • 批处理:spark.read.format
    • 流计算:spark.readStream.format()

    底层分析引擎都是:Catalyst 引擎

  • 2)、Flink框架来说:1.12版本开始

    • 流批一体,代码中只要设置 底层运行模式(批Batch或流Stream)即可,代码不用修改
    • Flink Table API和SQL中可以使用

07-[掌握]-安装部署之应用运行架构

Flink支持多种安装模式,可以将Flink程序运行在很多地方:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bz0qGPUp-1620694491517)(/img/1614739792351.png)]

运行Flink 应用程序,架构组成:JobManager(主节点)和TaskManager(从节点)。

  • 1)、Flink Client:提交应用程序,给主节点JobManager
    • Client 为提交 Job 的客户端,可以是运行在任何机器上(与 JobManager 环境连通即可)。提交 Job 后,Client 可以结束进程(Streaming的任务),也可以不结束并等待结果返回。
  • 2)、JobManager:主节点,为每个Job分配资源,监控管理运行
    • 主要负责调度 Job 并协调 Task 做 checkpoint,从 Client 处接收到 Job 和JAR 包等资源后,会生成优化后的执行计划,并以 Task 为单元调度到各个 TaskManager去执行。
  • 3)、TaskManager:从节点,真正每个Job中对用Task任务,负责Task运行和监控等
    • 在启动的时候就设置好了槽位数(Slot),每个 slot 能启动一个 Task,Task 为线程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WVF2EU9w-1620694491517)(/img/1614740043946.png)]

注意:Flink 程序运行架构组成,非常类似MapReduceV1架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dpzLocfg-1620694491518)(/img/1614740163210.png)]

08-[了解]-安装部署之本地模式

​ 首先运行Flink 官方提供程序:词频统计WordCount,运行批处理程序和流计算,类似Spark功能。

在本地模式,运行Flink中流计算和批处理程序。

本地模式LocalMode表示JobManager和TaskManager运行在一个JVM进程中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9D9rLpOV-1620694491519)(/img/1614740353999.png)]

进行演示操作:

  • 1)、下载Flink 软件包,并且解压
    • http://archive.apache.org/dist/flink/flink-1.10.0/
[root@node1 ~]# cd /export/software/
[root@node1 software]# rz
	上传软件包:flink-1.10.0-bin-scala_2.11.tgz
	
[root@node1 software]# chmod u+x flink-1.10.0-bin-scala_2.11.tgz 
[root@node1 software]# tar -zxf flink-1.10.0-bin-scala_2.11.tgz -C /export/server/	

[root@node1 ~]# cd /export/server/
[root@node1 server]# chown -R root:root flink-1.10.0
[root@node1 server]# ln -s flink-1.10.0 flink
  • 2)、目录结构
[root@node1 server]# cd flink
[root@node1 flink]# ll
total 568
drwxr-xr-x 2 501 games   4096 Mar  3 11:01 bin
drwxr-xr-x 2 501 games    296 Feb  8  2020 conf
drwxr-xr-x 7 501 games     76 Mar  3 11:01 examples
drwxr-xr-x 2 501 games    172 Mar  3 11:01 lib
-rw-r--r-- 1 501 games  11357 Jan 24  2020 LICENSE
drwxr-xr-x 2 501 games   4096 Mar  3 11:01 licenses
drwxr-xr-x 2 501 games      6 Jan 28  2020 log
-rw-r--r-- 1 501 games 550535 Feb  8  2020 NOTICE
drwxr-xr-x 2 501 games   4096 Mar  3 11:01 opt
drwxr-xr-x 2 501 games     24 Mar  3 11:01 plugins
-rw-r--r-- 1 501 games   1309 Jan 24  2020 README.txt
  • 3)、安装scala,配置环境变量
[root@node1 ~]# cd /export/software/
[root@node1 software]# rz

[root@node1 software]# chmod u+x scala-2.11.12.tgz 
[root@node1 software]# tar -zxf scala-2.11.12.tgz -C /export/server/

[root@node1 ~]# cd /export/server/
[root@node1 server]# ln -s scala-2.11.12 scala

[root@node1 server]# cd scala
[root@node1 scala]# pwd
/export/server/scala
[root@node1 scala]# vim /etc/profile
	添加内容
    # SCALA HOME
    export SCALA_HOME=/export/server/scala
    export PATH=:$PATH:$SCALA_HOME/bin
[root@node1 scala]# source /etc/profile
[root@node1 scala]# scala -version
  • 4)、启动shell交互式窗口
[root@node1 ~]# /export/server/flink/bin/start-scala-shell.sh local

senv.socketTextStream("node1", 9997).flatMap(_.split("\\s+")).map((_, 1)).keyBy(0).sum(1).print()
senv.execute("WordCount")

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QvGPWqvU-1620694491519)(/img/1614741184928.png)]

前面运行Flink流计算程序,从TCP Socket消费数据,实时统计分析处理,最后结果输出。

接下来,运行批处理程序:官方自带案例

  • 1)、准备文件/root/words.txt
[root@node1 ~]# vim /root/words.txt
 添加数据
 flink flink spark spark flink hadoop
 flink spark spark
 flink hadoop flink
 flink spark flink                    
  • 2)批处理,执行如下命令
[root@node1 ~]# /export/server/flink/bin/start-scala-shell.sh local

scala> benv.readTextFile("/root/words.txt").flatMap(_.split("\\s+")).map((_,1)).groupBy(0).sum(1).print()


scala> benv.readTextFile("/root/words.txt").filter(line => line.trim.length > 0 ).flatMap(line => line.trim.split("\\s+")).map((_,1)).groupBy(0).sum(1).print()
(flink,8)
(hadoop,2)
(spark,5)

针对Flink中【keyBy(0)…sum(1) 和groupBy(0).sum(1)】理解概念:

(flink, 1)  (spark, 1)   (flink, 1)   (flink, 1)  (spark, 1)
						|
						|groupBy(0),0 表示下标,对应二元组数据中第一个元素
						|	将相同key的数据放在一起,比如集合中
						|
	[(flink, 1)   (flink, 1)   (flink, 1) ]   [ (spark, 1)   (spark, 1)]
						|
						|sum(1),1表示下标,对应二元组中数据第二元素
						|
				(flink, 1 + 1 + 1 = 3)  (spark, 1 + 1 = 2)		
功能相当于Spark中
	reduceByKey

09-[掌握]-安装部署之本地集群【启动服务】

​ Local Cluster 本地集群:类似将Hadoop进行伪分布式安装部署,将不同进程运行在同一台机器上,只有一台机器。

针对Flink框架来说,进程分别为JobManager(主节点,管理者)和TaskManager(从节点,干活着)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KtlZ0vvF-1620694491520)(/img/1614741619007.png)]

原理:

  • 1)、Flink程序由JobClient进行提交
  • 2)、JobClient将作业提交给JobManager
  • 3)、JobManager负责协调资源分配和作业执行。资源分配完成后,任务将提交给相应的TaskManager
  • 4)、TaskManager启动一个线程以开始执行。TaskManager会向JobManager报告状态更改,如开始执行,正在进行或已完成
  • 5)、作业执行完成后,结果将发送回客户端(JobClient)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W8CxlClu-1620694491520)(/img/1614741637978.png)]

下载和解压操作, 如下截图所示:

[root@node1 server]# chown -R root:root flink-1.10.0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A2X6RI7r-1620694491520)(/img/1614741782217.png)]

当将Flink软件压缩包解压以后,默认配置,就是本地集群配置,可以直接启动服务即可

  • 1)、启动Flink本地集群

[root@node1 ~]# cd /export/server/flink
[root@node1 flink]# 
[root@node1 flink]# ls bin/
bash-java-utils.jar  flink-console.sh     kubernetes-session.sh      pyflink-shell.sh   start-scala-shell.sh       yarn-session.sh
config.sh            flink-daemon.sh      mesos-appmaster-job.sh     sql-client.sh      start-zookeeper-quorum.sh  zookeeper.sh
find-flink-home.sh   historyserver.sh     mesos-appmaster.sh         standalone-job.sh  stop-cluster.sh
flink                jobmanager.sh        mesos-taskmanager.sh       start-cluster.bat  stop-zookeeper-quorum.sh
flink.bat            kubernetes-entry.sh  pyflink-gateway-server.sh  start-cluster.sh   taskmanager.sh
[root@node1 flink]# 
[root@node1 flink]# bin/start-cluster.sh 
Starting cluster.
Starting standalonesession daemon on host node1.
Starting taskexecutor daemon on host node1.
[root@node1 flink]# 
[root@node1 flink]# jps
4003 Jps
3620 StandaloneSessionClusterEntrypoint
3925 TaskManagerRunner
  • 2)、访问Flink的Web UI:http://node1:8081/#/overview

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EucGLkmE-1620694491521)(/img/1614742031756.png)]

slot在Flink里面可以认为是资源组,Flink是通过将任务(Task)分成子任务(SubTask)并且将这些子任务分配到slot来并行执行程序。

Slot 封装Task运行资源,可以认为Contanier容器,但是有区别

同一个Slot资源槽中可以运行不同类型Task(SubTask),相当于“猪槽,可以被多个PIG吃食。”

10-[掌握]-安装部署之本地集群【案例运行】

​ 当本地集群启动以后,运行Flink应用程序,分别运行流计算和批处理 词频统计:

# 开启终端
nc -lk 9999
# 上传jar包至/export/server/flink目录
cd /export/server/flink
rz

# 开启终端,运行流式应用
bin/flink run --class cn.itcast.flink.StreamWordCount \
/export/server/flink/StreamWordCount.jar \
--host node1 --port 9999

监控页面查看日志信息数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EN9IAo0r-1620694491522)(/img/1614742506263.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ArQmhDDn-1620694491557)(/img/1614742517436.png)]

/export/server/flink/bin/flink run /export/server/flink/examples/batch/WordCount.jar --input /root/words.txt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EVJ4xjA3-1620694491557)(/img/1614742679343.png)]

/export/server/flink/bin/flink run /export/server/flink/examples/batch/WordCount.jar --input /root/words.txt --output /root/out.txt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K0NbZtUe-1620694491558)(/img/1614742697908.png)]

测试完成以后,关闭本地集群:

[root@node1 ~]# /export/server/flink/bin/stop-cluster.sh 
Stopping taskexecutor daemon (pid: 3925) on host node1.
Stopping standalonesession daemon (pid: 3620) on host node1.

11-[掌握]-Standalone 集群之架构及部署

​ Standalone集群类似Hadoop YARN集群,管理集群资源和分配资源给Flink应用运行任务Task。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GmBn0rwC-1620694491558)(/img/1614743439587.png)]

  • 1)、client客户端提交任务给JobManager;
  • 2)、JobManager负责申请任务运行所需要的资源并管理任务和资源;
  • 3)、JobManager分发任务给TaskManager执行;
  • 4)、TaskManager定期向JobManager汇报状态;

进行Standalone 集群配置安装部署:

  • 1)、集群规划:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tRQAHtQw-1620694491559)(/img/1614743548233.png)]

  • 2)、修改flink-conf.yaml
vim /export/server/flink/conf/flink-conf.yaml
修改内容:
	jobmanager.rpc.address: node1
  • 3)、修改masters
vim /export/server/flink/conf/masters
修改内容:	
	node1:8081
  • 4)、修改slaves
vim /export/server/flink/conf/slaves
修改内容:	
    node1
    node2.itcast.cn
    node3.itcast.cn
  • 5)、添加HADOOP_CONF_DIR环境变量(集群所有机器)
vim /etc/profile
	添加内容:
	export HADOOP_CONF_DIR=/export/server/hadoop/etc/hadoop
source /etc/profile
  • 6)、将Flink依赖Hadoop 框架JAR包上传至FLINK_HOME/lib目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-984tQ78Q-1620694491560)(/img/1614743949588.png)]

[root@node1 ~]# cd /export/server/flink/lib/
[root@node1 lib]# 
[root@node1 lib]# rz
  • 7)、分发到集群其他机器
scp -r /export/server/flink root@node2.itcast.cn:/export/server
scp -r /export/server/flink root@node3.itcast.cn:/export/server

12-[掌握]-Standalone 集群之运行官方案例

前面已经将Standalone 集群配置部署完成,接下来,启动服务进程,运行批处理程序:词频统计WordCount

  • 1)、启动HDFS集群,在node1上执行如下命令
hadoop-daemon.sh start namenode
hadoop-daemons.sh start datanode

  • 2)、启动集群,在node1上执行如下命令
/export/server/flink/bin/start-cluster.sh
# 或者每类进程单独启动
/export/server/flink/bin/jobmanager.sh start cluster  # node1
/export/server/flink/bin/taskmanager.sh start  # 每台机器执行
  • 3)、访问Flink UI界面或使用jps查看:http://node1:8081/#/overview

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VCdcEDwh-1620694491561)(/img/1614744513330.png)]

  • 4)、执行官方测试案例
# 准备测试数据
[root@node1 ~]# hdfs dfs -mkdir -p /wordcount/input/
[root@node1 ~]# hdfs dfs -put /root/words.txt /wordcount/input/

# 运行程序
/export/server/flink/bin/flink run /export/server/flink/examples/batch/WordCount.jar \
--input hdfs://node1:8020/wordcount/input/words.txt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QSN02W2u-1620694491561)(/img/1614744625758.png)]

/export/server/flink/bin/flink run /export/server/flink/examples/batch/WordCount.jar \
--input hdfs://node1:8020/wordcount/input/words.txt \
--output hdfs://node1:8020/wordcount/output/result \
--parallelism 2

[root@node1 ~]# hdfs dfs -text /wordcount/output/result

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZjCFZe2N-1620694491562)(/img/1614744748992.png)]

13-[理解]-Standalone HA集群之架构及部署

​ 从上述架构图中,可发现JobManager存在单点故障(SPOF),一旦JobManager出现意外,整个集群无法工作。为了确保集群的高可用,需要搭建Flink的Standalone HA。

Flink Standalone HA集群,类似YARN HA 集群安装部署,可以启动多个主机点JobManager,使用Zookeeper集群监控JobManagers转态,进行选举leader,实现自动故障转移

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zHbptq17-1620694491562)(/img/1614744840359.png)]

​ 在 Zookeeper 的协助下,一个 Standalone的Flink集群会同时有多个活着的 JobManager,其中只有一个处于Active工作状态,其他处于 Standby 状态。当工作中的 JobManager 失去连接后(如宕机或 Crash),Zookeeper 会从 Standby 中选一个新的 JobManager 来接管 Flink 集群。

  • 1)、集群规划

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4H82V7F4-1620694491563)(/img/1614744989801.png)]

  • 2)、启动ZooKeeper,在node1上启动
zookeeper-daemons.sh start
  • 3)、启动HDFS,在node1上启动,如果没有关闭,不用重启
hadoop-daemon.sh start namenode
hadoop-daemons.sh start datanode
  • 4)、停止集群,在node1.itacast.cn操作,进行HA高可用配置
/export/server/flink/bin/stop-cluster.sh
或者
/export/server/flink/bin/jobmanager.sh stop cluster
/export/server/flink/bin/taskmanager.sh stop  # 每台机器执行
  • 5)、修改flink-conf.yaml
vim /export/server/flink/conf/flink-conf.yaml
	修改内容:
state.backend: filesystem
state.backend.fs.checkpointdir: hdfs://node1:8020/flink-checkpoints
state.savepoints.dir: hdfs://node1:8020/flink-savepoints

high-availability: zookeeper
high-availability.storageDir: hdfs://node1:8020/flink-ha/
high-availability.zookeeper.quorum: node1:2181,node2.itcast.cn:2181,node3.itcast.cn:2181	
  • 6)、修改masters
vim /export/server/flink/conf/masters
	修改内容:
	node1:8081
	node2.itcast.cn:8081
  • 7)、同步配置文件
scp -r /export/server/flink/conf/flink-conf.yaml node2.itcast.cn:/export/server/flink/conf/
scp -r /export/server/flink/conf/flink-conf.yaml node3.itcast.cn:/export/server/flink/conf/

scp -r /export/server/flink/conf/masters node2.itcast.cn:/export/server/flink/conf/
scp -r /export/server/flink/conf/masters node3.itcast.cn:/export/server/flink/conf/
  • 8)、修改node2上的flink-conf.yaml
[root@node2 ~]# vim /export/server/flink/conf/flink-conf.yaml 
	修改内容:33 行
	jobmanager.rpc.address: node2.itcast.cn   
  • 9)、重新启动Flink集群,node1上执行
/export/server/flink/bin/start-cluster.sh

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j3x2WmSg-1620694491563)(/img/1614752944196.png)]

14-[理解]-Standalone HA集群之案例运行测试

​ 可以在node2.itcast.cn启动Standalone HA集群所有进程(2个JobManager和3个TaskManager)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fm4ntCcO-1620694491564)(/img/1614753663426.png)]

**注意:**Flink 程序运行在时,3部分组成,其中JobManager主节点,完成2个功能:

  • 1)、整个资源管理与分配:有多少TaskManager,有多少Slots,分配Slots给每个Job使用
  • 2)、每个Job调度执行:Job需要多少资源(Slots),分配Job中Task任务到TaskManager中Slot进行运行,监控,重试等等。。。

运行批处理词频统计WordCount,在Standalone HA高可用集群上:

  • 1)、访问WebUI
http://node1:8081/#/overview
http://node2.itcast.cn:8081/#/overview

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mcvcNObI-1620694491564)(/img/1614754059137.png)]

  • 2)、执行wc
/export/server/flink/bin/flink run /export/server/flink/examples/batch/WordCount.jar \
--input hdfs://node1:8020/wordcount/input/words.txt
  • 3)、kill掉其中一个master
/export/server/flink/bin/flink run /export/server/flink/examples/batch/WordCount.jar \
--input hdfs://node1:8020/wordcount/input/words.txt

[附录]-创建Maven模块

Maven Project工程GAV三要素:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-75lHkCZo-1620694491565)(/img/1602865153921.png)]

工程目录结构:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nCKFKc2W-1620694491565)(/img/1602865864590.png)]

Maven 工程POM文件中内容(依赖包):

    <repositories>
        <repository>
            <id>apache.snapshots</id>
            <name>Apache Development Snapshot Repository</name>
            <url>https://repository.apache.org/content/repositories/snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
        <flink.version>1.10.0</flink.version>
        <scala.version>2.11</scala.version>
        <scala.binary.version>2.11</scala.binary.version>
    </properties>

    <dependencies>
        <!-- Apache Flink 的依赖, 这些依赖项,不应该打包到JAR文件中. -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-runtime-web_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>

        <!-- flink操作hdfs,所需要导入该包-->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-shaded-hadoop-2-uber</artifactId>
            <version>2.7.5-10.0</version>
        </dependency>

        <!-- 添加logging框架, 在IDE中运行时生成控制台输出. -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.7</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
            <scope>runtime</scope>
        </dependency>

    </dependencies>


    <build>
        <sourceDirectory>src/main/java</sourceDirectory>
        <testSourceDirectory>src/test/java</testSourceDirectory>
        <plugins>
            <!-- 编译插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <!--<encoding>${project.build.sourceEncoding}</encoding>-->
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.18.1</version>
                <configuration>
                    <useFile>false</useFile>
                    <disableXmlReport>true</disableXmlReport>
                    <includes>
                        <include>**/*Test.*</include>
                        <include>**/*Suite.*</include>
                    </includes>
                </configuration>
            </plugin>
            <!-- 打jar包插件(会包含所有依赖) -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <!--
                                        zip -d learn_spark.jar META-INF/*.RSA META-INF/*.DSA META-INF/*.SF -->
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <!-- 可以设置jar包的入口类(可选) -->
                                    <!--
                                    <mainClass>com.itcast.flink.batch.FlinkBatchWordCount</mainClass>
                                    -->
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

在Maven Module模块中添加日志属性文件:log4j.properties,内容如下:

# This affects logging for both user code and Flink
log4j.rootLogger=INFO, console

# Uncomment this if you want to _only_ change Flink's logging
#log4j.logger.org.apache.flink=INFO

# The following lines keep the log level of common libraries/connectors on
# log level INFO. The root logger does not override this. You have to manually
# change the log levels here.
log4j.logger.akka=INFO
log4j.logger.org.apache.kafka=INFO
log4j.logger.org.apache.hadoop=INFO
log4j.logger.org.apache.zookeeper=INFO

# Log all infos to the console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n

# Suppress the irrelevant (wrong) warnings from the Netty channel handler
log4j.logger.org.apache.flink.shaded.akka.org.jboss.netty.channel.DefaultChannelPipeline=ERROR, console

[附录]-大数据技术框架三种类型

1、以Hadoop框架为主离线分析生态圈
	离线批处理,往往都是每日统计分析
	MapReduce计算框架
	大规模数据存储:HDFS、Hive、HBase、Redis、Kafka
	应用程序运行:Hadoop YARN

2、以Spark框架为主内存分析技术栈
	基于内存统一分析引擎
		Core:离线分析
		SQL:交互式分析
		Streaming/StructuredStreaming:流式数据计算
		。。。。。。。。。。

3、以Flink框架为主流式数据分析技术栈
	流式数据处理框架,所有的数据统称为:Data Streams(数据流)
		有界数据、无界数据
	流计算,实时处理
	批处理,离线分析

verride this. You have to manually

change the log levels here.

log4j.logger.akka=INFO
log4j.logger.org.apache.kafka=INFO
log4j.logger.org.apache.hadoop=INFO
log4j.logger.org.apache.zookeeper=INFO

Log all infos to the console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n

Suppress the irrelevant (wrong) warnings from the Netty channel handler

log4j.logger.org.apache.flink.shaded.akka.org.jboss.netty.channel.DefaultChannelPipeline=ERROR, console




## [附录]-大数据技术框架三种类型

1、以Hadoop框架为主离线分析生态圈
离线批处理,往往都是每日统计分析
MapReduce计算框架
大规模数据存储:HDFS、Hive、HBase、Redis、Kafka
应用程序运行:Hadoop YARN

2、以Spark框架为主内存分析技术栈
基于内存统一分析引擎
Core:离线分析
SQL:交互式分析
Streaming/StructuredStreaming:流式数据计算
。。。。。。。。。。

3、以Flink框架为主流式数据分析技术栈
流式数据处理框架,所有的数据统称为:Data Streams(数据流)
有界数据、无界数据
流计算,实时处理
批处理,离线分析