Data Source
data source 是什么呢,字面意思可以知道:数据来源
flink做为一个流式计算框架,可以用来批处理,也可以用来流处理。
批处理可以是静态的数据集,历史的数据集。
也可以用来做流处理,即实时的处理些实时数据流,实时产生数据流的结果,只要数据源源不断的传递过来,flink就可以一直计算下去,这个data source 就是数据的来源
flink 批处理的source常见有两大类
基于本地集合的source
基于文件的source
基于集合
基于文件
读取本地文件数据readtext
读取hdfs数据
读取csv文件数据
读取压缩文件
遍历目录
流程
获取执行环境
source加载数据
转化操作
输出
执行
转换 tranformation
map和mapPartition
将dataset中的每一个元素转换成另外一个元素
注意:map和mappartition效果是一样的。
但是在map的函数中,需要访问一些外部存储,访问mysql,需要打开链接,此时效率低。
mappatition减少连接数,提高效率
flatmap
将dataset中每一个元素转换成为另一个元素并压平为多个元素
将dataset中每一个元素转换成为0~n个元素
针对需要如果是数据变多的时候就要考虑是不是要进行flatmap操作
filter
filter函数在实际生产中特别实用,数据处理阶段可以过滤处理掉大部分不符合业务的内容,可以减轻大部分的压力
业务场景:过滤长度>4的单词
reduce
可以对一个dataset或者是一个group来进行聚合计算,最终聚合成一个元素
reduce聚合操作的算子
注意针对groupby之后的数据流我们可以使用reduce进行聚合,不用考虑按照哪种方式,reduce都可以实现,如果想要使用sum()进行聚合,前面分组指定key必须是按照索引才可以。
reducegroup
可以对一个dataset或者一个group来进行聚合计算,最终聚合成一个元素。
reduce和reducegruop的区别
reduce是数据将一个个拉去到另外一个节点,然后再执行计算
reducegroup是先在每个group所在的节点上执行计算,然后在拉去
aggregate
按照内置的方式进行聚合,aggergate只能作用于元组上,例如:sum/min/max
distinct
去重复的数据
join
使用join可以将两个dataset连接起来,返回想要关联结果
leftouterjoin/rightouterjoin/fulljoin
左外链接,左边的dataset中的每一个元素,去链接右边的元素
union
将两个dataset取并集,不会去重
rebalance
flink也有数据倾斜的时候,比如当前有数据量10亿的数据需要处理,在处理过程中可能会发生状况
出现了数据倾斜,其他三台机器执行完毕也要等待机器1执行完毕才算整体将任务执行完毕
所以在实际的工作中,出现这种情况比较好的的解决方案就是rebalance(内部使用round robin方法将数据均匀打散)随机轮询分发数据,保证每个分区数量大致均衡
data sink
基于集合
可以sink到标准输出,error输出,collect()到本地集合
基于文件
可以sink到本地文件,hdfs文件(支持多种文件的存储格式)
广播变量
flink支持广播变量,可以将数据广播到taskmanager上就可以提供taskmanager中的subtask/task去使用,数据存到内存中,这样可以减少大量的shuffle操作。
比如数据在join阶段,不可避免的就是大量的shuffle操作,我们可以把一个dataset广播出去,一直加载到taskmanager的内存中,可以直接在内存中拿数据,避免了大量的shuffle,导致集群性能下降。
注意点:
广播变量数据不应该太大
广播变量数据是不需要频繁更新的数据
累加器
accumulator即累加器,与mapreduce counter的应用场景不多,都能很好的观擦task在运行期间的数据变化
可以在flink job任务重的算子函数中操作累加器,但是只能在任务执行结束之后才能获取到的累加器的最终结果
flink现在有以下内置累加器,每个累加器都实现了accumulator接口
intcounter
longcounter
doublecounter
boardcast和accumulator的区别
boardcast广播变量允许程序员将一个只读的变量缓存缓存在每台机器上,而不用在任务之间传递变量。广播变量可以共享内存,但是不可以进行修改
accumulators(累加器)是可以在不同任务中对同一个变量进行累加操作