我正在尝试将火花流偏移读入我的消费者,但我似乎无法正确地做到这一点。
这是我的代码。
val dfoffset = hiveContext.sql(s"select * from $db")
dfoffset.show()
val dfoffsetArray = dfoffset.collect()
println("printing array of data")
dfoffsetArray.foreach(println)
val fromOffsets = collection.mutable.Map[TopicAndPartition, Long]()
for (i <- dfoffsetArray) {
val topicAndPartition = (TopicAndPartition(i(1).toString, i(0).toString.toInt) -> (i(2).toString.toLong))
fromOffsets += topicAndPartition
}
val kafkaParams = Map[String, String]("bootstrap.servers" -> serverName, "group.id" -> "test")
val topics = Array(topicName).toSet
//stuck here
var directKafkaStream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topics)
directKafkaStream.foreachRDD(rdd1 => { ..
以下是显示数据框
的输出partition_number|topic_name|current_offset|
+----------------+----------+--------------+
| 0|TOPIC_NAME| 4421|
非常感谢任何帮助。
我正在使用spark 1.6,Scala 2.10.5,kafka 10
答案 0 :(得分:1)
正如显示KafkaUtils.createDirectStream的官方文档,您应该将fromOffsets
作为createDirectStream的第3个参数传递(并且不要忘记第4个参数messageHandler
)。
fromOffsets
参数假设为collection.immutable.Map[TopicAndPartition, Long]
,我们通常在Scala中使用不可变而不是可变。
您可以使用以下内容将dfoffsetArray
转换为immutable.Map[TopicAndPartition, Long]
:
val fromOffsets = dfoffsetArray.map( i =>
TopicAndPartition(i(1).toString, i(0).toString.toInt) -> (i(2).toString.toLong)
).toMap
messageHandler
是(MessageAndMetadata[K, V]) ⇒ R)
的类型,它处理消息的键和值。您可以按如下方式定义一个简单的处理程序:
val messageHandler =
(mmd: MessageAndMetadata[String, String]) => (mmd.key, mmd.message)
然后你的createDirectStream
看起来像......
KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder,
(String, String)](ssc, kafkaParams, fromOffsets, messageHandler)
现在您可以自由地对流进行一些转换。快乐的流媒体!
几个月前,this文章对我进行了辅导。也许你会觉得它很有帮助。