Apache spark Spark Streaming Kafka消费者不喜欢';我不喜欢DStream

Apache spark Spark Streaming Kafka消费者不喜欢';我不喜欢DStream,apache-spark,apache-kafka,spark-streaming,kafka-consumer-api,spark-streaming-kafka,Apache Spark,Apache Kafka,Spark Streaming,Kafka Consumer Api,Spark Streaming Kafka,我正在使用Spark Shell(Scala 2.10和Spark Streamingorg.apache.Spark:Spark-Streaming-kafka-0-10_2.10:2.0.1)测试Spark/kafka消费者: import org.apache.kafka.clients.consumer.ConsumerRecord import org.apache.kafka.common.serialization.StringDeserializer import org.apa

我正在使用Spark Shell(Scala 2.10和Spark Streaming
org.apache.Spark:Spark-Streaming-kafka-0-10_2.10:2.0.1
)测试Spark/kafka消费者:

import org.apache.kafka.clients.consumer.ConsumerRecord
import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.streaming.kafka010._
import org.apache.spark.streaming.kafka010.LocationStrategies.PreferConsistent
import org.apache.spark.streaming.kafka010.ConsumerStrategies.Subscribe
import org.apache.spark._
import org.apache.spark.streaming._
import org.apache.spark.streaming.dstream.DStream

val kafkaParams = Map[String, Object](
  "bootstrap.servers" -> "mykafka01.example.com:9092",
  "key.deserializer" -> classOf[StringDeserializer],
  "value.deserializer" -> classOf[StringDeserializer],
  "group.id" -> "mykafka",
  "auto.offset.reset" -> "latest",
  "enable.auto.commit" -> (false: java.lang.Boolean)
)

val topics = Array("mytopic")

def createKafkaStream(ssc: StreamingContext, topics: Array[String], kafkaParams: Map[String,Object]) : DStream[(String, String)] = {
    KafkaUtils.createDirectStream[String, String](ssc, PreferConsistent, Subscribe[String, String](topics, kafkaParams))
}

def messageConsumer(): StreamingContext = {
    val ssc = new StreamingContext(SparkContext.getOrCreate(), Seconds(10))

    createKafkaStream(ssc, topics, kafkaParams).foreachRDD(rdd => {
        rdd.collect().foreach { msg =>
            try {
                println("Received message: " + msg._2)
            } catch {
                case e @ (_: Exception | _: Error | _: Throwable) => {
                println("Exception: " + e.getMessage)
                e.printStackTrace()
            }
          }
        }
    })

    ssc
}

val ssc = StreamingContext.getActiveOrCreate(messageConsumer)
ssc.start()
ssc.awaitTermination()
当我运行此命令时,会出现以下异常:

<console>:60: error: type mismatch;
 found   : org.apache.spark.streaming.dstream.InputDStream[org.apache.kafka.clients.consumer.ConsumerRecord[String,String]]
 required: org.apache.spark.streaming.dstream.DStream[(String, String)]
                  KafkaUtils.createDirectStream[String, String](ssc, PreferConsistent, Subscribe[String, String](topics, kafkaParams))
                                                               ^
:60:错误:类型不匹配;
找到:org.apache.spark.streaming.dstream.InputDStream[org.apache.kafka.clients.consumer.ConsumerRecord[String,String]]
必需:org.apache.spark.streaming.dstream.dstream[(字符串,字符串)]
KafkaUtils.createDirectStream[String,String](ssc,PreferConsistent,订阅[String,String](主题,kafkaParams))
^

我反复检查了Scala/API文档,这段代码看起来应该正确执行。知道我哪里出错了吗?

Subscribe
topics
参数作为
Array[String]
,根据
def createkafkafkastream传递单个字符串(ssc:StreamingContext,topics:String,
。将参数类型更改为
Array[String]
(并适当地调用它)将解决此问题。

订阅
主题
参数作为
数组[String]
,您将根据
def CreateKafKafCastream传递单个字符串(ssc:StreamingContext,topics:String,
。将参数类型更改为
数组[String]
(并适当地调用它)将解决问题。

@smeeb我没有那种版本的kafka lib可供尝试,但您可以查看重载的
createDirectStream
方法,查看它们的返回类型和参数。您调用的方法似乎返回
DStream[ConsumerRecord[K,V]
而不是
DStream[K,V]
您希望如此。或者,如果这是唯一的选择,请将代码更改为接受
DStream[ConsumerRecord[K,V]]
,然后映射到
(K,V
。再次感谢@khachik(+1)-当您说“您调用的方法似乎返回
DStream[ConsumerRecord[K,V]]
”时…你在哪里看到了这方面的证据。我在看我认为是什么,我没有看到任何重载的
createDirectStream
方法返回
DStream[ConsumerRecord[K,V]]
s,想法?再次感谢!!!@smeeb查看,您调用的方法返回一个
ConsumerRecords
流,您应该映射它以获得键/值对:
stream.map(record=>(record.key,record.value))
。您发布的javadocs似乎适用于不同的版本。@smeeb我没有该版本的kafka lib可供尝试,但您可以查看重载的
createDirectStream
方法,查看它们的返回类型和参数。您调用的方法似乎返回
DStream[ConsumerRecord[K,V]]
而不是您期望的
DStream[K,V]
。或者,如果这是唯一的选择,请将您的代码更改为接受
DStream[ConsumerRecord[K,V]]
,然后映射到
(K,V
。再次感谢@khachik(+1)-当您说“您调用的方法似乎返回
DStream[ConsumerRecord[K,V]
”…你在哪里看到了这方面的证据。我在看我认为是什么,我没有看到任何重载的
createDirectStream
方法返回
DStream[ConsumerRecord[K,V]]
s,想法?再次感谢!!!@smeeb查看,您调用的方法返回一个
消费者记录流
,您应该将其映射以获得键/值对:
stream.map(record=>(record.key,record.value))
。您发布的javadocs似乎适用于不同的版本。