首页  

Flink核心技术要点     所属分类 flink 浏览量 784
数据流 分布式计算 
数据分布 数据通信以及容错机制等

DataSet API    对静态数据进行批处理,静态数据抽象成分布式数据集
DataStream API 对数据流进行流处理 流式数据抽象成分布式数据流
Table API      对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过类SQL的DSL对关系表进行各种查询操作
Flink ML       机器学习Pipelines API
Gelly          图计算库

读取 HDFS或HBase中的静态数据
以Kafka作为流式的数据源
通过YARN申请集群资源

统一的批处理与流处理系统

Flink基于分布式快照与可部分重发的数据源实现容错
可自定义对整个Job进行快照的时间间隔,当任务失败时,将整个Job恢复到最近一次快照,并从数据源重发快照之后的数据
Flink的分布式快照实现借鉴了Chandy和Lamport在1985年发表的一篇关于分布式快照的论文 
按照用户自定义的分布式快照间隔时间,定时在所有数据源中插入一种特殊的快照标记消息,
这些快照标记消息和其他消息一样在DAG中流动,但是不会被用户定义的业务逻辑所处理,
每一个快照标记消息都将其所在的数据流分成两部分 本次快照数据和下次快照数据


Flink 分布式快照 容错机制优点
低延迟 高吞吐量 与业务逻辑的隔离 错误恢复代价低


flink 流处理的时间窗口
聚合或连接 流入消息分段 消息的分段即为窗口 最常见的就是时间窗口
3种类型的时间窗口 OperatorTime EventTime IngressTime
Flink 借鉴 Google MillWheel 项目,通过 WaterMark 来支持基于 Event Time 的时间窗口

消息乱序
WaterMark包含一个时间戳,Flink使用WaterMark标记所有小于该时间戳的消息都已流入,生成WaterMark,插入到消息中,
按照时间窗口缓存所有流入的消息,遇到WaterMark时,对所有小于该WaterMark时间戳的时间窗口数据进行处理并发送到下一个节点
对于聚合类操作,可提前进行聚合操作 , 只需缓存中间计算结果 , 降低内存消耗

由于消息的乱序以及前面节点处理效率的不同,会有某些消息流入时间大于其本身的时间戳,
真实WaterMark时间戳与理想情况下WaterMark时间戳的差别称为 时钟偏移 Time Skew

Time Skew决定了该WaterMark与上一个WaterMark之间的时间窗口所有数据需要缓存的时间,
Time Skew时间越长,该时间窗口数据的延迟越长,占用内存的时间也越长,同时会对流处理系统的吞吐量产生负面影响。

基于WaterMark,基于时间戳的全局排序
WaterMark保证了在其之后不会出现时间戳比它小的消息,可保证排序的正确性



定制的内存管理
Java对象的存储密度相对偏低
TB级内存 , GC效率
OutOfMemoryError
Java对象大小 计算 ,没有官方工具 ,第三方工具类库无法准确计算

定制的序列化工具  
序列化二进制存储
显式的内存管理 批量申请和释放内存,每个JVM实例有一个统一的内存管理器

缓存友好的数据结构和算法
对于计算密集的数据结构和算法,直接操作序列化后的二进制数据,而不是将对象反序列化后再进行操作

以排序为例,由于排序的主要操作是对Key进行对比
将所有排序数据的Key与Value分开 ,并对Key连续存储,那么访问Key时的Cache命中率会大大提高 

on heap或off-heap

内存分为3个部分

Network buffers
一些以32KB Byte数组为单位的buffer,主要用于数据的网络传输
Memory Manager pool
大量以32KB Byte数组为单位的内存池,所有的运行时算法(例如Sort/Shuffle/Join)都从这个内存池申请内存,并将序列化后的数据存储其中,结束后释放回内存池。

Remaining (Free) Heap
主要留给UDF中用户自己创建的Java对象,由JVM管理

内存池由多个MemorySegment组成
每个MemorySegment代表一块连续的内存,底层是byte[],默认32KB


二进制存储 提高了存储密度,节省存储空间
所有的运行时数据结构和算法只能通过内存池申请内存,保证了其使用的内存大小是固定的,不会因为运行时数据结构和算法而发生OOM
内存池虽然占据了大部分内存,但其中的MemorySegment容量较大(默认32KB),所以内存池中的Java对象其实很少,而且一直被内存池引用,所有在垃圾回收时很快进入持久代,大大减轻了JVM垃圾回收的压力
Remaining Heap的内存虽然由JVM管理,但是由于其主要用来存储用户处理的流式数据,生命周期非常短,速度很快的Minor GC就会全部回收掉,一般不会触发Full GC

定制的序列化工具  二进制存储 提高存储密度
设计数据结构和算法时尽量连续存储,减少内存碎片化对Cache命中率的影响

排序算法
key value 分开存储 
Key 连续存储  操作数据最小化,提高Cache命中率
移动数据时,只需移动Key+Pointer,无须移动数据本身,减少内存拷贝的数据量
TypeComparator 直接基于二进制比较

上一篇     下一篇
sparkSQL和presto比较

SparkSQL join的三种实现方式

Spark知识点小结

spark map和mapPartitions

spark map算子各种写法

idea maven 项目 scala代码 不会自动编译