简介

  • Flink是一个低延迟、高吞吐、统一的大数据计算引擎, Flink的计算平台可以实现毫秒级的延迟情况下,每秒钟处理上亿次的消息或者事件。

  • 同时Flink提供了一个Exactly-once的一致性语义, 保证了数据的正确性。(对比其他: At most once, At least once)

  • 这样就使得Flink大数据引擎可以提供金融级的数据处理能力(安全)。

  • Flink作为主攻流计算的大数据引擎,它区别于Storm,Spark Streaming以及其他流式计算引擎的是:

    • 它不仅是一个高吞吐、低延迟的计算引擎,同时还提供很多高级的功能。
    • 比如它提供了有状态的计算,支持状态管理,支持强一致性的数据语义以及支持Event Time,WaterMark对消息乱序的处理。

发展历程

  • Flink诞生于欧洲的一个大数据研究项目StratoSphere。
  • 该项目是柏林工业大学的一个研究性项目。
  • 早期,Flink是做Batch计算的,但是在2014年,StratoSphere里面的核心成员孵化出Flink,同年将Flink捐赠Apache,并在后来成为Apache的顶级大数据项目。
  • Flink计算的主流方向被定位为Streaming,即用流式计算来做所有大数据的计算,这就是Flink技术诞生的背景。

与其他计算引擎的对比

  • 开源大数据计算引擎

    • 流计算(Streaming)

      • Storm
      • Flink
      • SparkStreaming等
    • 批处理(batch)
      • Spark
      • MapReduce
      • Pig(好像已凉)
      • Flink等
    • 同时支持流处理和批处理的:
      • Apache Spark
      • Apache Flink
    • 从技术, 生态等各方面综合考虑
      • Spark的技术理念是基于批来模拟流的计算
      • Flink则完全相反,它采用的是基于流计算来模拟批计算
      • 可将批数据看做是一个有边界的流
    • Flink最区别于其他流计算引擎的点:
      • stateful, 即有状态计算。
      • Flink提供了内置的对状态的一致性的处理,即如果任务发生了Failover,其状态不会丢失、不会被多算少算,同时提供了非常高的性能。
      • 什么是状态?
        • 例如开发一套流计算的系统或者任务做数据处理,可能经常要对数据进行统计,如Sum,Count,Min,Max,这些值是需要存储的。
        • 因为要不断更新,这些值或者变量就可以理解为一种状态。
        • 如果数据源是在读取Kafka,RocketMQ,可能要记录读取到什么位置,并记录Offset,这些Offset变量都是要计算的状态。
      • Flink提供了内置的状态管理,可以把这些状态存储在Flink内部,而不需要把它存储在外部系统。
        • 这样做的好处:

          • 降低了计算引擎对外部系统的依赖以及部署,使运维更加简单
          • 对性能带来了极大的提升
            • 如果通过外部去访问,如Redis,HBase它一定是通过网络及RPC。
            • 如果通过Flink内部去访问,它只通过自身的进程去访问这些变量。
            • 同时Flink会定期将这些状态做Checkpoint持久化,把Checkpoint存储到一个分布式的持久化系统中,比如HDFS。
            • 这样的话,当Flink的任务出现任何故障时,它都会从最近的一次Checkpoint将整个流的状态进行恢复,然后继续运行它的流处理。
            • 对用户没有任何数据上的影响。
  • 性能对比

    • Flink是一行一行处理,而SparkStream是基于数据片集合(RDD)进行小批量处理,所以Spark在流式处理方面,不可避免增加一些延时。

    • Flink的流式计算跟Storm性能差不多,支持毫秒级计算,而Spark则只能支持秒级计算。

    • Spark vs Flink vs Storm:

      • Spark:

        • 以批处理为核心,用微批去模拟流式处理
        • 支持SQL处理,流处理,批处理
        • 对于流处理:因为是微批处理,所有实时性弱,吞吐量高,延迟度高
      • Flink:
        • 以流式处理为核心,用流处理去模拟批处理
        • 支持流处理,SQL处理,批处理
        • u 对于流处理:实时性强,吞吐量高,延迟度低。
      • Storm:
        • 一条一条处理数据,实时性强,吞吐量低,延迟度低。
    • Flink 与 Storm的吞吐量对比

    • storm与flink延迟随着数据量增大而变化的对比

    • 阿里使用Jstorm时遇到的问题:

    • 后来他们将 JStorm 的作业迁移到 Flink集群上

    Flink 是什么?

    • Apache Flink是一个分布式计算引擎,用于对无界和有界数据流进行状态计算

    • Flink可以在所有常见的集群环境中运行,并且能够对任何规模的数据进行计算。

    • 这里的规模指的是既能批量处理(批计算)也能一条一条的处理(流计算)。

    • 有界和无界数据:

      • Flink认为任何类型的数据都是作为事件流产生的。

      • 比如:信用卡交易,传感器测量,机器日志或网站或移动应用程序,所有这

        数据可以作为无界或有界流处理:

        • 无界流:

          • 它有开始时间但没有截止时间,它们在生成时提供数据,但不会被终止。
          • 无界流必须连续处理数据,即必须在摄取事件后立即处理事件。
          • 它无法等待所有输入数据到达,因为输入是无界的,如果是这样,在任何时间点都不会完成。
          • 处理无界数据通常要求以特定顺序摄取事件,例如事件发生的顺序,以便能够推断结果完整性。
        • 有界流:

          • 具有起始时间和截止时间。
          • 它可以在执行任何的计算之前,先通过摄取所有数据后再来处理有界流。
          • 处理有界流不需要有序摄取,因为可以对有界数据集进行排序。
          • 有界流的处理也称为批处理。

    • Flink 适用场景

      • 事件驱动应用

        • 欺诈识别

        • 异常检测

        • 基于规则的警报

        • 业务流程监控

      • 数据分析应用

        • 电信网络的质量监控

        • 分析移动应用程序中的产品更新和实验评估

        • 对消费者技术中的实时数据进行特别分析

        • 大规模图分析

      • 数据管道 & ETL

        • 电子商务中的实时搜索索引构建
        • 电子商务中持续的 ETL
  • Flink 编程模型

    • Flink提供不同级别的抽象来开发流/批处理应用程序

    • 抽象层次

      • 最低级抽象只是提供有状态流。它通过 Process Function 嵌入到 DataStream API 中
      • 在实践中,大多数应用程序不需要上述低级抽象,而是针对DataStream API(有界/无界流)和DataSet API (有界数据集)
    • 批处理: DataSet 案例

      • Scala 版:

        package com.ronnie.batch
        
        object WordCount {
        def main(args: Array[String]): Unit = {
        // 引入隐式转换
        import org.apache.flink.api.scala._
        // 1. 初始化执行环境
        val env = ExecutionEnvironment.getExecutionEnvironment
        // 2. 读取数据源, -> dataset 集合, 类似spark的RDD
        val data = env.readTextFile("/data/textfile")
        // 3. 对数据进行转化 val result = data.flatMap(x=>x.split(" "))
        .map((_,1))
        .groupBy(0)
        .sum(1)
        // 4. 打印数据结果
        result.print()
        }
        }
      • Java 版:

        package com.shsxt.flink.batch;
        
        import org.apache.flink.api.common.functions.FlatMapFunction;
        import org.apache.flink.api.java.DataSet;
        import org.apache.flink.api.java.ExecutionEnvironment;
        import org.apache.flink.api.java.tuple.Tuple2;
        import org.apache.flink.util.Collector; public class WordCount { public static void main(String[] args) throws Exception { //1:初始执行环境
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); //2:读取数据源
        DataSet<String> text = env.readTextFile("data/textfile");
        //3:对数据进行转化操作
        DataSet<Tuple2<String, Integer>> wordCounts = text
        .flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
        @Override
        public void flatMap(String line, Collector<Tuple2<String, Integer>> out) throws Exception {
        for (String word : line.split(" ")) {
        out.collect(new Tuple2<String, Integer>(word, 1));
        }
        }
        })
        .groupBy(0)
        .sum(1); //4:对数据进行输出
        wordCounts.print();
        } public static class LineSplitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
        @Override
        public void flatMap(String line, Collector<Tuple2<String, Integer>> out) {
        for (String word : line.split(" ")) {
        out.collect(new Tuple2<String, Integer>(word, 1));
        }
        }
        }
        }
    • 流处理: DataStream 案例

      • Scala 版:

        package com.ronnie.streaming
        
        import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment}
        import org.apache.flink.streaming.api.windowing.time.Time object WordCount {
        def main(args: Array[String]): Unit = {
        //引入scala隐式转换..
        import org.apache.flink.api.scala._
        //1.初始化执行环境
        val env = StreamExecutionEnvironment.getExecutionEnvironment
        //2.获取数据源, 生成一个datastream
        val text: DataStream[String] = env.socketTextStream("ronnie01", 9999)
        //3.通过转换算子, 进行转换
        val counts = text.flatMap{_.split(" ")}
        .map{(_,1)}
        .keyBy(0)
        .timeWindow(Time.seconds(5))
        .sum(1) counts.print() env.execute()
        }
        }
      • Java 版:

        package com.ronnie.flink.stream;
        
        import org.apache.flink.api.common.functions.FlatMapFunction;
        import org.apache.flink.api.java.tuple.Tuple2;
        import org.apache.flink.streaming.api.datastream.DataStream;
        import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
        import org.apache.flink.streaming.api.windowing.time.Time;
        import org.apache.flink.util.Collector; public class WordCount {
        public static void main(String[] args) throws Exception {
        //1.初始化环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //2.读取数据源,并进行转换操作
        DataStream<Tuple2<String, Integer>> dataStream = env
        .socketTextStream("ronnie01", 9999)
        .flatMap(new Splitter())
        .keyBy(0)
        //每5秒触发一批计算
        .timeWindow(Time.seconds(5))
        .sum(1);
        //3.将结果进行输出
        dataStream.print();
        //4.流式计算需要手动触发执行操作,
        env.execute("Window WordCount");
        } public static class Splitter implements FlatMapFunction<String, Tuple2<String, Integer>> { public void flatMap(String sentence, Collector<Tuple2<String, Integer>> out) throws Exception {
        for (String word: sentence.split(" ")) {
        out.collect(new Tuple2<String, Integer>(word, 1));
        }
        }
        }
        }
    • 程序和数据流

      • Flink程序的基本构建是在流和转换操作上的, 执行时, Flink程序映射到流数据上,由流和转换运算符组成。

      • 每个数据流都以一个或多个源开头,并以一个或多个接收器结束。

      • 数据流类似于任意有向无环图 (DAG)

    • 代码流程

      • 创建ExecutionEnvironment/StreamExecutionEnvironment 执行环境对象
      • 通过执行环境对象创建出source(源头)对象
      • 基于source对象做各种转换,注意:在flink中转换算子也是懒执行的
      • 定义结果输出到哪里(控制台,kafka,数据库等)
      • 最后调用StreamExecutionEnvironment/ExecutionEnvironment 的excute方法,触发执行。
      • 每个flink程序由source operator + transformation operator + sink operator组成
  • Flink中的Key

    • 注意点:

      • Flink处理数据不是K,V格式编程模型,没有xxByKey 算子,它是虚拟的key。
      • Flink中Java Api编程中的Tuple需要使用Flink中的Tuple,最多支持25个
      • 批处理用groupBY 算子,流式处理用keyBy算子
    • Apache Flink 指定虚拟key
      • 使用Tuples来指定key
      • 使用Field Expression来指定key
      • 使用Key Selector Functions来指定key

Flink 笔记(一)的更多相关文章

  1. 01.Flink笔记-编译、部署

    Flink开发环境部署配置 Flink是一个以Java及Scala作为开发语言的开源大数据项目,代码开源在github上,并使用maven来编译和构建项目.所需工具:Java.maven.Git. 本 ...

  2. flink笔记(三) flink架构及运行方式

    架构图 Job Managers, Task Managers, Clients JobManager(Master) 用于协调分布式执行.它们用来调度task,协调检查点,协调失败时恢复等. Fli ...

  3. Flink笔记(二) DataStream Operator(数据流操作)

    DataStream Source 基于文件 readTextFile(path) 读取 text 文件的数据 readFile(fileInputFormat, path) 通过自定义的读取方式, ...

  4. 02.Flink的单机wordcount、集群安装

    一.单机安装 1.准备安装包 将源码编译出的安装包拷贝出来(编译请参照上一篇01.Flink笔记-编译.部署)或者在Flink官网下载bin包 2.配置 前置:jdk1.8+ 修改配置文件flink- ...

  5. Apache Flink学习笔记

    Apache Flink学习笔记 简介 大数据的计算引擎分为4代 第一代:Hadoop承载的MapReduce.它将计算分为两个阶段,分别为Map和Reduce.对于上层应用来说,就要想办法去拆分算法 ...

  6. Flink学习笔记-新一代Flink计算引擎

    说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...

  7. Flink学习笔记:Flink Runtime

    本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...

  8. Flink学习笔记:Flink开发环境搭建

    本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...

  9. Flink学习笔记:Flink API 通用基本概念

    本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...

随机推荐

  1. Sqlserver2012 使用sql语句增加(或删除)表一个字段

    前言 Mark在SqlServer 2012 的数据库使用sql语句增加(或删除)一张表的一个字段. 使用Sql语句增加表的一个字段 [1]语法: alter table table_name add ...

  2. Day2-I-Knight's Problem POJ - 3985

    You must have heard of the Knight's Tour problem. In that problem, a knight is placed on an empty ch ...

  3. C++ 一篇搞懂继承的常见特性

    微信公众号:「小林coding」 用简洁的方式,分享编程小知识. 继承和派生 01 继承和派生的概念 继承: 在定义一个新的类 B 时,如果该类与某个已有的类 A 相似(指的是 B 拥有 A 的全部特 ...

  4. pyhton机器学习入门基础(机器学习与决策树)

    //2019.07.26#scikit-learn数据挖掘工具包1.Scikit learn是基于python的数据挖掘和机器学习的工具包,方便实现数据的数据分析与高级操作,是数据分析里面非常重要的工 ...

  5. selenium 启动、窗口、获取标题

    1. from selenium import webdriver #启动chrom浏览器,没写executable_path,这是因为配置环境时,已经将chromdriver放到python安装文件 ...

  6. zabbix监控memcached服务

    zabbix监控memcached服务 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装并配置memcached服务 1>.使用yum方式安装memcached [ro ...

  7. TCP为什么三次握手四次挥手

    TCP概述: 它提供面向连接的服务,在传送数据之前必须先建立连接,数据传送完成后要释放连接.因此TCP是一种可靠的的运输服务,也正因为这样,不可避免的增加了许多额外的开销,比如确认,流量控制等.对应的 ...

  8. 数据结构 c++ 广义表

    // CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...

  9. Docker + Maven + Docker-compose

    前言: docker:容器化管理 maven:支持docker-maven的插件,通过 mvn clean -Dmaven.test.skip package dockerfile:build 打包命 ...

  10. Day5 - G - The Unique MST POJ - 1679

    Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spann ...