使用QuestDB和Confluent Kafka构建数据管线
让我们深入了解一下如何使用Confluent Kafka、QuestDB和Python构建数据管道的教程。
数据管道,从根本上说,是一系列的数据处理措施,用于自动化系统或数据存储之间的数据传输和转换。数据管道可用于企业的各种用例,包括为推荐目的或客户关系管理而聚集客户数据,结合和转换来自多个来源的数据,以及整理/流转来自传感器或交易的实时数据。
例如,像Airbnb这样的公司可以有数据管道,在他们的应用程序和他们选择的平台之间来回走动,以改善客户服务。Netflix利用一个推荐数据管道,使生成电影和系列推荐的数据科学步骤自动化。另外,根据它的更新速度,批处理或流式数据管道可用于生成和更新用于利益相关者的分析仪表板的数据。
在这篇文章中,你将学习如何实现一个数据管道,利用Kafka将多个来源的数据汇总到QuestDB数据库。具体而言,你将看到一个流数据管道的实现,该管道将CoinCap的加密货币市场价格数据整理到QuestDB实例中,在该实例中可以制作指标、分析和进一步的仪表板。
架构图
使用Kafka和QuestDB的数据管线
数据管道由数据源(如应用程序、数据库或网络服务)、处理或转换程序(移动或修改数据等动作,以平行或依次发生)和目的地(如另一个应用程序、存储库或网络服务)组成。
被移动或转换的数据的类型或格式,数据的大小,以及移动或转换的速度(批处理或流处理)是你在构建数据管道时需要注意的一些其他考虑因素。一个每月只需要触发一次的数据管道将不同于一个为处理来自你的应用程序的实时通知而制作的管道。
Apache Kafka是一个开源的分布式事件平台,为实时处理和修改流媒体数据而优化。它是一个快速和可扩展的选择,用于创建高性能、低延迟的数据管道,并为来自多个来源的大批量流式数据的数据集成构建功能。Kafka是一个相当流行的工具,被成千上万的公司使用。
QuestDB是一个高性能、开源的SQL数据库,旨在轻松、快速地处理时间序列数据。它是一个面向列的关系型数据库,在物联网、传感器数据和可观察性、金融服务和机器学习等领域有应用。该数据库的功能是用Java编写的,支持REST API,支持PostgreSQL线协议和InfluxDB线协议,允许以多种方式摄入和查询QuestDB的数据。
准备工作
QuestDB可以使用Docker、TAR文件或Homebrew等软件包管理器进行安装。而Confluent提供了一个Kafka发行版,即Confluent Platform,其附加组件可以缓解你的数据管道过程,可以使用Docker镜像或其下载的TAR文件来安装。
注意:Confluent平台与Apache Kafka是分开授权的。如果你想在生产环境中使用这个设置,请务必阅读以下内容。 Confluent平台许可证.
至于市场数据,你可以利用CoinCap API来整理ETH市场数据。但也有其他的流媒体金融数据资源。
文章中使用的所有文件都可以在这个GitHub仓库中找到。你可以克隆该仓库,直接完成这些步骤。
git clone https://github.com/Soot3/coincap_kafka_questdb.git
安装QuestDB和Kafka
就本文而言,你可以使用一个Docker Compose文件来安装两者,该文件为Kafka和QuestDB管道创建所需的Docker容器。
---
version: "3"
services:
zookeeper:
image: confluentinc/cp-zookeeper:7.0.1
hostname: zookeeper
container_name: zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
broker:
image: confluentinc/cp-server:7.0.1
hostname: broker
container_name: broker
depends_on:
- zookeeper
ports:
- "9092:9092"
- "9101:9101"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_METRIC_REPORTERS: io.confluent.metrics.reporter.ConfluentMetricsReporter
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_CONFLUENT_LICENSE_TOPIC_REPLICATION_FACTOR: 1
KAFKA_CONFLUENT_BALANCER_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9101
KAFKA_JMX_HOSTNAME: localhost
KAFKA_CONFLUENT_SCHEMA_REGISTRY_URL: http://schema-registry:8081
CONFLUENT_METRICS_REPORTER_BOOTSTRAP_SERVERS: broker:29092
CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS: 1
CONFLUENT_METRICS_ENABLE: "true"
CONFLUENT_SUPPORT_CUSTOMER_ID: "anonymous"
按照顺序,这个Docker Compose文件会安装Confluent管理的Kafka工具、Zookeeper和Kafka broker,它们管理Kafka生态系统中的连接和进程。然后,它安装了一个JDBC连接器,它将实现Kafka和任何关系型数据库(如QuestDB)之间的连接,这个特殊的JDBC连接器图像是一个定制的连接器,它是为了简化Confluent的Kafka服务和你的Postgres数据库之间的连接。 最后,它安装了QuestDB的最新版本。
你可以通过移动到Docker目录,然后运行Docker Compose文件来设置Kafka和QuestDB。
cd coincap_kafka_questdb/docker
安装过程应该需要几分钟的时间。你可以通过docker-compose ps 来检查服务是否已经启动并运行。一旦你看到connect 容器状态为healthy ,你的集群就可以开始了。
连接Kafka和QuestDB
在这一点上,你的Kafka集群和QuestDB实例仍然没有连接,它们之间没有传递数据的渠道。使用你安装的连接器,你可以通过设置连接器的配置设置来创建这种连接。
{
"name": "postgres-sink-eth",
"config": {
"connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector",
"tasks.max": "1",
"topics": "topic_ETH",
"key.converter": "org.apache.kafka.connect.storage.StringConverter",
"value.converter": "org.apache.kafka.connect.json.JsonConverter",
"connection.url": "jdbc:postgresql://questdb:8812/qdb?useSSL=false",
"connection.user": "admin",
"connection.password": "quest",
"key.converter.schemas.enable": "false",
"value.converter.schemas.enable": "true",
"auto.create": "false",
"insert.mode": "insert",
"pk.mode": "none"
}
}
在这里,你要设置连接所监控的一个或多个主题,消息条目的格式,以及连接的认证细节。然后QuestDB默认接受admin和quest作为用户和密码。
你可以使用下面的命令将这个配置发送到你安装的连接器。
curl -X POST -H "Accept:application/json" -H "Content-Type:application/json" --data @postgres-sink-eth.json http://localhost:8083/connectors
当成功执行时,你应该能够看到一个JSON格式的响应,其中包括上述配置。
在这一点上,你有一个连接的QuestDB实例,它将监控topic_ETH 主题,并拉出任何发送到它的记录以存储在数据库中。然后你可以在数据库中为这些记录创建一个表。
QuestDB有一个交互式网络控制台,可以通过以下网址访问 本地主机:9000.在这里,你可以查询数据并直接生成一些简单的可视化数据。使用以下命令为你的CoinCap记录创建一个表。
CREATE TABLE topic_ETH (`timestamp` timestamp, currency symbol, amount float)
这为你的记录创建了一个格式化的表,下一步涉及生成将被发送到该表的记录。
使用CoinCap API和Python生成市场数据
使用CoinCap的API和一些Python代码,你可以创建一个Kafka Producer,它将实时生成数据。
# importing packages
import time, json
import datetime as dt
import requests
from kafka import KafkaProducer
这个Python代码在一个连续的循环中查询CoinCap API,每15秒生成ETH的市场价格。然后它处理这些数据并将其发送到Kafka主题topic_ETH ,在那里它可以被QuestDB消费。这里使用的数据模式和有效载荷只是一个例子,因为它没有利用QuestDB的一些优化,如分区。
你可以用以下命令运行这段代码。
# move back to the parent directory
cd ..
# Installing needed Python packages
pip install -r requirements.txt
# Run the python code
python producer.py
注意:如果你在使用 requirements.txt 文件 安装依赖项时遇到问题 ,特别是当你遇到 Microsoft Visual C++ 错误时,请先检查你的Python版本。Confluent-Kafka-Python包支持几个 Python版本 在写这篇文章时,在Windows上,特别是Python 3.7、3.8和3.9。如果你得到一个错误,即
librdkafka/rdkafka.h不存在,你可以尝试按照以下步骤 来做 GitHub 问题.在我们使用苹果M1的特殊情况下,我们通过执行以下程序解决了这个问题
brew install librdkafka
export LIBRARY_PATH=/opt/homebrew/Cellar/librdkafka/1.8.2/lib
export C_INCLUDE_PATH=/opt/homebrew/Cellar/librdkafka/1.8.2/include
pip3 install -r requirements.txt
随着生产者脚本的启动和运行,你将每15秒整理一次ETH市场价格,其中这些数据将被发送到你的Kafka主题。然后,你的QuestDB实例会自动用来自被监控的Kafka主题的数据更新其数据库。有了这个数据管道和连接,你的QuestDB实例将以15秒的时间间隔填充数据。
尝试运行以下命令几次,观察数据库从Kafka主题中自我更新。
SELECT * FROM 'topic_ETH'
QuestDB接口
有了QuestDB实例上的数据,你可以查询或修改它,甚至生成更多的记录发送到其他Kafka主题,从数据中创建物化视图和关键性能指标。
注意:要关闭本文中使用的已安装的容器,请移动到 coincap_kafka_questdb/docker 目录并运行以下命令。
docker-compose down
结论
数据管道是有效移动和转换数据供你使用的核心考虑因素。为了有效地整理来自哪里的原始数据,并将这些原始数据转化为有价值的洞察力,你需要数据管道。
在这篇文章中,你学到了如何用Kafka整理数据,并实现一个数据管道,收集实时ETH市场数据,并通过Kafka连接将数据存储到QuestDB。
QuestDB是一个开源的SQL数据库,专注于快速性能和易用性。它是对大批量时间序列数据的优化存储,无论是来自你的金融服务还是传感器应用,时间序列数据都在不断产生。它满足了高性能摄入和查询时间的需求。与Kafka结合使用,你可以从多个来源聚集数据,修改它们,并以适合你的最终用户或应用程序的不断更新的速度存储它们的使用。