flink初始

flink是什么

flink是一个用于有界和无界数据流进行有状态的计算框架。

flink提供了不同级别的抽象来开发流和批处理应用程序。

  • 最底层是Stateful Stream processing,只提供有状态流它 通过Process Function嵌入到DataStream API中。它允许用户自由处理来自一个或多个流的事件,并使用一致的容错状态。此外,用户可以注册事件时间和处理时间回调,允许程序实现复杂的计算。
  • DataSet /DataStream,大部分都是根据DataStream API(有界/无界流)和DataSet API (有界数据集)进行编程。这些用于数据处理,提供用户的各种形式的转换,连接,聚合,窗口,状态等。
  • Table API,该API提供了类似sql处理的方式,后续优化并转化成DataSet或者是DataStream进行操作表结构的数据源。
  • SQL, Flink提供的最高级抽象是SQL。这种抽象在语义和表达方面类似于Table API,但是将程序表示为SQL查询表达式。在SQL抽象与表API紧密地相互作用,和SQL查询可以通过定义表来执行表API

为什么使用Flink

  • 提供准确的结果,即使在无序或延迟数据的情况下也是如此
  • 具有状态和容错能力,可以在保持应用状态的同时无故障地从故障中恢复
  • 大规模执行,在数千个节点上运行,具有非常好的吞吐量和延迟特性

flink的基础概念

  • 程序与数据流,Flink程序基本构建块是流和转换,Flink程序都是由一个或者多个数据源开始,以一个或多个接收器结束。而中间是大量的数据转换。
  • 并行数据流。Flink中执行的程序每一个占用一个JVM,其中每一个任务占用一个线程。其中数据源source,数据映射map是一对一的,即保留数据最开始产生的顺序,keyBy/windown/apply是数据的重新分配,即这个时候数据会被分配不同的线程中处理。
  • 视窗,数据流式一个无止境的,因此flink的聚合是有限的,以窗口为限,如每分钟中流入的数据的总和,窗口就是每一分钟,可以连续。窗口可以分为三种,翻滚窗口(无重叠),滑动窗口(有重叠),会话窗口(无重叠,由不活动间隙打断,即无数据时,窗口结束,活跃时窗口打开)
  • 时间。数据可以引入不同的时间,如事件时间即数据产生时的时间戳,获取事件的时间,处理时间的时间,这三个时间特征在使用时特别有用,如flink流入的数据并不保证数据是按照数据的产生顺序流入,在处理过程时可能造成数据的混乱,在flink的机制中,可以根据数据产生的时间戳缓存一定的数据,并在特定顺序内,数据是有序的。
  • 容错检查点,Flink使用流重放和检查组合实现容错。检查点与每个输入流中的特定点以及每个操作符的对应状态相关。通过恢复运算符的状态并从检查点重放事件,可以从检查点恢复流数据流,同时保持一致性。
  • 流的批处理,flink执行的批处理程序作为流程序的特殊情况,其中流式有界的,而批处理有这些特点。批处理程序的容错不使用检查点,而使用完全重放流来恢复;DataSet API中的有状态操作使用简化的内存/核外数据结构,而不是键/值索引;DataSet API引入了特殊的同步(超级步骤)迭代,这些迭代只能在有界流上进行。

flink剖析

Flink程序看起来像是转换数据集合的常规程序。每个程序包含相同的基本部分

  • 获取一个execution environment
  • 加载/创建数据源
  • 数据的转化
  • 数据存储,指定接收器
  • 触发并执行

获取execution environment

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); flink需要获取执行的上下文,是flink程序执行的基础。

加载创建数据源

flink的数据源的来源很丰富,文件,hadoop,kafka等都可以作为数据的来源,如DataStream<String> text = env.readTextFile("file:///path/to/file"); 从文件中获取流,而后就可以进行对流操作。

flink提供的操作如下:

  • readTextFile(path)- TextInputFormat逐行读取文本文件,即符合规范的文件,并将它们作为字符串返回。
  • readFile(fileInputFormat, path) - 按指定的文件输入格式指定读取(一次)文件。
  • readFile(fileInputFormat, path, watchType, interval, pathFilter, typeInfo) - 这是前两个内部调用的方法。它path根据给定的内容读取文件fileInputFormat。根据提供的内容watchType,此源可以定期监视(每intervalms)新数据(FileProcessingMode.PROCESS_CONTINUOUSLY)的路径,或者处理当前在路径中的数据并退出(FileProcessingMode.PROCESS_ONCE)。使用该pathFilter,用户可以进一步排除正在处理的文件。
  • socketTextStream - 从套接字读取。元素可以用分隔符分隔
  • fromCollection(Collection) - 从Java Java.util.Collection创建数据流。集合中的所有元素必须属于同一类型
  • fromCollection(Iterator, Class) - 从迭代器创建数据流。该类指定迭代器返回的元素的数据类型。
  • fromElements(T ...) - 从给定的对象序列创建数据流。所有对象必须属于同一类型
  • fromParallelCollection(SplittableIterator, Class) - 并行地从迭代器创建数据流。该类指定迭代器返回的元素的数据类型。
  • generateSequence(from, to) - 并行生成给定间隔中的数字序列
  • addSource 自定义数据来源,例如kafka的数据来源就需要调用次方法,addSource(new FlinkKafkaConsumer08<>(...));

数据的转化

数据的转化会根据不同的API进行操作,一下仅列举DataStream部分的转换。

  1. map 映射 数据流向DataStream → DataStream,一对一的,一个元素转化为另一个元素。
DataStream<Integer> dataStream = //...
dataStream.map(new MapFunction<Integer, Integer>() {
@Override
public Integer map(Integer value) throws Exception {
return 2 * value;
}
});
  1. FlatMap, 映射 数据流向DataStream → DataStream ,一对多即将一个元素转化零个,一个或多个
dataStream.flatMap(new FlatMapFunction<String, String>() {
@Override
public void flatMap(String value, Collector<String> out)
throws Exception {
for(String word: value.split(" ")){
out.collect(word);
}
}
});
  1. filter 过滤 数据流向DataStream→DataStream ,过滤出自己需要数据
dataStream.filter(new FilterFunction<Integer>() {
@Override
public boolean filter(Integer value) throws Exception {
return value != 0;
}
});
  1. KeyBy 数据流向DataStream → KeyedStream 分组或者是数据重新分配,相同的键(相同的秘钥)分表相同的分区中。与window组合使用时,keyby分区的数据在某一时刻的聚合

    dataStream.keyBy("someKey") //dataStream中元素以POJO组成

    dataStream.keyBy(0) //dataStream中元素以Tuple元素组中

    也可以可以调用选择器自己调用
dataStream.keyBy(new KeySelector<WikipediaEditEvent, String>() {
@Override
public String getKey(WikipediaEditEvent event) {
return event.getUser();
}
} )

数据接收器

数据接收器,数据接收器可以从数据源中,也可以到数据源中,即源的操作也可以当做数据的接收器,用于存储,从流入flink的数据也可以流入到kafka中,

  • print(); 用户数据的打印
  • writeAsText(String path) 数据输入到执行文件中
  • addSource 自定义数据接收器

执行程序

一旦您指定的完整程序,你需要触发执行程序调用 execute()上StreamExecutionEnvironment。根据执行的类型,ExecutionEnvironment将在本地计算机上触发执行或提交程序以在群集上执行。

该execute()方法返回一个JobExecutionResult,包含执行时间和累加器结果。

程序的执行并不是从main方法开始,而是任务从调用execute开发,而前面的数据源,数据转化,都在不同的线程中执行,而后调用execute执行。

实例

一个简单的程序来描述Flink的整个过程

  1. 引入pom.xml
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-wikiedits_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
</dependencies>
  1. 程序
public static void main(String[] args) throws Exception {

    StreamExecutionEnvironment see = StreamExecutionEnvironment.getExecutionEnvironment(); //获取执行环境

    DataStream<WikipediaEditEvent> edits = see.addSource(new WikipediaEditsSource());//添加数据源

    KeyedStream<WikipediaEditEvent, String> keyedEdits = edits
.keyBy(new KeySelector<WikipediaEditEvent, String>() {//获取不同秘钥的数据
@Override
public String getKey(WikipediaEditEvent event) {
return event.getUser();
}
}); DataStream<Tuple2<String, Long>> result = keyedEdits
.timeWindow(Time.seconds(5))
.fold(new Tuple2<>("", 0L), new FoldFunction<WikipediaEditEvent, Tuple2<String, Long>>() {
@Override
public Tuple2<String, Long> fold(Tuple2<String, Long> acc, WikipediaEditEvent event) {
acc.f0 = event.getUser();
acc.f1 += event.getByteDiff();
return acc;
}
}); result.print();//数据打印,用于数据调试 see.execute();//程序执行
}

Flink初始的更多相关文章

  1. Flink - Checkpoint

    Flink在流上最大的特点,就是引入全局snapshot,   CheckpointCoordinator 做snapshot的核心组件为, CheckpointCoordinator /** * T ...

  2. Flink DataStream API Programming Guide

    Example Program The following program is a complete, working example of streaming window word count ...

  3. Flink Program Guide (6) -- 窗口 (DataStream API编程指导 -- For Java)

    窗口(Window) 本文翻译自文档Windows ----------------------------------- Flink使用窗口的概念,根据element的时间戳或者其他指标,将可能无限 ...

  4. Flink Program Guide (2) -- 综述 (DataStream API编程指导 -- For Java)

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  5. Flink Program Guide (1) -- 基本API概念(Basic API Concepts -- For Java)

    false false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {mso-style-n ...

  6. Flink从入门到放弃(入门篇2)-本地环境搭建&构建第一个Flink应用

    戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...

  7. Flink从入门到放弃(入门篇3)-DataSetAPI

    戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...

  8. Flink 的Window 操作(基于flink 1.3描述)

    Window是无限数据流处理的核心,Window将一个无限的stream拆分成有限大小的”buckets”桶,我们可以在这些桶上做计算操作.本文主要聚焦于在Flink中如何进行窗口操作,以及程序员如何 ...

  9. Apache Flink:特性、概念、组件栈、架构及原理分析

     2016-04-30 22:24:39    Yanjun Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时(Flink Runtim ...

随机推荐

  1. 使用 log4j 打印日志

    开发阶段:发现程序的问题,排错 产品阶段:记录程序运行的状况 Maven中配置依赖 通过配置文件输出日志的格式,输送的位置等 一.入门实例 1.新建一个JAva工程,导入包log4j-1.2.17.j ...

  2. 在一般处理程序里面读写session

    1.引用命名空间 using System.Web.SessionState; 2.继承IRequiresSessionState接口 3.利用httpcontext类读写即可 context.ses ...

  3. WPF自定义进度条

    <!--进度条 4812--> <LinearGradientBrush x:Key="ProgressBarIndicatorAnimatedFill" Sta ...

  4. 【12c OCP】最新CUUG OCP-071考试题库(52题)

    52.(12-11) choose the best answer: Examine the structure and data in the PRICE_LIST table: You plan ...

  5. “全栈2019”Java异常第十三章:访问异常堆栈跟踪信息

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  6. javassist学习

    最近学习了javassist的使用方法. javassist是一个字节码类库,可以用他来动态生成类,动态修改类等等. 下面是如果用javassist来动态创建一个类的demol 我们需要创建的目标类, ...

  7. [转] Foobar2000 DSP音效外挂元件-Part4

    [转] Foobar2000 DSP音效外挂元件-Part4 在第1部分的文章里主要介绍了foobar2000预设的DSP音效调整,这些则示要介绍几个比较会用到的DSP外挂元件,在foobar2000 ...

  8. [实战] 给现有的NGINX二进制RPM包加新模块

    [实战] 给现有的NGINX二进制RPM包加新模块 一.前言 在做 wiki 的镜像,这样以后文章就可以使用外链了(链接直接跳转墙内小站). 遇到的问题就是:我的 NGINX 包安装的时候图方便采用 ...

  9. 实例的初始化由JVM装载类的时候进行,保证了线程的安全性

    在23种设计模式中,单例是最简单的设计模式,但是也是很常用的设计模式.从单例的五种实现方式中我们可以看到程序员对性能的不懈追求.下面我将分析单例的五种实现方式的优缺点,并对其在多线程环境下的性能进行测 ...

  10. VS中工程的“依赖”,“库目录”,“包含目录”

    写多了Vs中的工程,就会遇到很多环境配置问题,例如“依赖项”,“库目录”,“包含目录”等等等等. 今天要记录的就是这些的基本含义:我们拿一个例子来看,更加清晰易懂一些: 例如在Opencv3.0+VS ...