官方Spark连接器存在以下外部系统和协议:
(1)kafka:分布式、快速、可扩展的发布订阅消息系统。
(2)Flume:分布式、可靠的系统,用于收集、聚合和传输大量日志数据。
(3)Amazon Kinesis:与Kafka类似的AWS流媒体平台
(4)Twitter:社交网络的API服务
(5)ZeroMQ:分布式消息系统
(6)MQTT:轻量化发布/订阅消息传输协议
使用Kafka,修改流应用程序
使用Spark kafka连接器
要创建从kafka主题读取数据的DStream,需要设置参数映射,参数映射至少包含metadata。broker.list参数,这个参数只想kafka的地址,也可以使用bootstrap.servers。
val ssc = new StreamingContext(sc, Seconds(5))
val kafkaReceiverParams = Map[String, String](
"metadata.broker.list" -> "192.168.10.2:9092")
然后将参数映射、流上下文和需要连接的主题名称传递给KafkaUtils.createDirectStream。
消费者(指的是消费Kafka中内容的一端,这里指Spark)在Spark检查点目录中存储偏移量。如果最后消费的消息的偏移量不可用,则可以在参数映射中设置auto.offset.reset参数,如果是smallest,它将从最小的偏移开始消费。
创建的kafkaStream现在可以与以前使用过的fileStream以相同方法使用。唯一的区别是fileStream的元素是字符串,kafkaStream包含有两个字符串的元组:键和消息。
向kafka写入信息
要将消息写入Kafka,可以使用Kafka的Producer对象。该对象连接到kafka代理并发送消息(消息是KeyedMessage对象)
import org.sia.KafkaProducerWrapper
finalStream.foreachRDD((rdd) => {
rdd.foreachPartition((iter) => {
KafkaProducerWrapper.brokerList = "192.168.10.2:9092"
val producer = KafkaProducerWrapper.instance
//val producer = new Producer[...](...)
iter.foreach({ case (metric, list) => producer.send("metrics", metric, metric + ", " + list.toString) })
})
})
这段代码有两个值得注意的地方,首先是foreachPartition。比foreach循环的次数要少。其次是
KafkaProducerWrapper.instance,它是一个单例程序,不管循环多少次,每个JVM中只初始化一次Producer对象。