ZBlog

1111222

Flink入门简介

Flink的基本原理以及应用场景

Flink的简介

  • 111

  • Flink是一个开源的分布式、高性能、高可用、准确的流处理框架。

  • 支持实时流处理以及实时批处理,批处理其实就是流处理的一个特例

  • 原生支持迭代计算、内存管理、程序优化等

  • Flink的架构图:

  • 1567231630042

  • Flink的基本组件:

    • 1567231706001

Flink的流处理与批处理

  • 在大数据领域中,批处理任务以及流处理任务一般被认为是两种不同的任务,一个大数据的框架只能处理其中的一种任务
    • 例如:Storm只支持流处理,spark、MapReduce只支持批处理,spark Streaming也是采用了一种micro-batch的架构,即把输入的数据流切分成细粒度的batch,并且为每一个batch提交一个批处理的spark任务,所以spark Streaming的流处理与storm的完全不同。
  • Flink通过灵活的执行引擎,能够同时支持批处理任务以及流处理任务。
    • 1567249802096
    • 在执行引擎这一层,批处理与流处理的最大的区别在于节点之间数据的传输方式。
    • 流处理系统,其节点间数据传输的标准模型是:当一条数据被处理完成后,序列化到缓存中,然后立刻通过网络传输到下一个节点,由下一个节点继续处理
    • 批处理系统,其节点间数据传输的标准模型是:当一条数据被处理完成后,序列化到缓存中,并不会立刻通过网络传输到下一个节点,当缓存写满,就持久化到本地硬盘上,当所有数据都被处理完成后,才开始将处理后的数据通过网络传输到下一个节点
    • 这两种数据传输模式是两个极端,对应的是流处理系统对低延迟的要求和批处理系统对高吞吐量的要求
    • Flink以固定的缓存块为单位进行网络数据传输,用户可以通过设置缓存块超时值指定缓存块的传输时机。如果缓存块的超时值为0,则Flink的数据传输方式类似上文所提到流处理系统的标准模型,此时系统可以获得最低的处理延迟
    • 如果缓存块的超时值为无限大,则Flink的数据传输方式类似上文所提到批处理系统的标准模型,此时系统可以获得最高的吞吐量
    • 同时缓存块的超时值也可以设置为0到无限大之间的任意值。缓存块的超时阈值越小,则Flink流处理执行引擎的数据处理延迟越低,但吞吐量也会降低,反之亦然。通过调整缓存块的超时阈值,用户可根据需求灵活地权衡系统延迟和吞吐量

Flink的应用场景

  • 优化电商网站的实时搜索结果
    • 阿里巴巴的所有基础设施团队使用flink实时更新产品细节和库存信息(Blink)
  • 针对数据分析团队提供实时流数据处理服务
    • 通过flink数据分析平台提供实时数据分析服务,及时发现问题
  • 网络/传感器检测和错误检测
    • Bouygues电信公司,是法国最大的电信供应商之一,使用flink监控其有线和无线网络,实现快速故障响应
  • 商业智能分析ETL
    • Zalando使用flink转换数据以便于加载到数据仓库,将复杂的转换操作转化为相对简单的并确保分析终端用户可以更快的访问数据(实时ETL)

Flink与其他框架的对比

  • Flink与Storm以及Spark Streaming的对比:
  • 1567250139695
  • 1567250383255
  • 实时处理框架的选择
    • 需要关注流数据是否需要进行状态管理
    • At-least-once或者Exectly-once消息投递模式是否有特殊要求
    • 对于小型独立的项目,并且需要低延迟的场景,建议使用storm
    • 如果你的项目已经使用了spark,并且秒级别的实时处理可以满足需求的话,建议使用sparkStreaming
    • 要求消息投递语义为
      Exactly Once 的场景;数据量较大,要求高吞吐低延迟的场景;需要进行状态管理或窗口统计的场景,建议使用flink

Flink的入门案例

  • 需求:手工通过socket实时产生一些单词,使用flink实时接收数据,对指定时间窗口内(例如:2秒)的数据进行聚合统计,并且把时间窗口内计算的结果打印出来

  • 代码实现:可以使用Java或者Scala 这里推荐使用Scala并使用Scala演示

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      添加ScalaFlink的核心依赖包
      <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-scala_2.11</artifactId>
      <version>1.6.1</version>
      </dependency>
      <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-streaming-scala_2.11</artifactId>
      <version>1.6.1</version>
      </dependency>
    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      package FlinkTest

      import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
      import org.apache.flink.streaming.api.windowing.time.Time

      /**
      * 实时计算
      * 手工通过socket实时产生一些单词,使用flink实时接收数据,
      * 对指定时间窗口内(例如:2秒)的数据进行聚合统计,并且把时间窗口内计算的结果打印出来
      */
      object WordCount {
      def main(args: Array[String]): Unit = {
      //获取执行环境
      val env = StreamExecutionEnvironment.getExecutionEnvironment
      //指定source 获取数据源
      val text = env.socketTextStream("hadoop110",9999,'\n')
      //使用flatmap的时候需要使用隐式转换 添加隐式转换
      import org.apache.flink.api.scala._
      //对数据切分
      val words = text.flatMap(_.split(" "))
      //转换单词格式
      val wordsCount = words.map((_,1))
      //吧相同的key放在一起
      val keys = wordsCount.keyBy(0)
      //指定一个基于时间的滑动窗口 每隔一秒计算前两秒的数据
      val windowData = keys.timeWindow(Time.seconds(2),Time.seconds(1))
      //根据tuple中的数据求和
      val res = windowData.sum(1)
      //打印结果 设置并行度为1
      res.print().setParallelism(1)
      //执行代码
      env.execute("WordCount")
      }
      }
    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      package FlinkTest

      import org.apache.flink.api.scala.ExecutionEnvironment

      object BatchWordCount {
      def main(args: Array[String]): Unit = {
      val env = ExecutionEnvironment.getExecutionEnvironment

      val data = env.readTextFile("D:\\data\\words.txt")

      import org.apache.flink.api.scala._

      val res = data.flatMap(_.split(" "))
      .map((_,1))
      .groupBy(0)
      .sum(1)
      res.print()
      res.writeAsCsv("D:\\data\\words.csv","\n"," ")

      env.execute("BatchWordCount")
      }
      }

Flink的集群介绍

简单本地集群安装部署

  • 依赖环境:Linux,jdk1.8以上
  • 下载地址:https://archive.apache.org/dist/flink 选择合适的版本
  • local模式快速安装启动
    • 解压
    • 进入
    • 启动 ./bin/start-cluster.sh
    • 进入web界面查看 8081
    • 1567254037326
    • 可以将任务提交到进群之中尝试运行

集群搭建中的重点

  • Flink-Standalone集群
    • 各个参数详解
      • jobmanager.heap.mb:jobmanager节点可用的内存大小
      • taskmanager.heap.mb:taskmanager节点可用的内存大小
      • taskmanager.numberOfTaskSlots:每台机器可用的cpu数量
      • parallelism.default:默认情况下任务的并行度
      • taskmanager.tmp.dirs:taskmanager的临时数据存储目录
      • slot和parallelism总结
        • slot是静态的概念,是指taskmanager具有的并发执行能力
        • parallelism是动态的概念,是指程序运行时实际使用的并发能力
        • 设置合适的parallelism能提高运算效率,太多了和太少了都不行
    • 容错
      • jobmanager挂掉
        • 正在执行的任务会失败
        • 存在单点故障 但是Flink支持HA
      • taskmanager挂掉
        • 如果有多余的taskmanager节点,flink会自动把任务调度到其它节点执行
  • Flink on Yarn
    • 使用on yarn 的好处
      • 提高集群的利用率
      • 一套集群,可以执行mr任务,spark任务,Flink任务
    • 内部实现结构
      • 1567257268454
    • Flink on Yarn有两种方式
    • 第一种运行方式
      • 1567257321529
      • yarn-session.sh(开辟资源)+flink run(提交任务)
      • 启动一个一直运行的flink集群
      • bin/yarn-session.sh -n 2 -jm 1024 -tm 1024
      • 附着到一个已存在的flink yarn session
      • bin/yarn-session.sh -id application_1463870264508_0029
      • 执行任务
      • bin/flink run ./examples/batch/WordCount.jar
    • 第二种运行方式
      • 1567257496396
      • flink run -m yarn-cluster(开辟资源+提交任务)
      • 启动集群,执行任务
      • bin/flink run -m yarn-cluster -yn 2 -yjm 1024 -ytm 1024 ./examples/batch/WordCount.jar
      • 注意:client端必须要设置YARN_CONF_DIR或者HADOOP_CONF_DIR或者HADOOP_HOME环境变量,通过这个环境变量来读取YARN和HDFS的配置信息,否则启动会失败
    • 参数解释
      • -n,–container 分配多少个yarn容器(=taskmanager的数量) 必选
      • -D 动态属性
      • -d,–detached 独立运行
      • -jm,–jobManagerMemory JobManager的内存 [in MB]
      • -nm,–name 在YARN上为一个自定义的应用设置一个名字
      • -q,–query 显示yarn中可用的资源 (内存,cpu核数)
      • -qu,–queue 指定YARN队列
      • -s,–slots 每个TaskManager使用的slots数量
      • -tm,–taskManagerMemory 每个TaskManager的内存 [in MB]
      • -z,–zookeeperNamespace 针对HA模式在zookeeper上创建NameSpace
      • id,–applicationId YARN集群上的任务id,附着到一个后台运行的yarn session中
    • bin/flink run 命令分析
      • run [OPTIONS]
        • “run”操作参数:
          • -c,–class 如果没有在jar包中指定入口类,则需要在这里通过这个参数指定 需要放在jar包前面
          • -m,–jobmanager host:port 指定需要连接的jobmanager(主节点)地址,使用这个参数可以指定一个不同于配置文件中的jobmanager
          • -p,–parallelism 指定程序的并行度。可以覆盖配置文件中的默认值
      • 默认查找当前yarn集群中已有的yarn-session信息中的jobmanager
        • bin/flink run ./examples/batch/WordCount.jar
      • 连接指定host和port的jobmanager
        • bin/flink run -m hadoop100:1234 ./examples/batch/WordCount.jar
      • 启动一个新的yarn-session
        • bin/flink run -m yarn-cluster -yn 2 ./examples/batch/WordCount.jar
        • yarn session命令行的选项也可以使用./bin/flink 工具获得。它们都有一个y或者yarn的前缀

Flink的HA高可用

  • jobManage协调每一个Flink任务的部署,他负责调度和资源管理。
  • 默认情况下,一个Flink集群中只有一个jobmanege,这样就很容易出现单点故障而导致不能提交新的任务并且现在执行的任务也会失败
  • 使用jobManage HA 集群可以快速从jobManage故障中恢复,避免单点故障spof,可以再standalone或者yarn集群模式下配置集群的高可用机制
  • Standolone高可用详解
    • 1567259000316
    • Standalone模式(独立模式)下JobManager的高可用性的基本思想是,任何时候都有一个
      Master JobManager ,并且多个Standby JobManagers 。 Standby JobManagers可以在Master JobManager 挂掉的情况下接管集群成为Master JobManager。 这样保证了没有单点故障,一旦某一个Standby JobManager接管集群,程序就可以继续运行。 Standby JobManager和Master JobManager实例之间没有明确区别。每个JobManager都可以成为Master或Standby节点
  • Yarn高可用详解
    • 1567259103814
    • 主要是利用yarn自己的job恢复机制
  • 因为每次打jar包进行测试有些麻烦,并且不好定位问题,所以可以再Scala shell中进行调试
  • scala shell方式支持流处理和批处理。当启动shell命令行之后,两个不同的ExecutionEnvironments会被自动创建。使用senv(Stream)和benv(Batch)分别去处理流处理和批处理程序。(类似于spark-shell中sc变量)
  • 启动指令bin/start-scala-shell.sh
  • 1567259304840

博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本站使用 Blog Zhao 作为主题 , 总访问量为 次 。
载入天数...载入时分秒...