SparkStreaming部分:SparkStreaming+kafka 的receive模式(文字说明+图片)

Sparkstreaming+kafka的Receiver模式读取数据:

默认读取数据的存储级别是:MEMORY_AND_DISK_SER_2采用了receiver接收器的模式,需要一个task一直处于接受数据的状态,sparkstreaming相当于kafka的消费者,接收来的数据被分到其他节点上,完成之后,会向zookeeper更新消费者的offset。

当更新完消费者的偏移量之后,如果Driver挂掉,Driver下的Executor也会挂掉,就会有数据丢失的问题。

怎么解决;

开启WAL机制,Write Ahead Log:预写日志的机制,将数据备份到hdfs中一份,完成之后,向zookeeper中更新offset,汇报位置,发送task处理数据,开启WAL机制后,可以对接受数据的存储级别降级,(去掉_2),开启WAL会带来新的问题,处理数据效率慢,延迟大。

不仅被分到zookeeper 中,还要备份到hdfs中,向hdfs中备份一条数据

如果Driver再次挂掉了,不会向executor要,而是向hdfs,

Receiver采用的是高级模式

存在丢数据

有延迟

没法控制进度

往kafka中写消息,可以指定key,也可以不指定key。

指定了key,相当于往hash中生产消息

不指定key是默认按照轮询的方式

 

Sparkstreaming+kafka receiver模式并行度:

Spark.streaming.blockInterval 200ms,batchInterval 接收数据过程中,每隔200ms将接收来的数据放到block中,假设batchinterval=5S,那么一批次内,有25个block,这25个block组成一个batch,这个batch封装到一个RDD中。RDD-->partition。Batch--->block,这里RDD中的partition的个数就是block的个数

如何提高DStream中的RDD的并行度?

可以降低spark.streaming.blockInterval来提高DStream中的RDD的并行度,建议这个参数最小不能低于50ms

Receiver模式依赖于zookeeper来存储消费者offset,采用的是consumer读取kafka中的高级API实现的。

SparkStreaming部分:SparkStreaming+kafka 的receive模式(文字说明+图片)

SparkStreaming部分:SparkStreaming+kafka 的receive模式(文字说明+图片)