我使用节点js创建了一个kafka生产者,该生产者基本上将从upstox接收的实时数据推送到kafka主题中。 kafka生产者代码段看起来像这样:
upstox.on("liveFeed", function(message) {
//message for live feed
var data = JSON.stringify(message);
var payload = [{
topic : 'live-feed',
message: data,
attributes: 1
}];
producer.send(payload, function(error, result) {
console.info('Sent payload to Kafka: ', payload);
if (error) {
console.error(error);
} else {
console.log('result: ', result)
}
});
它以以下格式显示了实时供稿:
topic: live-feed,
message:{live-feed data},
attributes:1
现在,我正在尝试编写一个火花流消费者,该消费者将流此生产者产生的数据。我想到了这样的东西:
package com.senpuja.datastream
import kafka.serializer.StringDecoder
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
object LiveFeedStream {
def main(args: Array[String]): Unit = {
val brokers = util.Try(args(0)).getOrElse("localhost:9092")
val inTopic = util.Try(args(1)).getOrElse("live-feed")
val sparkConf = new SparkConf()
val spark = new SparkContext(sparkConf)
val streamCtx = new StreamingContext(spark, Seconds(10))
val inTopicSet = Set(inTopic)
val kafkaParams = Map[String, String](
"bootstrap.servers" -> brokers,
"key.deserializer" -> "org.apache.kafka.common.serialization.StringDeserializer",
"value.deserializer" -> "org.apache.kafka.common.serialization.StringDeserializer"
)
val msg = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
streamCtx,
kafkaParams,
inTopicSet
)
msg.print()
streamCtx.start()
streamCtx.awaitTermination()}
但是当我提交代码时,我得到以下输出,只是空的:
{null}, {null}
{null}, {null}
{null}, {null}
{null}, {null}
{null}, {null}
我想从生产者主题中检索消息部分。我认为这与我猜想的键值有关,但我无法找出解决方案。任何帮助将不胜感激!
答案 0 :(得分:0)
在Kafka参数中添加enable.auto.commit = false并尝试。
答案 1 :(得分:0)
我发现问题在于,当Spark Streaming代码正在寻找键值对时,我直接传递了消息。因此,我使用KeyedMessage来生成键值对。
upstox.on("liveFeed", function(message) {
//message for live feed var
var data = JSON.stringify(message);
var km = new KeyedMessage(Math.floor(Math.random() * 10000), data);
var payload = [{
topic : 'live-feed',
messages: km
}];
producer.send(payload, function(error, result) {
console.info('Sent payload to Kafka: ', payload);
if (error) {
console.error(error);
} else {
console.log('result: ', result)
}
)}
它解决了我的问题。