Flink

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。

Flink_第1张图片

  • 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并不负责任务执⾏过程中调度。

Flink_第2张图片

③.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的⼀部分。

Flink_第3张图片

⑤.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

三、快速入门

①.依赖坐标

<dependency>
            <groupId>org.apache.hadoopgroupId>
            <artifactId>hadoop-clientartifactId>
            <version>2.9.2version>
            <scope>providedscope>
        dependency>

        <dependency>
            <groupId>org.apache.flinkgroupId>
            <artifactId>flink-streaming-scala_2.11artifactId>
            <version>1.10.0version>
        dependency>


  <build>
        <plugins>
            
            <plugin>
                <groupId>net.alchim31.mavengroupId>
                <artifactId>scala-maven-pluginartifactId>
                <version>4.0.1version>
                <executions>
                    <execution>
                        <id>scala-compile-firstid>
                        <phase>process-resourcesphase>
                        <goals>
                            <goal>add-sourcegoal>
                            <goal>compilegoal>
                        goals>
                    execution>
                executions>
            plugin>
            
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-shade-pluginartifactId>
                <version>2.4.3version>
                <executions>
                    <execution>
                        <phase>packagephase>
                        <goals>
                            <goal>shadegoal>
                        goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SFexclude>
                                        <exclude>META-INF/*.DSAexclude>
                                        <exclude>META-INF/*.RSAexclude>
                                    excludes>
                                filter>
                            filters>
                        configuration>
                    execution>
                executions>
            plugin>
            
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-compiler-pluginartifactId>
                <version>3.2version>
                <configuration>
                    <source>1.8source>
                    <target>1.8target>
                    <encoding>UTF-8encoding>
                configuration>
                <executions>
                    <execution>
                        <phase>compilephase>
                        <goals>
                            <goal>compilegoal>
                        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 =

你可能感兴趣的:(Flink,flink)