Flink是什么
Flink使用java语言开发的计算框架,提供了scala编程的接口。使用java或者scala开发Flink是需要使用jdk8版本,如果使用Maven,maven版本需要使用3.0.4及以上。
flink中的数据处理过程官网称为:Dataflows;

Flink架构

Flink运行时包含两种类型的进程:
1. JobManger:也叫作masters,协调分布式执行,调度task,协调checkpoint,协调故障恢复。(相当于Spark中Driver和master)在Flink程序中至少有一个JobManager,高可用可以设置多个JobManager,其中一个是Leader,其他都是standby状态。
2. TaskManager:也叫workers,执行dataflow生成的task,负责缓冲数据,及TaskManager之间的交换数据。Flink程序中必须有一个TaskManager.
Flink程序可以运行在standalone集群,Yarn或者Mesos资源调度框架中。
clients不是Flink程序运行时的一部分,作用是向JobManage准备和发送dataflow,之后,客户端可以断开连接或者保持连接。
TaskSlots 任务槽:
每个Worker(TaskManager)是一个JVM进程,可以执行一个或者多个task,这些task可以运行在任务槽上,每个worker上至少有一个任务槽。每个任务槽都有固定的资源,例如:TaskManager有三个TaskSlots,那么每个TaskSlot会将TaskMananger中的内存均分,即每个任务槽的内存是总内存的1/3。任务槽的作用就是分离任务的托管内存,不会发生cpu隔离。
通过调整任务槽的数据量,用户可以指定每个TaskManager有多少任务槽,更多的任务槽意味着更多的task可以共享同一个JVM,同一个JVM中的task共享TCP连接和心跳信息,共享数据集和数据结构,从而减少TaskManager中的task开销。
总结:task slot的个数代表TaskManager可以并行执行的task数。
Flink既然是计算框架,肯定也分批处理和流式处理
flink数据源分为有界和无界之分,有界数据源可以编写批处理程序,无界数据源可以编写流式程序。DataSet API用于批处理,DataStream API用于流式处理。
批处理使用ExecutionEnvironment和DataSet,流式处理使用StreamingExecutionEnvironment和DataStream。
DataSet和DataStream是Flink中表示数据的特殊类,DataSet处理的数据是有界的,DataStream处理的数据是无界的,这两个类都是不可变的,一旦创建出来就无法添加或者删除数据元。
Flink程序的执行过程:
1. 获取flink的执行环境(execution environment)
2. 加载数据-- soure
3. 对加载的数据进行转换 -- transformation
4. 对结果进行保存或者打印 --sink
5. 触发flink程序的执行(execute(),count(),collect(),print()),例如:调用ExecutionEnvironment或者StreamExecutionEnvironment的execute()方法。
批处理wordcount:

执行结果会在指定sink路径下生成四个文件,为什么?
因为不指定分区书的话,默认跟本地机器的核数一置,我这里是四核的所以就是四个文件夹;
流处理wordcount:

结果如下;

指定key的三种方式
在Flink中数据模型不是基于Key,Value格式处理的,因此不需将数据处理成键值对的格式,key是“虚拟的”,可以人为的来指定,比如某些算子(join,coGroup,keyBy,group B y)要求在数据元上定义key。另外有些算子操作如以下算子:(reduce,groupReduce,Aggregate,Windows)允许数据在处理之前根据key进行分组。实际数据处理过程中根据指定的key来对数据进行分组,批处理DataSet中使用groupBy来指定key,流处理DataStream中使用keyBy来指定key。
第一种. 使用Tuples来指定key:
定义元组来指定key可以指定tuple中的第几个元素当做key,或者指定tuple中的联合元素当做key。需要使用org.apache.flink.api.java.tuple.TupleXX包下的tuple,最多支持25个元素且Tuple必须new创建。如果Tuple是嵌套的格式,例如:DataStream<Tuple3<Tuple2<Integer, Float>,String,Long>> ds,如果指定keyBy(0)则会使用整个内部的Tuple2作为key。如果想要使用内部Tuple2中的Float格式当做key,就要使用第二种方式 Field Expression来指定key。
示例代码如下:


第二种.使用Field Expression来指定key
可以使用Field Expression来指定key,一般作用的对象可以是类对象,或者嵌套的Tuple格式的数据。
注意:a) 对于类对象可以使用类中的字段来指定key。
b) 对于嵌套的Tuple类型的Tuple数据可以使用”xx.f0”表示嵌套tuple中第一个元素,也可以直接使用”xx.0”来表示第一个元素,参照案例GroupByUseFieldExpressions。
代码示例:


第三种. 使用Key Selector Functions来指定key
使用key Selector这种方式选择key,非常方便,可以从数据类型中指定想要的key.


网友评论