Flink简介和开发总结

Flink简介

Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。核心是一个分布式、高性能、高可用、实时性的流式计算框架

Flink起源于Stratosphere项目, 2014年4月Stratosphere的代码被复制并捐赠给了Apache软件基金会, 2014年12月,Flink一跃成为Apache软件基金会的顶级项目。

Spark和Flink都是分布式计算引擎,但是,Spark 和 Flink 一开始都拥有着同一个梦想,他们都希望能够用同一个技术把流处理和批处理统一起来,但他们走了完全不一样的两条路前者是以批处理的技术为根本,并尝试在批处理之上支持流计算;后者则认为流计算技术是最基本的,在流计算的基础之上支持批处理。正因为这种架构上的不同,今后二者在能做的事情上会有一些细微的区别。比如在低延迟场景,Spark 基于微批处理的方式需要同步会有额外开销,因此无法在延迟上做到极致。在大数据处理的低延迟场景,Flink 已经有非常大的优势。

Spark和Flink的主要差别就在于计算模型不同。Spark采用了微批处理模型,而Flink采用了基于操作符的连续流模型。因此,对Apache Spark和Apache Flink的选择实际上变成了计算模型的选择,而这种选择需要在延迟、吞吐量和可靠性等多个方面进行权衡。

  • 批处理的特点是有界、持久、大量,非常适合需要访问全套记录才能完成的计算工作,一般用于需要长时间运行的离线统计。在Spark的世界观中,一切都是由批次组成的,离线数据是一个大批次,而实时数据是由一个一个无限的小批次组成的。
  • 流处理的特点是无界、实时, 无需针对整个数据集执行操作,而是对通过系统传输的每个数据项执行操作,一般用于延迟小的实时统计。在Flink的世界观中,一切都是由流组成的,离线数据是有界限的流,实时数据是一个没有界限的流,
  • 无界数据流:无界数据流有开始但是没有结束,必须在获取流数据后立即处理。对于无界数据流我们无法等待所有数据都到达,因为输入是无界的,并且在任何时间点都不会完成。处理无界数据通常要求以特定顺序(例如事件发生的顺序)获取数据,以便能够推断结果完整性。
  • 有界数据流:有界数据流有明确定义的开始和结束,可以在执行任何计算之前通过获取指定范围内所有数据来处理有界流,处理有界流不需要有序获取,因为可以对在指定范围内的有界数据集进行排序后再处理,有界流的处理也称为批处理。

一、优势:

  • 目前唯一同时支持高吞吐、低延迟、高性能的分布式流式数据处理框架
  • 支持事件事件概念
  • 支持有状态计算,保持了事件原本产生的时序性,避免网络传输带来的影响
  • 支持高度灵活的窗口操作,Flink将窗口分为Time、Count、Session以及Data-driven等类型的窗口操作,可以灵活的处罚条件定制化来达到对复杂的流传输模式的支持。
  • 基于轻量级分布式快照实现容错,大型计算任务的流程拆解成小的计算过程,task分布到并行节点上处理。基于分布式快照技术的Checkpoints,将执行过程中的状态信息进行持久化存储,可以自动恢复出现异常的任务。
  • 基于JVM实现独立的内存管理

二、应用场景

  • 实时智能推荐
  • 复杂事件处理
  • 实时欺诈检测
  • 实时数仓与ETL
  • 流数据分析
  • 实时报表分析

Flink开发总结为四大步骤

一、环境Environment

1. 批处理环境:

​ ExecutionEnvironment

2. 流式数据处理环境:

StreamExecutionEnvironment 有界流 $ 无界流

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//在当前测试环境下,如果没有设置并行度,会默认采用系统CPU的虚拟核数(4)
env.setParallelism(1);
//执行
env.execute();

二、Souce(数据源)

流数据源:

//生产环境使用的比较多,有专门的数据源对象Properties
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", 127.0.0.19092);
properties.setProperty("group.id", "consumer-group");
properties.setProperty("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
properties.setProperty("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
properties.setProperty("auto.offset.reset", "latest");

//生产环境中,一般用flink消费Kafka中的数据,完成实时数据计算
FlinkKafkaConsumer<Tuple2<String, String>> consumer = new FlinkKafkaConsumer<>(
  "kafkaTopic", 
  new new SimpleStringSchema(), 
  properties
);

//将Kafka数据源绑定到flink中
DataStream stream = env.addSource(consumer);

//打印输出控制台
stream.print();

三、Transform(转换算子 => 封装逻辑的方法)

Flink中可以将一个数据流转换为其他的数据流,转换过程中,数据流的类型也会发生变化,那么到底Flink支持什么样的数据类型呢,其实我们常用的数据类型,Flink都是支持的。比如:Long, String, Integer, Int, 元组,样例类,List, Map等。

四、Sink

Sink有下沉的意思,在Flink中所谓的Sink其实可以表示为将数据存储起来的意思,也可以将范围扩大,表示将处理完的数据发送到指定的存储系统的输出操作

之前我们一直在使用的print方法其实就是一种Sink

咱们可以将处理完的数据发送到Kafka消息队列中

  1. 添加Kafka依赖关系

    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-connector-kafka_${scala.binary.version}</artifactId>
        <version>${flink.version}</version>
    </dependency>
    
  2. 主函数中添加sink:

FlinkKafkaProducer sink = new FlinkKafkaProducer<>("zpytest1", new SimpleStringSchema(), properties);
stream.addSink(sink);
  1. 通过kafka消费者控制台查看:
bin/kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic flink-test

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>