每个kafka主题火花流不同值解码器

时间:2016-10-04 11:19:07

标签: python apache-spark apache-kafka avro

我需要创建一个从多个主题读取的Spark流,并为每个主题使用不同的解码器(每个主题包含不同的avro编码对象):

def decode_avro(message):
    schem = avro.schema.parse(open("error_list.avsc").read())
    bytes_reader = io.BytesIO(message)
    decoder = avro.io.BinaryDecoder(bytes_reader)
    reader = avro.io.DatumReader(schem)
    return reader.read(decoder)

ssc = StreamingContext(sc, 2)
kvs = KafkaUtils.createDirectStream(ssc, [topic, topic2], {
    "metadata.broker.list": brokers}, valueDecoder = decode_avro)

我不知道是否可以为每个主题指定不同的解码器回调,或者是否可以在解码器功能上知道主题名称(这样我就可以使用avro的主题名称)模式文件并解码同一函数中的所有消息)

谢谢

1 个答案:

答案 0 :(得分:1)

我们也有这种情况,我们从不同的主题中读取不同的消息格式,然后处理每个主题并将输出存储到每个源主题的专用存储中。 去这里的正确方法是创建多个流。使用相同的Spark上下文在同一应用程序中按主题流。 每个流都将获得相关的ValueDecoder,如果它们共享相同的格式,您仍然可以从多个主题中读取。