Flink

本文详细介绍了Flink流计算框架,包括Task和Operator Chain、JobManagers、TaskManagers、Clients的角色,以及State Backends和Savepoints的机制。此外,还涵盖了Flink的安装、快速入门、部署模式、DataSource和DataSink的使用,以及各种算子的操作。重点讨论了Kafka Source和Redis-Sink的集成应用。
摘要由CSDN通过智能技术生成

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
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值