kafka
优势
- kafka相比于其他消息系统能够实现有序的并行化的读取,其他的消息系统如果需要实现有序,是通过独占的形式,那样就不能并行化,每次只能有一个消费者读取数据。
- kafka通过topic和partition的方式实现有序的并行化,每个消费者可以独占一个partition,同时多个消费者读取同一个topic的数据,这样就实现了并行化,但是一个消费群组的消费者不能比一个topic的分区数多,这样如果继续保持有序,会导致资源竞争,降低读取并行效率。
概念
- kafka 集群包含一个或者多个服务器,这个服务器被称为broker。
- 每条发布到kafka集群的消息都有一个类别,这个类别被称为topic。物理上不同topic的消息分开存储,逻辑上一个topic的消息保存在一个或者多个broker上。
- partition是物理概念,每个topic包含一个或者多个partition
- topic在逻辑上可以被认为是一个queue,每条消费都必须指定它的topic,可以简单理解为必须指明把这条消息放进哪个queue里。为了使得kafka的吞吐率线性提高,物理上把topic分成一个或者多个partition,每个partition在物理上对应一个文件夹,该文件夹下存储这个partition的所有的消息和索引文件。
spark streaming
对比
kafka stream和spark streaming的区别,主要在于kafka stream是流式处理用在kafka到kafka,方便且不用搭建spark集群,而spark streaming作为流式处理方便的用在kafka到其他存储。
建议
一个批次内处理完一批数据,即batch process time应该接近于batch duration,如果batch process time总是比batch duration长,就会不断增加调度延迟时间而且数据也会在内存里堆积,进而增加系统不稳定性;另一方面,如果batch process time总是远远小于batch duration,则集群资源利用率不高,也是一种资源浪费。
反压机制
spark streaming需要使用反压机制的情况:
- 首次启动streaming 应用,kafka保留了大量历史消息,并且auto.offset.reset=earliest;可以offset设置为latest,防止第一个batch接收大量消息,处理时间过长和内存溢出。
- 防止kafka生产者突然产生大量消息,一个batch接收到大量数据,导致batch之间接收到数据倾斜
- spark.streaming.kafka.maxRatePerPartition
控制spark读取的每个kafka分区最大消息数,每个rdd分区接收的消息量<=batchDuration * spark.streaming.kafka.maxRatePerPartition
1 Spark Streaming增大任务并发度
Q: 在Spark Streaming中,增大任务并发度的方法有哪些?
A: s1 core的个数: task线程数,也就是–executor-cores
s2 repartition
s3 Streaming + Kafka,Direct方式,则增加partition分区数
s4 Streaming + Kafka,Receiver方式,则增加Receiver个数
s5 reduceByKey和reduceByKeyAndWindow传入第二个参数