使用MessageHandler初始化createDirectStream

时间:2016-11-05 12:08:38

标签: apache-spark constructor streaming kafka-consumer-api

以下是我用来从Kafka Spark流式读取创建Dstream [String]的现有代码:

var messages: DStream[String] = null
val topicsSet = kafkaTopicsName.split(",").toSet
messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](streamingContext, kafkaParams, topicsSet).map(_._2)
message.foreachRDD { rdd =>
. . . . . 
}
streamingContext.start()
streamingContext.awaitTermination()

我想改用:

def createDirectStream[K, V, KD <: Decoder[K], VD <: Decoder[V]](ssc: StreamingContext, 
    kafkaParams: Map[String, String], topics: Set[String])(implicit arg0: ClassTag[K], 
    arg1: ClassTag[V], arg2: ClassTag[KD], arg3: ClassTag[VD]): InputDStream[(K, V)]

def createDirectStream[K, V, KD <: Decoder[K], VD <: Decoder[V], R]
    (jssc: JavaStreamingContext, keyClass: Class[K], valueClass: Class[V],   
     keyDecoderClass: Class[KD], valueDecoderClass: Class[VD], recordClass: Class[R], 
     kafkaParams: Map[String, String], fromOffsets: Map[TopicAndPartition, Long], 
    messageHandler: Function[MessageAndMetadata[K, V], R]): JavaInputDStream[R]

这样我就可以自己管理火花消费者的抵消。 我已经想出如何从Zookeeper访问offsetranges然后为offsetDirectStream分配偏移量范围

但是我不确定如何传递messagehandler和类R.究竟这两个参数究竟是什么?如果我能在scala中为上述构造函数获取示例代码段,那真的很赞。

2 个答案:

答案 0 :(得分:1)

我想出了一个解决方案:

val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder, String](
  streamingContext, kafkaParams, topicMap, (mmd: MessageAndMetadata[String, String]) => mmd.message())

答案 1 :(得分:0)

你可以使用这样的东西。

KafkaUtils.createDirectStream(sparkStreamContext,String.class,                 String.class,StringDecoder.class,StringDecoder.class,String.class,kafkaParams,fromOffsets,(Function,String&gt;)MessageAndMetadata :: message );

这将返回一个JavaInputDStream,它包含基于fromOffsets

的消息