Flink
概念
框架和分布式处理引擎,对无界和有界数据流做计算,并具有容错机制 数据分布和资源管理等功能
为用户提供了DataSet DataStream Table 等API进行分布式任务的编写
DataSet API 用来对静态数据进行批处理 支持Java Scala 和 Python
DataStream API 用来对数据流进行流处理 支持Java和Scala
Table API 对结构化数据进行查询操作 支持Java和Scala
Flink和Spark的区别
主要区别
Flink:事件驱动型 被动拉取数据 没有数据时会阻塞 毫秒级延时 流处理
Spark:时间驱动型 主动拉取数据 没有数据时会空转浪费资源 秒级延时 微批次处理
一般实时都会选用Flink,Spack只有吞吐量比Flink大
架构区别
Flink:Jobmanager Taskmanager Slot
Spark:Master Worker Driver Executor
任务调度
SparkStreaming 连续不断生成微小数据批次 构建有向无环图DAG 依次创建DStreamGraph JobGenerator JobScheduler
Flink 根据提交的代码生成StreamGraph,优化成JobGraph,提交给JobManager,生成ExecutionGraph(Flink最核心的数据结构)
作为JobManager的调度依据
时间机制
SparkStreaming只支持处理时间
Flink支持处理时间,事件时间,注入时间,还有watermark机制来处理滞后数据
容错机制
SparkStreaming可以通过checkpoint恢复数据,但只能做到不丢数据,可能会发生数据重复
Flink使用两阶段提交协议做到了精准一次性
Flink集群中的角色
JobManager 相当于Master,管理整个集群接收FlinkJob,协调检查点,故障恢复,管理从节点
TaskManager 负责执行计算,相当于Worker 执行FlinkJob的一组Task,管理自身所在节点的资源信息,启动时会向JobManager汇报一次
Client 客户端 对用户提交的程序进行预处理,获取要连接的集群信息并提交FlinkJob给JobManager
Flink的编程模型
Environment->Source->Transform->Sink
分层API
在Flink编程中调用方法
自定义一个类实现对应的接口
使用接口的匿名内部类
通过lambda表达式(可能出现类型擦除的问题,需要在方法后调用指定泛型.returns(Types.TUPLE(Types.STRING,Types.INT)))
Flink的命令行操作
启动flink本地模式
bin/start-cluster.sh
提交任务
bin/flink run -m root102:8081 -c com.atguigu.flink.java.chapter_2.Flink03_WC_UnBoundedStream ./flink-prepare-1.0-SNAPSHOT.jar
run 运行作业
run -application (application模式的运行作业)
-d 后台运行(断开与客户端的连接)
-m 跟端口号
-D 指定其他参数 Yarn多队列参数(-DYarn.application.queue=hive)
-c 跟运行的程序的全类名
-t yarn模式指定以哪种模式运行的参数
最后跟一个要跑的jar包
Flink的运行模式
Local-cluster本地集群模式 主要用于测试学习 开箱即用
Standalone 独立集群模式 自身提供计算资源和资源调度,和第三方资源框架的耦合性低,独立性非常强,但资源调度能力并不强
Yarn模式 Flink提供计算资源,Yarn提供调度资源,可以做到动态分配资源
standa模式配置
修改配置文件flink-conf.yaml
jobmanager.rpc.address: root102
修改workers
root102
root103
root104
分发到其他节点
standa模式的高可用
修改配置文件flink-conf.yaml
high-availability: zookeeper
high-availability.storageDir: hdfs://root102:8020/flink/standalone/ha
high-availability.zookeeper.quorum: root102:2181,root103:2181,root104:2181
high-availability.zookeeper.path.root: /flink-standalone
high-availability.cluster-id: /cluster_atguigu
修改masters
root102:8081
root103:8081
分发flink-conf.yaml masters到其他节点
配置环境变量myenv.sh保证hadoop的环境变量存在 分发到其他节点
export HADOOP_CLASSPATH=hadoop classpath
首先启动hdfs集群和zookeeper集群
启动standalone HA集群 bin/start-cluster.sh
访问端口号
http://root102:8081
http://root103:8081
在zookeeper的客户端可以查看leader
get /flink-standalone/cluster_atguigu/leader/rest_server_lock
standa高可用原理
配置主备任务管理器JobManager
一台主节点leader,多台备用节点standby,主节点挂掉从备用节点中选取一台成为新的leader
主节点下线备用节点可以及时接管集群保证作业正常运行,集群不会挂掉,主备之间没有明显区别
Yarn模式
解压安装包
配置环境变量
export HADOOP_CLASSPATH=hadoop classpath
Yarn的三种作业提交方式
Session-Cluster
特点
开启后会常驻集群中持续占用资源,只能手动停止,作业间没有隔离,资源共享
缺点
如果提交占用资源时间长的大作业会占用所有资源导致后续的作业无法正常提交
优点
适合处理需要频繁提交完成快的小作业
Per-Job-Cluster
特点
每个作业都会单独申请资源,互相独立,互不影响,每次提交都会产生新的flink集群(application),一个集群对应一个任务,任务完成后自动停止,方便管理,适合规模大时间长运行的作业
Application Mode
特点
在yarn上创建集群,一个集群可以对应多个任务,任务间互不影响
生产环境中常用Per-Job-Cluster,Session-Cluster隔离程度低,Application Mode不如Per-Job-Cluster稳定
Yarn的高可用
修改yarn-site.xml
##最大重试次数
yarn.resourcemanager.am.max-attempts
4
The maximum number of application master execution attempts.
修改flink-conf.yaml 次数应该小于yarn设置中的值
yarn.application-attempts: 3
high-availability: zookeeper
high-availability.storageDir: hdfs://root102:8020/flink/yarn/ha
high-availability.zookeeper.quorum: root102:2181,root103:2181,root104:2181
high-availability.zookeeper.path.root: /flink-yarn