如何阅读具有德鲁伊 - 宁静(Superset)的divolte-data Kafka频道?

时间:2017-05-15 10:36:12

标签: json apache-kafka kafka-consumer-api druid superset

在Ubuntu服务器上,我设置了Divolte Collector以从网站收集点击流数据。数据被写入名为divolte-data的Kafka频道。通过设置Kafka消费者,我可以看到数据进入:

V0:j2ive5p1:QHQbOuiuZFozAVQfKqNWJoNstJhEZE85V0:j2pz3aw7:sDHKs71nHrTB5b_1TkKvWWtQ_rZDrvc2D0:B4aEGBSVgTXgxqB85aj4dGeoFjCqpeEGbannerClickMozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/58.0.3029.96 Chrome/58.0.3029.96 Safari/537.36ChromiumChromium8Google Inc. and contributorsBrowser58.0.3029.96"Personal computer
LinuxCanonical Ltd.

然后我想用Airbnb Superset可视化数据,它有几个连接到常见数据库的连接器,包括druid.io(可以读取Spark)。

似乎Divolte以非结构化的方式在Kafka中存储数据。但显然它可以以结构化的方式映射数据。输入数据是否应该用JSON结构(如文档所述)?

然后如何阅读德鲁伊 - 宁静在divolte-data Kafka频道收到的数据?我尝试在conf示例中更改频道名称,但此消费者接收零消息。

1 个答案:

答案 0 :(得分:0)

我找到的解决方案是我可以用Python处理Kafka消息,例如使用Kafka Python库或Confluent Kafka Python,然后我将使用Avro读者解码消息。

编辑:这是我如何做的更新:

我认为Avro库只是为了阅读Avro文件,但它实际上解决了解码Kafka消息的问题,如下所示:我首先导入库并将模式文件作为参数提供,然后创建一个函数来解码消息进入字典,我可以在消费者循环中使用。

from confluent_kafka import Consumer, KafkaError
from avro.io import DatumReader, BinaryDecoder
import avro.schema

schema = avro.schema.Parse(open("data_sources/EventRecord.avsc").read())
reader = DatumReader(schema)

def decode(msg_value):
    message_bytes = io.BytesIO(msg_value)
    decoder = BinaryDecoder(message_bytes)
    event_dict = reader.read(decoder)
    return event_dict

c = Consumer()
c.subscribe(topic)
running = True
while running:
    msg = c.poll()
    if not msg.error():
        msg_value = msg.value()
        event_dict = decode(msg_value)
        print(event_dict)
    elif msg.error().code() != KafkaError._PARTITION_EOF:
        print(msg.error())
        running = False