在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示例中更改频道名称,但此消费者接收零消息。
答案 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