两种常用的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进行操作
附: 官方文档补充