【大数据分析】Spark Streaming:外部数据源

官方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对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值