没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
1.入门概念
1.1 核心特点
按照老中少三代来区分大数据框架,老一代为 处理流式数据的 storm,中一带为 处理批式
数据的 hadoop、spark(微批为流),少一代为 本文章描述的 flink,自从阿里接管 flink 的
开源后,今天的 flink 已经已经十分强大,兼有 批流一体、高容错、高吞吐低延迟、大规模
计算、多平台部署等核心特点
Flink:实时流处理,支持低延迟、高吞吐、exactly-once 语义、有状态的计算、基于事件时
间的处理
1.1.1 批流数据
传统的大数据理解中,数据源源不断的产生,没有终止,同时也积累的许多。针对
以上,源源不断的来的即为流式数据(无界数据),积累的一批为批式数据(有界数据)。
批数据除了是已经产生的数据,还可以由流式数据作一定规则的细分截取产生。具体的的应
用 应视情况而定,可以针对流式数据作聚合操作,也可以等攒齐了 一次性操作。Flink 同
时支持对流式数据操作和批示数据操作,且强于以上框架。
1.1.2 容错能力
Flink 容错能力主要有三种:依赖于集群管理、依赖于协调组件、依赖于自身快照
机制
一:集群管理
Flink 支持多平台部署,其中 k8s 之类的容器集群管理平台本身自带当进程挂掉时,
重启新进程接管工作的功能。
二:协调组件
Flink 可通过相应配置开启 HA 模式,依赖于 Zookeeper 的分布式协调服务。
三:快照机制
Flink 通过设计检查点和状态存储,来保证重启后可接着上次断点后继续工作。
1.1.3 高吞吐低延迟
Flink 除了在计算、传输、序列化做了优化外,得益于本身的快照机制,不依赖会
产生阻塞的调度,从而可以持续处理数据
1.1.4 大规模复杂计算
计算方面也得益于 flink 本身的容错机制和状态存储设置,可以使 flink 已聚合的方
式逐批处理数据,并聚合保存之前和现有的状态 于本地内存中(数据是否共享有待研究,
个人觉得是共享的 ),如此一来可以极大的降低大数据的调度】管理等
1.1.5 多平台部署
和其他常见组件或应用一样,flink 支持 容器化部署、云部署等
1.1.6 Flink 基本架构:
Flink 基本架构:
Flink 主要有两类进程: JobManager 和 TaskManager
JobManager(masters): 协调分布式计算、任务调度,协调 checkpoints,错误调度等,相当
于一个指挥官吧
(实际部署时,至少需要一个 JobManager,实际生产环境部署时都会做 HA,部署多个
JobManager;这个时候,只有一个 leader,其他都是 standby 模式)。
TaskManager(workers):真正执行 dataflow 的,并对 streams 进行缓存和交换。
总的来说,运行中的 Flink 集群至少有一个 JobManager 进程和一个 TaskManager 进程。
如果将客户端也算进去的话,那么还有一个 Client 进程。
一个简单的流程就是,Client 提交任务作业给 JobManager ,JobManager 负责该作业的调
度和资源分配(在 Flink 集群中,计算资源被定义为 Task Slot。每个 TaskManager 会拥有
一个或多个 Slots),
随后将作业分给对应的 TaskManager,TaskManager 收到任务后,启动线程去执行,并向
JobManager 报告任务状态和自身运行状态等。
当任务结束后, JobManager 将收到通知,并统计数据后发送给 Client。
Flink 处理数据流的时候,一般遵循如下模型:
构建 Flink 程序最基本的模块就是数据流和算子( transformations ),数据流就是永不终止的
数据记录,而算子将数据流作为输入,进行特定操作后,再产生新的流数据。
通常,其处理流程为 Source -> Transformations -> Sink . 其数据流构成一个有向无环图
(DAG)。
Source 为待处理数据的输入地,而 Sink 为处理后的输出地
2.API 介绍
2.1 API 层次
(1)最下层,为有状态流式编程,它提供了 ProcessFunctionAPI。flink 在这个底层 api 上帮
我们实现了最基础的流式处理能力,我们可以在上门进行有状态编程,并且我们可以自定义
定时器,可以实现复杂的时间语义处理。
(2)core api 层,flink 提供了 DataStreamAPI 和 DataSetAPI(逐步被舍弃)。这两个 API 提
供了数据处理的基本操作:各种数据转化,分组,开窗,状态编程等等。
(3)Table API 是基于表的声明式 dsl。它与 DataStream 区别主要在以下几个方面:遵循关
系型数据模型,自带 schema,提供了类 sql 操作,如 select,project,join,group-by 等等。
(4)flink 提供的最高层 api 是 flink-sql。它的抽象层次与 Table API 类似,但是允许用户直接
写 sql 便可以执行 job。
这四层关系很好理解,上层是下层的通用性封装,若不满足个性化需求场景,可自己根据下
层 api 自定义开发,但最低为状态流的处理。
2.1.1 DataStream 体系 DataSet/Stream API
(1)DataStream: 其为 Flink 数据流的 核心抽象,其上定义了对数据流的 一系列操作,
同 时 也 定 义 了 与 其 他 类 型 DataStream 的 相 互 转 化 关 系 。 每 个 DataStream 都 有 一 个
transformation 对象,表示该 DataStream 从上游的 DataStream 使用该 Transformation 而来。
(2)SingleOutputStreamOperator:旁路输出,主要用来看过程信息
(3)KeyedStream:其用来表示根据指定的 key(针对某个值)进行分组的数据流。
(4)SplitStream:其用来将流根据标记(针对,讴歌属性)划分成多个流,再通过 select()
获取指定(值)的流
(5)DataStreamSource:其为 DataStream 的起点,由环境对象的
StreamExcutionEnvironment.addSource(SourceFunction)创建而来,其中的 SourceFunction 定
义了从数据源获取数据的具体逻辑
(6)IterativeStream:迭代流,Flink 的 Datastream 正常情况下是不会结束的,所以也没有所
谓的最大迭代次数。这种情况下,你需要自己指定哪个类型的数据需要回流去继续迭代,哪
个类型的数据继续向下传输,这个分流的方式有两种:split 和 filter。
(7)BroadcastConnectedStream && BroadcastStream: BroadcastStreams 实际上是对一个普通
的 DataStream 的封装,提供里广播行为;BroadcastConnectedStream 则是 BroadcastStreams
与 DataStream 链接而来。
(8)QueryableStateStream:类似于一个接收器,无法进行进一步转换, 接收传入的数据(内
部或者外部)并更新状态
(9)AllWindowedStream&&WindowedStream: WindowedStream 代表了根据 key 分组且基于
WindowAssigner 切分窗口 的 数 据 流 。 所 以 Windowed 都 是 KeyedStream 衍 生而来,在
WindowedStream 进行的任何转化也都将转会变为 DataStream
(10)JoinedStreams&& CoGroupedStreams:join 是 COGroup 的一种特例,JoinedStreams 底层
使用的 COGroupStreams 来实现。CoGroup 侧重于 Group, 对数据进行分组,是对同一个 key
上的两组集合进行操作,而 join 侧重的是数据对,对同一个 key 上的每一对元素进行操作。
CoGroup 更通用,单 join 比较常见。
(11)ConnectedStreams:其表示两个数据流的组合,数据流类型可以不一样。整合后的数据
流共享 state。一种典型的场景就是两个流中一种是业务流,一种是规则流,业务流根据规
则流来对数据进行处理。
(12)AsyncDataStream:是一个工具,提供在 DataStream 上使用异步函数的能力
(13)DataStreamSink:由 DataStream。addSink(SinkFunction)创建而来,其中 SinkFunction 定
义了写出数据到外部存储的具体逻辑。
2.2 Environment
2.2.1 getExecutionEnvironment
创建一个执行环境,表示当前执行程序的上下文。 如果程序是独立调用的,则此方法返回
本地执行环境;如果从命令行客户端调用程序以提交到集群,则此方法返回此集群的执行环
境,也就是说,getExecutionEnvironment 会根据查询运行的方式决定返回什么样的运行环境,
是最常用的一种创建执行环境的方式。
如果没有设置并行度,会以 flink-conf.yaml 中的配置为准,默认是 1
2.3 数据读取(Source)
这是 flink 流计算的起点, 第一个 DataStream 由此产生,主要有四种方式:内存读取、文
件读取、socket 读取、自定义
2.3.1 基于本地集合的 source
在一个本地内存中,生成一个集合作为 Flink 处理的 source。
离线处理代码如下:
实时处理代码如下:
// 初始化环境
val env: ExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment
val env = StreamExecutionEnvironment.getExecutionEnvironment
import org.apache.flink.api.scala.ExecutionEnvironment
import org.apache.flink.api.scala._
object ListSource {
def main(args: Array[String]): Unit = {
val env = ExecutionEnvironment.getExecutionEnvironment
val listDataSet: DataSet[String] = env.fromCollection(List("hadoop spark","hive
hbase"))
listDataSet.print()
}
}
剩余30页未读,继续阅读
小东子李
- 粉丝: 48
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0