美文网首页
Flink计算框架

Flink计算框架

作者: 乔一波一 | 来源:发表于2019-04-05 14:48 被阅读0次

Flink是什么

Flink使用java语言开发的计算框架,提供了scala编程的接口。使用java或者scala开发Flink是需要使用jdk8版本,如果使用Maven,maven版本需要使用3.0.4及以上。

flink中的数据处理过程官网称为:Dataflows;

flink Streaming Dataflow

Flink架构

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:

批处理wordcount

执行结果会在指定sink路径下生成四个文件,为什么?

因为不指定分区书的话,默认跟本地机器的核数一置,我这里是四核的所以就是四个文件夹;

流处理wordcount:

流处理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.

代码示例 运行结果

相关文章

网友评论

      本文标题:Flink计算框架

      本文链接:https://www.haomeiwen.com/subject/jghciqtx.html