Flink基础学习
- Flink基础学习
- 1.Flink简介
- 1.1flink的引入
- 1.2什么是Flink?
- 1.3Flink流处理计算的特性
- 1.4Flink的四大基石
- 1.5批处理与流处理
- 2.Flink的架构体系
- 2.1Flink中的角色
- 2.2无界数据流与有界数据流
- 2.3Flink数据流编程模型
- 2.4Flink支持的库
- 3.Flink集群搭建
- 3.1Standalone集群搭建
- 3.2Standalone-HA集群搭建
- 3.3Yarn集群环境运行
- 3.3.1修改 hadoop 的配置参数
- 3.3.2修改全局变量/etc/profile
- 3.3.3Flink on Yarn 的两种使用方式
- 4.Flink运行架构
- 4.1任务提交流程
- 4.2Worker与Slots
- 4.3程序与数据流
- 4.4并行数据流
- 4.5task 与 operator chains
Flink基础学习
1.Flink简介
1.1flink的引入
第一代计算引擎,MapReduce
第二代计算引擎 ,tez
第三代计算引擎 ,spark
第四代计算引擎,flink
1.2什么是Flink?
Apache Flink 是为分布式、 高性能、 随时可用以及准确的流处理应用程序打造的开源流处理框架
1.3Flink流处理计算的特性
- 支持高吞吐、 低延迟、 高性能的流处理
- 支持带有事件时间的窗口(Window) 操作
- 支持有状态计算的 Exactly-once 语义
- 支持高度灵活的窗口(Window) 操作, 支持基于 time、 count、 session, 以及
data-driven 的窗口操作 - 支持具有 Backpressure 功能的持续流模型
- 支持基于轻量级分布式快照(Snapshot) 实现的容错
- 一个运行时同时支持 Batch on Streaming 处理和 Streaming 处理
- Flink 在 JVM 内部实现了自己的内存管理
- 支持迭代计算
- 支持程序自动优化: 避免特定情况下 Shuffle、 排序等昂贵操作, 中间结果有必要进行缓存
1.4Flink的四大基石
checkpoint,State,Time,Window
1.5批处理与流处理
批处理的特点是有界、持久、大量,批处理非常适合需要访问全套记录才能完成的计算工作,一般用于离线统计
流处理的特点是无界、实时,流处理方式无需针对整个数据集执行操作,而是对通过系统传输的每个数据执行操作,一般用于实时统计。
2.Flink的架构体系
2.1Flink中的角色
JobManager
TaskManager
2.2无界数据流与有界数据流
无界数据流:无界数据流有一个开始但是没有结束
要求:流处理一般需要支持低延迟、Exactly-once保证
有界数据流:有界数据流有明确定义的开始和结束
要求:批处理需要支持高吞吐、高效处理
2.3Flink数据流编程模型
分为四层:
Process Function
批处理和流处理API
Table API
SQL
2.4Flink支持的库
支持机器学习(FlinkML)
支持图分析(Gelly)
支持关系数据处理(Table)
支持复杂事件处理(CEP)
3.Flink集群搭建
1)local(本地)—— ——单机模式,一般不使用
2)standalone —— ——独立模式,Flink自带集群,开发测试环境使用
3)yarn —— ——计算资源统一由Hadoop YARN管理,生产环境测试
3.1Standalone集群搭建
1)解压Flink压缩包到指定目录
tar -zxvf flink-1.7.2-bin-hadoop26-scala_2.11.tgz
2)配置Flink
配置 Master 的机器名( IP 地址)
jobmanager.rpc.address: node01
配置每个 taskmanager 生成的临时文件夹
taskmanager.tmp.dirs: /export/servers/flink-1.7.2/tmp
3)配置Slaves节点
修改安装目录下 conf 文件夹内的 slave 配置文件, 指定 TaskManager
node01 node02 node03
使用 vi 修改 /etc/profile 系统环境变量配置文件,添加 HADOOP_CONF_DIR 目录 export
HADOOP_CONF_DIR=/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
4)分发Flink到各个节点
scp -r /etc/profile node02:/etc scp -r /etc/profile node03:/etc
每个节点重新加载环境变量
source /etc/profile
5)启动集群
bin/start-cluster.sh
6)递交Wordcount程序测试
bin/flink run /export/servers/flink-1.7.2/examples/batch/WordCount.jar --input hdfs://node01:8020/test/input/wordcount.txt --output hdfs://node01:8020/test/output/200701
7)查看Flink WebUI
http://node01:8081
3.2Standalone-HA集群搭建
1)在Flink-conf.yaml中添加zookeeper配置
#开启 HA, 使用文件系统作为快照存储
state.backend: filesystem
#默认为 none, 用于指定 checkpoint 的 data files 和 meta data 存储的目录
state.checkpoints.dir: hdfs://node01:8020/flink-checkpoints
#默认为 none, 用于指定 savepoints 的默认目录
state.savepoints.dir: hdfs://node01:8020/flink-checkpoints
#使用 zookeeper 搭建高可用
high-availability: zookeeper
# 存储 JobManager 的元数据到 HDFS,用来恢复 JobManager 所需的所有元数据
high-availability.storageDir: hdfs://node01:8020/flink/ha/ high-availability.zookeeper.quorum: node01:2181,node02:2181,node03:2181
2)将配置过的HA的Flink-conf.yaml分发到另外两个节点
for i in {2..3}; do scp -r /export/servers/flink-1.7.2/conf/flink-conf.yaml
3)分别到另外两个节点中修改Flink-conf.yaml中的配置
到节点 2 中修改 flink-conf.yaml 中的配置, 将 JobManager 设置为自己节点的 名称
jobmanager.rpc.address: node02
4)在masters配置文件中添加对个节点
node01:8081 node02:8081
5)分发masters配置文件到另外两个节点
for i in {2..3}; do scp -r /export/servers/flink-1.7.2/conf/masters node0$i:$PWD; done
6)启动zookeeper集群
/export/servers/zookeeper-3.4.5-cdh5.14.0/bin/zkServer.sh start
7)启动Flink集群
bin/start-cluster.sh
3.3Yarn集群环境运行
3.3.1修改 hadoop 的配置参数
vim etc/hadoop/yarn-site.xml
添加:
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
3.3.2修改全局变量/etc/profile
添加:
export HADOOP_CONF_DIR=/export/servers/hadoop/etc/Hadoop YARN_CONF_DIR 或者 HADOOP_CONF_DIR 必须将环境变量设置为读取 YARN 和 HDFS 配置
3.3.3Flink on Yarn 的两种使用方式
会话模式
使用场景:适用于大量的小文件
运行方式:yarn-session.sh(开辟资源)+flink run(提交任务)
分离模式
使用场景:使用与大文件
运行方式:flink run -m yarn-cluster
4.Flink运行架构
4.1任务提交流程
1.Client向HDFS上传Flink的jar包和配置
2.Client向YarnResourceManager提交任务
3.ResourceManager分配Container资源并通知对应的NodeManager启动ApplicationMaster
4.ApplicationMaster启动后加载Flink的jar包和配置构建环境,然后启动JobManager
5.ApplicationMaster向ResourceManager申请资源启动TaskManager
6.ResourceManager分配Container源后,由ApplicationMaster通知资源所在节点的NodeManager启动TaskManager
7.NodeManager加载Flink的jar包和配置构建环境并启动TaskManager
8.TaskManager启动后向JobManager发送心跳包,并等待JobManager向其分配任务
4.2Worker与Slots
每个 task slot 表示 TaskManager 拥有资源的一个固定大小的子集。 假如一个TaskManager 有三个 slot, 那么它会将其管理的内存分成三份给各个 slot。 资源 slot 化意味着一个 subtask 将不需要跟来自其他 job 的 subtask 竞争被管理的内存, 取而代之的是它将拥有一定数量的内存 储备。 需要注意的是, 这里不会涉及到 CPU 的隔离, slot 目前仅仅用来隔离 task 的受管理的内存 。
4.3程序与数据流
Flink 程序的基础构建模块是 流(streams) 与 转换(transformations)
4.4并行数据流
One-to-one:steam(比如在 source 和map operator 之间)维护着分区以及元素的顺序
Redistributing:steam(map()跟 keyBy/window之间或者 keyBy/window跟sink之间)的分区会发生改变
4.5task 与 operator chains
Flink将 operator 的 subtask 连接在一起形成 task,每个task 在一个线程中执行。将operators 链接成 task 是非常有效的优化;它能减少线程之间的切换和基于缓存区的数据交换,在减少时延的同时提升吞吐量