kafka + spark streaming direct方式消费消息
前提:
spark 安装成功,spark 1.6.0
zookeeper 安装成功
kafka 安装成功
集群环境见:《0423_SparkStreaming数据源kafka解析和安装配置及测试实战预习》,请在IMF群中查看。
步骤:
在worker1中启动kafka 生产者:
root@worker1:/usr/local/kafka_2.10-0.9.0.1# bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
在worker2中启动消费者:
root@worker2:/usr/local/kafka_2.10-0.9.0.1# bin/kafka-console-consumer.sh --zookeeper master:2181 --topic test
生产者生产的消息,消费者可以消费到。说明kafka集群没问题。进入下一步。
在master中启动spark-shell
./spark-shell --master local[2] --packages org.apache.spark:spark-streaming-kafka_2.10:1.6.0,org.apache.kafka:kafka_2.10:0.8.2.1
笔者用的spark 是 1.6.0 ,读者根据自己版本调整。
shell中的逻辑代码(wordcount):
import kafka.serializer.StringDecoder
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.streaming.{Durations, StreamingContext}
val topics = Set("test")
val params = Map("metadata.broker.list" -> "master:9092,worker1:9092,worker2:9092",
"group.id" -> "main.scala.StreamingWordCountSelfKafkaDirectStreamScala")
val ssc = new StreamingContext(sc, Durations.seconds(5))
KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, params, topics).
map(t => t._2).
flatMap(_.split(" ")).
map((_, 1)).
reduceByKey(_ + _).
print
ssc.start
生产者再生产消息:
spark streaming的反应:
返回worker2查看消费者
可见,groupId不一样,相互之间没有互斥。
上述是使用 createDirectStream 方式链接kafka
参考:
http://spark.apache.org/docs/latest/streaming-kafka-integration.html