kafka spark steaming数据丢失的原因
数据丢失的原因:使用spark streaming消费kafka数据时,程序异常中断的情况下会有丢失数据的风险
如果不做容错,将会带来数据的丢失,
因为receiver一直在接收数据,还没有处理的时候已经通知了zookeeper数据已经接收到了,
executor突然挂掉 或 driver挂掉通知关闭executor 内存中的缓存数据就会出现丢失的情况。----spark1.2的 WAL出现了
开启WAL 将receiver获取数据的存储级别修改为 storagelevel.memory_and_disk_ser
但但但,开启了WAL依旧有数据丢失, 因为任务中断了也会强行终止receiver,会造成数据丢失。
可以讲streaming中添加,只有确定了所有的receiver都关闭的情况下才终止程序,可以调用streamingcontext的stop方法。
sys.addshutdownhook(
ssc.stop(TRUE,TRUE)
)
WAL带来的问题 WAL实现的是at least once。如果写入到外部存储的数据还没有将offset更新到zookeeper就挂掉,这些数据将会被反复消费,同时,因为需要把数据写入到可靠的外部系统,这就回牺牲吞吐量。
kafka direct API
运行方式,不在使用receiver接收数据,抛弃wal机制同时保证了 exactly once 不会再wal机制中重复消费,不过需要自己完成offset写入zookeeper的过程。
messages.foreachrdd(
rdd=>{
val message=rdd.map(_._2)
message.map(method)
updatezkoffsets(rdd)})