有没有办法在Kafka消费者中指定多个解码器(或每个主题一个)?其他人觉得有必要吗?

时间:2015-09-14 22:39:34

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

我正在使用

对Scala(ref)中的Kafka工作进行Spark Streaming
public static <K,V,U extends kafka.serializer.Decoder<?>,T extends kafka.serializer.Decoder<?>> ReceiverInputDStream<scala.Tuple2<K,V>> createStream(StreamingContext ssc, scala.collection.immutable.Map<String,String> kafkaParams, scala.collection.immutable.Map<String,Object> topics, StorageLevel storageLevel, scala.reflect.ClassTag<K> evidence$1, scala.reflect.ClassTag<V> evidence$2, scala.reflect.ClassTag<U> evidence$3, scala.reflect.ClassTag<T> evidence$4)

我希望在同一个DStream和每个批处理间隔的基础RDD中接收不同类型的消息(需要不同的解码器)。我将听取多个主题,每个主题将对应一种消息类型,因此需要自己的Decoder。目前似乎没有提供每个主题kafka.serializer.Decoder<?>(是否有一个?)。人们似乎很可能会在每个主题上发送不同类型的消息(protobuf序列化字节?)。还有其他人遇到过这个问题吗?

感谢。

下进行。

似乎topic中某处valueDecoder@keyframe glow { 0%{} 100%{} } img { animation: glow 10s infinite; } 的映射可能有所帮助。

2 个答案:

答案 0 :(得分:0)

我认为,你需要两个DStream,每个主题一个。然后,您将能够执行join或union以获得包含所有元素的单个dstream。

答案 1 :(得分:0)

使用createDirectStream api,它允许您通过HasOffsetRanges以每个分区为基础访问该主题。对于kafka解码器,使用DefaultDecoder为每条消息获取一个字节数组。

然后在mapPartitions中进行实际解码,在其中匹配主题名称以找出如何解释字节数组。

http://spark.apache.org/docs/latest/streaming-kafka-integration.html