20200604——flink了解dataset开发

Data Source

data source 是什么呢,字面意思可以知道:数据来源
flink做为一个流式计算框架,可以用来批处理,也可以用来流处理。
批处理可以是静态的数据集,历史的数据集。
也可以用来做流处理,即实时的处理些实时数据流,实时产生数据流的结果,只要数据源源不断的传递过来,flink就可以一直计算下去,这个data source 就是数据的来源

flink 批处理的source常见有两大类
基于本地集合的source
基于文件的source

基于集合

20200604——flink了解dataset开发

基于文件

读取本地文件数据readtext
读取hdfs数据
读取csv文件数据
读取压缩文件
遍历目录

流程

获取执行环境
source加载数据
转化操作
输出
执行

转换 tranformation

map和mapPartition

将dataset中的每一个元素转换成另外一个元素

注意:map和mappartition效果是一样的。
但是在map的函数中,需要访问一些外部存储,访问mysql,需要打开链接,此时效率低。
mappatition减少连接数,提高效率

flatmap

将dataset中每一个元素转换成为另一个元素并压平为多个元素
将dataset中每一个元素转换成为0~n个元素

20200604——flink了解dataset开发
针对需要如果是数据变多的时候就要考虑是不是要进行flatmap操作

filter

filter函数在实际生产中特别实用,数据处理阶段可以过滤处理掉大部分不符合业务的内容,可以减轻大部分的压力

业务场景:过滤长度>4的单词

reduce

可以对一个dataset或者是一个group来进行聚合计算,最终聚合成一个元素
20200604——flink了解dataset开发

reduce聚合操作的算子
注意针对groupby之后的数据流我们可以使用reduce进行聚合,不用考虑按照哪种方式,reduce都可以实现,如果想要使用sum()进行聚合,前面分组指定key必须是按照索引才可以。

reducegroup

可以对一个dataset或者一个group来进行聚合计算,最终聚合成一个元素。
reduce和reducegruop的区别
reduce是数据将一个个拉去到另外一个节点,然后再执行计算
reducegroup是先在每个group所在的节点上执行计算,然后在拉去

20200604——flink了解dataset开发

aggregate

按照内置的方式进行聚合,aggergate只能作用于元组上,例如:sum/min/max

distinct

去重复的数据
20200604——flink了解dataset开发

join

使用join可以将两个dataset连接起来,返回想要关联结果

20200604——flink了解dataset开发

leftouterjoin/rightouterjoin/fulljoin

左外链接,左边的dataset中的每一个元素,去链接右边的元素

union

将两个dataset取并集,不会去重
20200604——flink了解dataset开发

rebalance

flink也有数据倾斜的时候,比如当前有数据量10亿的数据需要处理,在处理过程中可能会发生状况
20200604——flink了解dataset开发
出现了数据倾斜,其他三台机器执行完毕也要等待机器1执行完毕才算整体将任务执行完毕
所以在实际的工作中,出现这种情况比较好的的解决方案就是rebalance(内部使用round robin方法将数据均匀打散)随机轮询分发数据,保证每个分区数量大致均衡

data sink

基于集合

可以sink到标准输出,error输出,collect()到本地集合

基于文件

可以sink到本地文件,hdfs文件(支持多种文件的存储格式)

广播变量

flink支持广播变量,可以将数据广播到taskmanager上就可以提供taskmanager中的subtask/task去使用,数据存到内存中,这样可以减少大量的shuffle操作。

比如数据在join阶段,不可避免的就是大量的shuffle操作,我们可以把一个dataset广播出去,一直加载到taskmanager的内存中,可以直接在内存中拿数据,避免了大量的shuffle,导致集群性能下降。

20200604——flink了解dataset开发

注意点:
广播变量数据不应该太大
广播变量数据是不需要频繁更新的数据

累加器

accumulator即累加器,与mapreduce counter的应用场景不多,都能很好的观擦task在运行期间的数据变化

可以在flink job任务重的算子函数中操作累加器,但是只能在任务执行结束之后才能获取到的累加器的最终结果

flink现在有以下内置累加器,每个累加器都实现了accumulator接口
intcounter
longcounter
doublecounter

boardcast和accumulator的区别
boardcast广播变量允许程序员将一个只读的变量缓存缓存在每台机器上,而不用在任务之间传递变量。广播变量可以共享内存,但是不可以进行修改

accumulators(累加器)是可以在不同任务中对同一个变量进行累加操作

20200604——flink了解dataset开发