天天看点

Spark Streaming + Kafka整合

两种常用的Spark Streaming和Kafka整合方法:

1. CreateStream:

传统方法,使用了接收器和Kafka的高阶API

接收器接收到的数据被存在Spark executors中,随后streaming的任务会处理数据。

缺点:会丢失数据,除非设置streaming的write ahead logs

2. CreateDirectStream:

新方法,不使用接收器

优势:优化并行结构,kafka分区和RDD分区一一对应;不需要为了数据恢复而写write ahead logs,数据直接从kafka恢复;不会出现offset数据的不一致,offset全部由streaming维护

CreateStream

1.添加maven依赖:

groupId = org.apache.spark
 artifactId = spark-streaming-kafka_2
 version = 
           

2.代码(API docs):

import org.apache.spark.streaming.kafka._

 val kafkaStream = KafkaUtils.createStream(streamingContext, 
     [ZK quorum], [consumer group id], [per-topic number of Kafka partitions to consume])
           

3.注意:

Kafka的topic partitions和Streaming中RDD的partition不是对应的

CreateDirectStream

1.添加maven依赖:

groupId = org.apache.spark
 artifactId = spark-streaming-kafka_2
 version = 
           

2.代码(API doc和example)

import org.apache.spark.streaming.kafka._

 val directKafkaStream = KafkaUtils.createDirectStream[
     [key class], [value class], [key decoder class], [value decoder class] ](
     streamingContext, [map of Kafka parameters], [set of topics to consume])
           

最后生成的directKafkaStream是一个流stream,可以拆分成一个个RDD进行操作

附: 官方文档补充

继续阅读