[Hadoop] Kafka + Spark Streaming 数据零丢失
Kafka:输入
Spark Streaming:伪实时流处理 batch批次 1s :> = 0 0,1...100...
DB:输出 Redis/ES
雪崩效应 Job全部hung在那里 解决一般是手工kill ==> 如何保证数据0丢失
流处理程序 bug => 挂了 => 下次再启动,也要保证数据0丢失
生产上如何确认spark和kafka的版本:sparl.apache.orh/docs/latest/streaming-kafka-integration.html
CDH Kafka:0.10.0.0
Apache Spark Streaming:(cdh的spark不支持sql,阉割版)2.1.1 (官方最新版2.3.1)
数据领丢失:
Offset Commit API: kafka数据偏移量
比如:Kafka Topic 有10个分区: 分区:a b c d e f
data offset
a 1
b 2
c 3
------------
d 4
e 5 挂了
f 6
读的过程中把offset存起来,官网Storing Offset:
1)Checkpoint: HDFS 小文件(合并)存在一定弊端,生产上不用这种方法
如果读的进度和offset存的不同步
结构化流
2) your own data store:zk/hbase (offset存放的地方)这样做法业务维护太麻烦
源码是JAVA的,可以改造成SCALA来使用。
第三种方法
3)kafka itself 自我维护offset
面试时常问的问题:
问题1:Receiver DStream 和Direct DStream区别
问题2:spark partition VS kafka partition:1:1可以并行提高执行效率
kafka itself 自我维护offset ==> 新的topic(内嵌的topic:_consumer) 内嵌在topic
具体执行代码在spark官网kafka itself这里可以找到
stream.foreachRDD {
...
// 业务处理
// ofset信息是异步提交到内嵌的_consumer topic里面。生产中我们必须要自己手动去提交
dstream.asInstanceOf...
}
什么叫流
代码实现
消费语义:
至少1次 12 12 重复消费,至少保证不丢。生产中选用这一种
最多1次 12
1. 重复消费,至少保证不丢,如何解决重复问题
2. key = null
数据是通过flume 发送到kafka
逻辑顺序
1 insert
2 update
3 delete
1 --> p0
2,3 -> p1
数据倾斜
如何保证spark streaming 有序消费