Spark Streaming kafka 实现数据零丢失的几种方式
来源:互联网 发布:mac打开照片 编辑:程序博客网 时间:2024/05/21 15:46
在使用spark streaming消费kafka数据时,程序异常中断下发现会有数据丢失的情况。
下文将说明如何避免这种情况。
Definitions
问题开始之前先解释下流处理中的一些概念:
At most once
- 每条数据最多被处理一次(0次或1次)At least once
- 每条数据最少被处理一次 (1次或更多)Exactly once
- 每条数据只会被处理一次(没有数据会丢失,并且没有数据会被多次处理)
1.High Level API
如果不做容错,将会带来数据丢失
因为receiver一直在接收数据,在其没有处理的时候(已通知zk数据接收到),executor突然挂掉(或是driver挂掉通知executor关闭),缓存在其中的数据就会丢失。
因为这个问题,Spark1.2开始加入了WAL(Write ahead log)
开启 WAL,将receiver获取数据的存储级别修改为StorageLevel.MEMORY_AND_DISK_SER
val conf = new SparkConf()conf.set("spark.streaming.receiver.writeAheadLog.enable","true")val sc= new SparkContext(conf)val ssc = new StreamingContext(sc,Seconds(5))ssc.checkpoint("walDir") val lines = KafkaUtils.createStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicMap, StorageLevel.MEMORY_AND_DISK_SER).map(_._2)
开启WAL后,依旧存在数据丢失问题
即使按官方说的设置了WAL,依旧会有数据丢失,这是为什么?
因为在任务中断时receiver
也被强行终止了,将会造成数据丢失,提示如下:
ERROR ReceiverTracker: Deregistered receiver for stream 0: Stopped by driverWARN BlockGenerator: Cannot stop BlockGenerator as its not in the Active state [state = StoppedAll]WARN BatchedWriteAheadLog: BatchedWriteAheadLog Writer queue interrupted.
在Streaming程序的最后添加代码,只有在确认所有receiver都关闭的情况下才终止程序。
sys.addShutdownHook({ ssc.stop(true,true)})
调用的方法为:
def stop(stopSparkContext: Boolean, stopGracefully: Boolean): Unit
WAL带来的问题
WAL实现的是At-least-once
语义。
如果在写入到外部存储的数据还没有将offset更新到zookeeper就挂掉,这些数据将会被反复消费。
同时,降低了程序的吞吐量。
2.Kafka Direct API
Kafka direct API 的运行方式,将不再使用receiver来读取数据,也不用使用WAL机制。
同时保证了exactly-once
语义,不会在WAL中消费重复数据。
不过需要自己完成将offset写入zk的过程,在官方文档中都有相应介绍。
例如如下的调用方式:
messages.foreachRDD(rdd=>{ val message = rdd.map(_._2) //对数据进行一些操作 message.map(method) //更新zk上的offset (自己实现) updateZKOffsets(rdd)})
两种方式的具体数据处理流程可以参考该文章:
http://getindata.com/blog/post/recent-evolution-of-zero-data-loss-guarantee-in-spark-streaming-with-kafka/
- Spark Streaming kafka 实现数据零丢失的几种方式
- Spark Streaming kafka实现数据零丢失的几种方式
- Spark Streaming使用Kafka保证数据零丢失
- Spark Streaming使用Kafka保证数据零丢失
- Spark Streaming和Kafka整合保证数据零丢失
- Spark Streaming使用Kafka保证数据零丢失
- Spark Streaming使用Kafka保证数据零丢失
- Spark Streaming使用Kafka保证数据零丢失
- 【总结】Spark Streaming和Kafka整合保证数据零丢失
- Spark Streaming获取kafka数据的两种方式
- Spark Streaming容错的改进和零数据丢失
- Spark Streaming容错的改进和零数据丢失
- Spark Streaming容错的改进和零数据丢失
- Spark Streaming容错的改进和零数据丢失
- Spark Streaming容错的改进和零数据丢失
- Spark Streaming容错的改进和零数据丢失
- Spark Streaming和Kafka整合是如何保证数据零丢失
- spark streaming读取kafka 零丢失(三)
- 存储过程的优缺点
- Java volatile Java虚拟机提供的最轻量级同步机制
- JNI 常用的JNI操作Demo 良心作品
- 解决PLSQL记录被另一个用户锁住的问题
- JDBC连接mysql数据库
- Spark Streaming kafka 实现数据零丢失的几种方式
- jmeter学习笔记(Threads)
- 权限管理框架实现(2)--Struts中ValueStack使用
- Cocos2d-JS 精灵的性能优化
- Viewpager+fragment数据更新问题解析
- BFS--点到点间的最短路径
- 七号信令的消息结构(包括SCCP详解)
- 【JS】:JS 日期类的使用
- 类字面变量