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流处理计算的特性

  1. 支持高吞吐、 低延迟、 高性能的流处理
  2. 支持带有事件时间的窗口(Window) 操作
  3. 支持有状态计算的 Exactly-once 语义
  4. 支持高度灵活的窗口(Window) 操作, 支持基于 time、 count、 session, 以及
    data-driven 的窗口操作
  5. 支持具有 Backpressure 功能的持续流模型
  6. 支持基于轻量级分布式快照(Snapshot) 实现的容错
  7. 一个运行时同时支持 Batch on Streaming 处理和 Streaming 处理
  8. Flink 在 JVM 内部实现了自己的内存管理
  9. 支持迭代计算
  10. 支持程序自动优化: 避免特定情况下 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 是非常有效的优化;它能减少线程之间的切换和基于缓存区的数据交换,在减少时延的同时提升吞吐量