Spark流消费者使用空值

时间:2018-06-21 12:11:15

标签: scala apache-spark apache-kafka spark-streaming kafka-producer-api

我使用节点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}

我想从生产者主题中检索消息部分。我认为这与我猜想的键值有关,但我无法找出解决方案。任何帮助将不胜感激!

2 个答案:

答案 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)
    }
    )}

它解决了我的问题。