Flink
一、概述
Flink是构建在数据流之上的有状态计算的流计算框架,通常被⼈们理解为是 第三代
⼤数据分析⽅案。
①.Task和Operator Chain
Flink是⼀个分布式流计算引擎,该引擎将⼀个计算job拆分成若⼲个Task
(等价于Spark中的Stage),每个Task都有⾃⼰的并⾏度,每个并⾏度都由⼀个线程表示,因为⼀个Task是并⾏执⾏的,因此⼀个Task底层对应⼀系列的线程,Flink称为这些线程为该Task的subtask。
与Spark不同的地⽅在于Spark是通过RDD的依赖关系实现Stage的划分⽽Flink是通过 OperatorChain 的概念实现Task的拆分。所谓的OperatorChain 指的是Flink在job编织的时候,尝试将多个操作符算⼦进⾏串联到⼀个Task中,以减少数据的线程到线程传输的开销,⽬前Flink常⻅的Operatorchain的⽅式有两种:forward、hash|rebalance。
- Task - 等价spark中的Stage,每个Task都有若⼲个SubTask
- SubTask - 等价⼀个线程,是Task中的⼀个⼦任务
- OperatorChain - 将多个算⼦归并到⼀个Task的⼀种机制,归并原则类似SparkRDD的宽窄依赖
②.JobManagers、TaskManagers、Clients
- JobManagers - (也称为master)
负责协调分布式执⾏
。负责任务调度,协调检查点,协调故障恢复等,等价于Spark中的Master+Driver的功能。通常⼀个集群中⾄少有1个Active的JobManager,如果在HA模式下其他处于StandBy状态。 - TaskManagers - (称为Worker) 真正
负责Task执⾏计算
节点,同时需要向JobManager汇报⾃身状态信息和⼯作负荷。通常⼀个集群中有若⼲个TaskManager。 - client -与Spark不同,Flink中的Client并不是集群计算的⼀部分,Client仅仅
负责提交任务的Dataflow Graph给JobManager
,提交完成之后,可以直接退出。因此该Client并不负责任务执⾏过程中调度。
③.Task Slots和Resources
- 每⼀个Worker(TaskManager)是⼀个
JVM进程
,可以执⾏⼀个或者多个⼦任务(Thread/SubTask)为了控制Worker节点能够接受多个Task任务,Worker提出所谓Task slot⽤于表达⼀个计算节点的计算能⼒(每个计算节点⾄少有⼀个Task slot)。 - 每个TaskSlot表示的是
TaskManager计算资源的固定⼦集
。例如:如果⼀个TaskManager拥有3个TaskSlot,则每个Task Slot表示占⽤当前TaskManager的进程的1/3内存资源。每个Job(计算)启动的时候都拥有⾃⼰的固定的Task Slot,也就意味着避免了不同job间的在运⾏时产⽣内存资源抢占。这些被分配的Task Slot资源只能被当前job的所有Task所使⽤,不同Job的Task之间不存在资源共享和抢占问题。 - 但是⼀个Job会被拆
分成若⼲个Task
,每个Task由若⼲个SubTask构成(取决于Task并⾏度)。默认Task Slot所对应的内存资源只能在同⼀个Job下的不同Task的subtask间进⾏共享,也就意味着同⼀个Task的不同subtask不能运⾏在同⼀个Taskslot中,但是如果是相同的job的不同Task的SubTask却可以
。
④.State Backends
Flink是⼀个基于状态计算流计算引擎,存储的key/value状态索引的确切数据结构取决于所选的StateBackend
。
例如:使⽤Memory State Backend将数据存储在内存中的HashMap中,或者使⽤RocksDB(内嵌NoSQL数据,和Derby数据库类似)作为State Backend 存储状态。除了定义保存状态的数据结构之外,State Backend还实现逻辑以获key/value状态的时间点快照并将该快照存储为Checkpoint的⼀部分。
⑤.Savepoints
- ⽤Data Stream API编写的程序可以从Savepoint恢复执⾏。Savepoint允许更新程序和Flink群集,⽽不会丢失任何状态。
Savepoint是⼿动触发的Checkpoint
,Savepoint为程序创建快照并将其写到State Backend。Savepoint依靠常规的Checkpoint机制。所谓的Checkpoint指的是程序在执⾏期间,程序会定期在⼯作节点上快照并产⽣Checkpoint。为了进⾏恢复,仅需要获取最后⼀次完成的Checkpoint即可,并且可以在新的Checkpoint完成后⽴即安全地丢弃较旧的Checkpoint。- Savepoint与这些定期Checkpoint类似,Savepoint由⽤户触发并且更新的Checkpoint完成时
不会⾃动过期
。⽤户可以使⽤命令⾏或通过REST API取消作业时创建Savepoint
二、安装
①.前置条件
- JDK必须是
1.8+
,完成JAVA_HOME配置 - 安装Hadoop、并保证HADOOP正常运⾏(SSH免密码、HADOOP_HOME已设置)
②.配置文件
- 解压tat包,进入
conf/flink-conf.yaml
下,作配置
[root@hbase flink-1.10.0]# vi conf/flink-conf.yaml
对文件内容进行修改:
#==============================================================================
# Common
#==============================================================================
#主机名
jobmanager.rpc.address: hbase
#任务节点槽数
taskmanager.numberOfTaskSlots: 4
#默认并行度
parallelism.default: 3
- 配置slaves
[root@hbase flink-1.10.0]# vi conf/slaves
添加从机:
hbase
③.启动服务
[root@CentOS flink-1.10.0]# ./bin/start-cluster.sh
④.验证
- 访问端口 :
8081
三、快速入门
①.依赖坐标
<!--hadoop依赖 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.9.2</version>
<scope>provided</scope>
</dependency>
<!--flink依赖 -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>1.10.0</version>
</dependency>
<!--编译插件-->
<build>
<plugins>
<!--scala编译插件-->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>4.0.1</version>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<!--创建fatjar插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
<!--编译插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
②.程序编写
package com.baizhi.quickstart
import org.apache.flink.streaming.api.scala._
object FlinkWordCount {
def main(args: Array[String]): Unit = {
//1.创建流计算执行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment