[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存放的地方)这样做法业务维护太麻烦 

 

[Hadoop] Kafka + Spark Streaming 数据零丢失

 

源码是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...

}

[Hadoop] Kafka + Spark Streaming 数据零丢失

 

什么叫流

[Hadoop] Kafka + Spark Streaming 数据零丢失

 

 

代码实现

[Hadoop] Kafka + Spark Streaming 数据零丢失

 

[Hadoop] Kafka + Spark Streaming 数据零丢失

 

消费语义:

至少1次   12    12   重复消费,至少保证不丢。生产中选用这一种

最多1次    12 

 

1. 重复消费,至少保证不丢,如何解决重复问题

2. key = null

数据是通过flume 发送到kafka

 

逻辑顺序

1 insert

2 update

3 delete

1 --> p0

2,3  -> p1

数据倾斜

 

如何保证spark streaming 有序消费