spark 结构化流文件输出流和kafka输出流

背景

spark的结构化流有三种输出模式,但是各个具体的数据池支持的输出模式是不同的,那么文件输出流和kafka输出流支持使用哪几种输出模式来输出数据呢?本文就来回答个问题

spark知识回顾

在回答这个问题之前,我们需要了解spark处理数据流的特点,structure streaming 把数据流分成一个个小的微批型数据来进行处理,每一个小的微批型的处理逻辑就是批处理流程一模一样,并且structure streaming会把输入的数据都当成一张无限增长的表,每个微批型的数据输入就是往这个无限增长的表中插入的新的记录列表.

技术原理

首先我们先看一下spark支持的三种输出模式:

追加模式:

这种模式会把本次触发后新增到结果表中的记录输出到输出池,这种模式蕴含着每次触发后新增的所有行在后续的查询处理中都不会被更新到,相当于以后的触发执行都不能够更新之前输出的记录—可以想象得到这个条件异常的苛刻,除了map,select,filter等无状态操作满足条件(因为后面查询处理的数据不会更新到之前已经处理的数据)外,诸如全局的group by 等有状态的操作都会更新到之前输出的记录(这里也有个例外:基于时间窗口的group by操作在达到水印时间后也不能再更新这个窗口内聚合得到的数据,所以也满足要求),所以大部分的有状态操作都不支持这种输出模式

更新模式:

这种模式会把这次触发时更新及新增的记录行输出到输出池中,与追加模式不同,它不仅仅会输出新增的行,更新的行也会输出到输出池中,绝大部分的有状态操作(全局聚合和基于时间窗的聚合)操作都支持这种输出模式

完整模式:

这种输出模式每次触发时都会都会把当前维护的所有状态的记录完整的输出到输出池中,以统计每个单词的计数作为例子,每次触发时都会把历史所有统计过所有单词的计数输出,这种模式需要维护巨大的历史状态数据.

文件输出池

文件输出池表示把记录以json,parque等格式输出到文件目录中,这种输出池只支持记录以追加的形式添加到文件中,不支持更新已有的文件中的记录,所以文件输出池只支持追加模式

kafka输出池

kafka输出池支持三种模式的数据输出方式,无论是追加模式(只输出新增的记录),更新模式(新增和更新的记录),亦或是完整模式(每次触发都输出完整的历史状态记录,即使是重复记录也会在每次触发时都输出)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值