最新 Flink 1.13 简介(简介、历史、核心特性、WordCount体验)快速入门、详细教程

Flink 简介

文章目录

  • Flink 简介
    • 一、Flink简介
    • 二、Flink 的历史
    • 三、Flink 的核心特性
    • 四、Flink 与 Spark Streaming 的区别
    • 五、WordCount

下一章: Flink 1.13 部署

一、Flink简介

最新 Flink 1.13 简介(简介、历史、核心特性、WordCount体验)快速入门、详细教程_第1张图片

Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。并且 Flink 提供了数据分布、容错机制以及资源管理等核心功能。Flink提供了诸多高抽象层的API以便用户编写分布式任务:

  • DataSet API,对静态数据进行批处理操作,将静态数据抽象成分布式的数据集,用户可以方便地使用Flink提供的各种操作符对分布式数据集进行处理,支持Java、Scala和Python。
  • DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流,用户可以方便地对分布式数据流进行各种操作,支持Java和Scala。
  • Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过类SQL的DSL对关系表进行各种查询操作,支持Java和Scala。

此外,Flink 还针对特定的应用领域提供了领域库,例如: Flink ML,Flink 的机器学习库,提供了机器学习Pipelines API并实现了多种机器学习算法。 Gelly,Flink 的图计算库,提供了图计算的相关API及多种图计算算法实现。

二、Flink 的历史

  • Flink 起源于一个叫作 Stratosphere 的项目,它是由 3 所地处柏林的大学和欧洲其他一些大学在 2010~2014 年共同进行的研究项目,由柏林理工大学的教授沃克尔·马尔科(Volker Markl)领衔开发。
  • 2014 年 4 月,Stratosphere 的代码被复制并捐赠给了 Apache 软件基金会,Flink 就是在此基础上被重新设计出来的。
  • 2014 年 8 月,Flink 第一个版本 0.6 正式发布(至于 0.5 之前的版本,那就是在Stratosphere 名下的了)。与此同时 Fink 的几位核心开发者创办了 Data Artisans 公司,主要做 Fink 的商业应用,帮助企业部署大规模数据处理解决方案。
  • 2014 年 12 月,Flink 项目完成了孵化,一跃成为 Apache 软件基金会的顶级项目。
  • 2015 年 4 月,Flink 发布了里程碑式的重要版本 0.9.0,很多国内外大公司也正是从这时开始关注、并参与到 Flink 社区建设的。
  • 2019 年 1 月,长期对 Flink 投入研发的阿里巴巴,以 9000 万欧元的价格收购了 Data Artisans 公司;之后又将自己的内部版本 Blink 开源,继而与 8 月份发布的 Flink 1.9.0 版本进行了合并。自此之后,Flink 被越来越多的人所熟知,成为当前最火的新一代大数据处理框架。

三、Flink 的核心特性

  • 高吞吐和低延迟。每秒处理数百万个事件,毫秒级延迟。
  • 结果的准确性。Flink 提供了事件时间(event-time)和处理时间(processing-time)语义。对于乱序事件流,事件时间语义仍然能提供一致且准确的结果。
  • 精确一次(exactly-once)的状态一致性保证。
  • 可以连接到最常用的存储系统,如 Apache Kafka、Apache Cassandra、Elasticsearch、JDBC、Kinesis 和(分布式)文件系统,如 HDFS 和 S3。
  • 高可用。本身高可用的设置,加上与 K8s,YARN 和 Mesos 的紧密集成,再加上从故障中快速恢复和动态扩展任务的能力,Flink 能做到以极少的停机时间 7×24 全天候运行。
  • 能够更新应用程序代码并将作业(jobs)迁移到不同的 Flink 集群,而不会丢失应用程序的状态。

四、Flink 与 Spark Streaming 的区别

Flink 是标准的实时处理引擎,基于事件驱动。而 Spark Streaming 是微批(Micro-Batch)的模型。下面分几个方面介绍两个框架的主要区别:

  • 架构模型Spark Streaming 在运行时的主要角色包括:Master、Worker、Driver、Executor,Flink 在运行时主要包含:Jobmanager、Taskmanager和Slot。
  • 任务调度Spark Streaming 连续不断的生成微小的数据批次,构建有向无环图DAG,Spark Streaming 会依次创建 DStreamGraph、JobGenerator、JobScheduler。Flink 根据用户提交的代码生成 StreamGraph,经过优化生成 JobGraph,然后提交给 JobManager进行处理,JobManager 会根据 JobGraph 生成 ExecutionGraph,ExecutionGraph 是 Flink 调度最核心的数据结构,JobManager 根据 ExecutionGraph 对 Job 进行调度。
  • 时间机制Spark Streaming 支持的时间机制有限,只支持处理时间。 Flink 支持了流处理程序在时间上的三个定义:处理时间、事件时间、注入时间。同时也支持 watermark 机制来处理滞后数据。
  • 容错机制对于 Spark Streaming 任务,我们可以设置 checkpoint,然后假如发生故障并重启,我们可以从上次 checkpoint 之处恢复,但是这个行为只能使得数据不丢失,可能会重复处理,不能做到恰好一次处理语义。Flink 则使用两阶段提交协议来解决这个问题。

五、WordCount

  • 批处理方式

    // 1. 创建执行环境 
    ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
    // 2. 从文件读取数据  按行读取(存储的元素就是每行的文本) 
    DataSource<String> lineDS = env.readTextFile("input/words.txt"); 
    // 3. 转换数据格式 
    FlatMapOperator<String, Tuple2<String, Long>> wordAndOne = lineDS 
               .flatMap((String line, Collector<Tuple2<String, Long>> out) -> 
    				{String[] words = line.split(" ");                     
    				for (String word : words) {
                             out.collect(Tuple2.of(word, 1L));
                    } 
                 }) 
                 .returns(Types.TUPLE(Types.STRING, Types.LONG));  
    //当使用 Lambda 表达式用到 Java 泛型的时候, 由于泛型擦除的存在, 需要显示的声明类型信息 
    // 4. 按照 word 进行分组 
    UnsortedGrouping<Tuple2<String,Long>> wordAndOneUG = wordAndOne.groupBy(0); 
    // 5. 分组内聚合统计 
    AggregateOperator<Tuple2<String, Long>> sum = wordAndOneUG.sum(1); 
    // 6. 打印结果         
    sum.print(); 
    
  • 流处理方式

    // 1. 创建流式执行环境 
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); 
    // 2. 读取文件
    DataStreamSource<String> lineDSS = env.readTextFile("input/words.txt");
    // 3. 转换数据格式 
    SingleOutputStreamOperator<Tuple2<String, Long>> wordAndOne = lineDSS 
             .flatMap(
        		new FlatMapFunction<String, Tuple2<String, Long>>() {
                  @Override
                  public void flatMap(String s, Collector<Tuple2<String, Long>> collector) throws Exception {
                      String[] words = s.split(" ");
                      for (String word : words) {
                         collector.collect(Tuple2.of(word, 1L));
                      }
                  }
                }
    		  ) 
             .returns(Types.TUPLE(Types.STRING, Types.LONG)); 
    // 4. 分组 
    KeyedStream<Tuple2<String, Long>, String> wordAndOneKS = wordAndOne.keyBy(t -> t.f0); 
    // 5. 求和 
    SingleOutputStreamOperator<Tuple2<String, Long>> result = wordAndOneKS.sum(1);         
    // 6. 打印         
    result.print();         
    // 7. 执行         
    env.execute();
    

    下一章:Flink 1.13 部署

你可能感兴趣的:(Flink,教程,flink,sql,数据仓库,大数据)