兩種常用的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.10
version = 1.6.0
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.10
version = 1.6.0
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進行操作
附: 官方文檔補充