实时数据,触手可及!高效使用托管服务,更轻松挖掘数据价值

ff132045f68e69c787e1fd692f48be57.gif

ClickHouse 介绍

ClickHouse 是⼀个⽤于联机分析(OLAP)的列式数据库管理系统(DBMS)。根据其官⽅⽹站介绍,ClickHouse 作为⼀款⾼性能列式分析数据库,通过列式存储、向量化执行、压缩编码、分布式查询处理等手段实现了出色的写和查询吞吐能力、低延迟、高可扩展性。适⽤于⼤规模实时数据分析、事件⽇志处理、在线分析等应⽤场景。

ClickHouse 实时数据摄取

在许多业务场景下,如⼴告推荐、金融交易、⽹络监控、⽇志分析等,都对数据分析有很强的实时性需求。ClickHouse 作为具有实时数据摄⼊能⼒的⾯向 OLAP 的分析型数据库,实时数据摄取与分析是其重要应⽤场景之⼀。

在这篇⽂章中,我们会介绍通过 Amazon MSK、Amazon MSK Connect ClickHouse Kafka Connector 以及 Amazon Glue Schema Registry 来搭建端到端的全托管⽆服务器架构的实时数据摄取能⼒,并且通过 ClickHouse 与 Amazon S3 的集成来降低海量实时数据存储的成本。

整体架构

52d8840c0e1abe92d71290c45701166f.png

在整体架构中,我们要求数据⽣产者从数据源获取数据与 schema,并将 schema(Apache Avro 格式)注册到 Amazon Glue Schema Registry 中,然后将带有 schema 信息的数据发送到 Amazon MSK 中。

在数据消费端,我们在 ClickHouse Kafka Connector 中增加了对于 Amazon Glue Schema Registry 以及 Apache Avro 格式的⽀持,并将其部署在 Amazon MSK Connect 上。

ClickHouse Connector 从 Amazon MSK 中批量拉取消息并进⾏处理,然后插⼊到  ClickHouse 中。ClickHouse 使⽤ Amazon S3 作为持久存储。

ClickHouse 部署

我们可以根据官⽅⽂档将 ClickHouse 以单机⽅式或者集群⽅式部署到 Amazon EC2 上,并且参考⽂档将数据存储到 Amazon S3 上。需要注意,ClickHouse 需要的端⼝较多,需要在安全组中对应地打开。

aa8c9e0fd04c5778e1e39c05407c58b2.png

参考文档

扫码了解更多

12251ae9c442900efb1bf066f9e3ce05.png

文档

扫码了解更多

8fe8ab268bec307819da57a1ef7c9f28.png

端口

扫码了解更多

左右滑动查看更多

06df7b51e20335ec96ec57c9b43b4c7e.png

安全组样例

也可以从亚马逊云科技 Marketplace 上搜索订阅 ClickHouse Cloud 、ByteHouse 等托管版本,或者使用基于亚马逊云科技的 ClickHouse Cluster ⼀键部署⽅案。

83ee5126d445e9082f69515623a19162.png

 基于亚马逊云科技的 ClickHouse Cluster 

扫码了解更多

Amazon MSK 以及 

Amazon Glue Schema Registry 部署

Amazon MSK 是亚马逊云科技上提供的全托管的 Kafka 服务,其中 Amazon MSK Serverless 是其⽆服务器版本。MSK Connect 是 Amazon MSK 上的基于 Kafka Connect 的⼀项功能。通过不同的 Connector,MSK Connect 可以从不同的数据源抽取数据到 MSK 以及写⼊到不同的数据源。

Amazon Glue Schema Registry 是亚⻢逊云科技上托管的 schema 注册发现中⼼,⽬前⽀持 Avro、JSON 以及 Protobuf 等格式。

具体步骤:

1.这⾥我们选⽤ Amazon MSK Serverless。Amazon MSK Serverless 配置相对简单,我们可以选择与 ClickHouse 联通的⼦⽹以及安全组。

c77f5db1344ea312cfcd223cd19470a1.png

Amazon MSK Serverless ⽹络配置样例

2.获取连接信息。

0d318169b2c09f2ee5d3a7d4c0a9afd5.png

3.在 MSK Serverless 选⽤的⼦⽹内为 Glue Schema Registry 创建 VPCE(即使⼦⽹已经有通往 IGW/NATGW 的路由)。

302fd9482e019798ddf27365c2fcbe72.png

75b2eb79022dbb589b14c89c2c7adb71.png

4.在 MSK Connect 下创建 Worker Configuration,注意 value.converter.endpoint 的值为 Glue Schema Registry 的 VPCE,其他配置根据消息内容调整。

offset.storage.partitions=5
status.storage.partitions=2
key.converter=org.apache.kafka.connect.storage.StringConverter
value.converter.schemas.enable=true
value.converter=com.amazonaws.services.schemaregistry.kafkaconnect.AWSKafkaAvroConverter
value.converter.region=us-west-2
value.converter.registry.name=default-registry
value.converter.schemaAutoRegistrationEnabled=true
value.converter.compatibility=BACKWARD
value.converter.avroRecordType=GENERIC_RECORD
value.converter.endpoint=https://vpce-YOUR_VPCE_DNS_NAME.glue.us-west-2.vpce.amazonaws.com

左右滑动查看更多

ClickHouse Kafka Connector 构建

ClickHouse Kafka Connector 是官⽅的从 Kafka Topic 中读取数据并写⼊ ClickHouse 的 Kafka Connect 插件。由于我们的 Apache Avro Schema 存储在 Glue Schema Registry 中,因此需要在官⽅ zip 包中增加两个 JAR。

1.从 https://gcom/awslabs/aws-glue-schema-registry 下载源码,执⾏:

b3cd43c74c1af5b224303ddcb1888bd2.png

官方 zip 包

扫码了解更多

3f467e8196cc714d5dbb55baf9edf76a.png

下载源码

扫码了解更多

左右滑动查看更多

mvn clean install

得到 schema-registry-kafkaconnect-converter-1.1.18.jar。

bf4046b27e07f8c00ff4603203a22297.png

2.下载 mysql jdbc。

3.unzip ClickHouse Kafka Connector,添加上述 jar,然后再次 zip。

f53c3c9ddcf76d857204ab059df3070d.png

4.上传到 Amazon S3 并且创建 MSK Connect Plugin。

dabd01123751e5df0079b0312c247629.png

测试与验证

我们使⽤ ClickStream Kafka Producer 来进⾏测试。

1.创建可以连通 MSK Serverless 以及 ClickHouse 的 EC2(Kafka Producer)。

2.⽤于连接 MSK Serverless 的 IAM Policy 并附加到 Kafka Producer 对应的 IAM Role 上。

IAM Policy msk-serverless ⽰例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:Connect",
                "kafka-cluster:AlterCluster",
                "kafka-cluster:DescribeCluster"
            ],
            "Resource": "arn:aws:kafka:us-west-2:YOUR_ACCOUNT_ID:cluster/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:DescribeTopic",
                "kafka-cluster:CreateTopic",
                "kafka-cluster:WriteData",
                "kafka-cluster:ReadData"
            ],
            "Resource": "arn:aws:kafka:us-west-2:YOUR_ACCOUNT_ID:topic/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:AlterGroup",
                "kafka-cluster:DescribeGroup"
            ],
            "Resource": "arn:aws:kafka:us-west-2:YOUR_ACCOUNT_ID:group/*"
        }
    ]
}

左右滑动查看更多

在 Kafka Producer 上使⽤ Kafka 客户端(例如 https://gcom/dpkp/kafkapython)创建 Topic。

289f295d33fc3ad496194705dfc36c7d.png

Kafka 客户端

扫码了解更多

#!/usr/bin/python
# create_topic.py
from kafka import KafkaProducer, KafkaAdminClient
from kafka.admin import NewTopic
from kafka.errors import KafkaError
import socket
import time
from aws_msk_iam_sasl_signer import MSKAuthTokenProvider


class MSKTokenProvider():
    def token(self):
        token, _ = MSKAuthTokenProvider.generate_auth_token('us-west-2')
        return token


tp = MSKTokenProvider()


client = KafkaAdminClient(
    bootstrap_servers='YOUR_MSK_SERVERLESS_CONNECTION_INFO',
    security_protocol='SASL_SSL',
    sasl_mechanism='OAUTHBEARER',
    sasl_oauth_token_provider=tp,
    client_id=socket.gethostname(),
)


client.create_topics([NewTopic('ClickStream2',2,2)])

左右滑动查看更多

4.在 Kafka Producer 上安装 clickhouse-client 并创建表。

a1a633a61870a344610d5f2c7d75d849.png

clickhouse-client  

扫码了解更多

CREATE TABLE ClickStream2
(
    `ip` String,
    `eventtimestamp` Int64,
    `devicetype` String,
    `event_type` String,
    `product_type` String,
    `userid` Int32,
    `globalseq` Int64,
    `prevglobalseq` Int64
)
ENGINE = MergeTree
ORDER BY globalseq
SETTINGS storage_policy = 's3_main';

5.参考 Amazon Service Role For Kafka Connect,创建 MSK Connect 需要的 Execution Role。由于我们需要使⽤ Glue Schema Registry 和 MSK Serverless,因此也添加相应权限。

5117cdd14c0ef58d2056452f2ec78db9.jpeg

71085ec06e88683e4a5bb7cd3f7d1a28.png

IAM Policy msk-connect-service-linked 示例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateNetworkInterface"
            ],
            "Resource": "arn:aws:ec2:*:*:network-interface/*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/AmazonMSKConnectManaged": "true"
                },
                "ForAllValues:StringEquals": {
                    "aws:TagKeys": "AmazonMSKConnectManaged"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateNetworkInterface"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:subnet/*",
                "arn:aws:ec2:*:*:security-group/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags"
            ],
            "Resource": "arn:aws:ec2:*:*:network-interface/*",
            "Condition": {
                "StringEquals": {
                    "ec2:CreateAction": "CreateNetworkInterface"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeNetworkInterfaces",
                "ec2:CreateNetworkInterfacePermission",
                "ec2:AttachNetworkInterface",
                "ec2:DetachNetworkInterface",
                "ec2:DeleteNetworkInterface"
            ],
            "Resource": "arn:aws:ec2:*:*:network-interface/*",
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/AmazonMSKConnectManaged": "true"
                }
            }
        }
    ]
}

左右滑动查看更多

6.创建 MSK Connect,注意截图中的选项。其他可以保持默认。

c4d966f0dda8ba163be6ba80eb18bfe9.png

0de7918aa31afb3dedf187aee465bd2f.png

#Configuration settings
connector.class=com.clickhouse.kafka.connect.ClickHouseSinkConnector
hostname=HOST_NAME_OR_IP
database=default
password=CLICKHOUSE_CLIENT_PASSWORD
port=8123
tasks.max=1
topics=ClickStream2
errors.tolerance=all
exactlyOnce=false
ssl=false
username=default

左右滑动查看更多

选择上⼀章创建的 Worker configuration。

cb3a8316a128db6372c2f7e89d2c3437.jpeg

84b323a4a38bfb5edd731c2025a13f8d.png

7.等待 MSK Connect 创建成功并且 CloudWatch Logs 中没有报错信息。

8.在 Kafka Producer 上下载并编译 ClickStream Producer,修改 clickstreamproducer-for-apache-kafka/producer.properties。

f8b8d4ee4a2da7f18a4ae86c9db18a1a.png

 ClickStream Producer

扫码了解更多

# producer.properties
BOOTSTRAP_SERVERS_CONFIG=YOUR_MSK_SERVERLESS_CONNECTION_INFO

左右滑动查看更多

9.执⾏命令开始⽣产数据。

java -jar clickstream-producer-for-apache-kafka/target/KafkaClickstreamClient-1.0-SNAPSHOT.jar -t ClickStream2 -pfp /home/ubuntu/clickstream-producer-for-apache-kafka/producer.properties -nt 8 -rf 300 -iam --region us-west-2 -gsr -gsrr us-west-2 -gar

左右滑动查看更多

10.查看 CloudWatch Logs,ClickHouse 以及对应的 Amazon S3 路径,可以看到数据成功写⼊。

b676359628b39d55ea923dc303de09b0.png

bbd6b8124ccacf769de179b32eb0059c.png

3c6a632040b7aa3440a90d7a1be9ef5d.png

11.观察⼀段时间后可以暂停 Kafka Producer。通过观察 MSK Serverless 的指标,可以看到数据⽣产和消费⼏乎没有延迟。

a7534e8e682e79cd08c09886c39c2843.png

总结

ClickHouse 在实时数据摄取及分析上具有强⼤的功能,但是整体端到端的部署和运维具有⼀定的难度。通过 Amazon MSK、Amazon MSK Connect 以及 Amazon Glue Schema Registry 等托管服务,可以在很⼤程度上减轻运维的复杂度,使得⽤户能够更轻松地发掘数据的价值。

本篇作者

32f6876fdecf6a1c78a7e829f9cba5b1.jpeg

施俊

亚马逊云科技解决方案架构师,主要负责数字金融客户和企业级客户在亚马逊云科技上的架构设计与实施。10 余年金融软件研发和机器学习经验。

3500ad6936a9eeeee2c431d76e008744.jpeg

Michael Song

亚马逊云科技技术客户经理,负责金融、制造业和智能手机等企业级客户架构设计、优化和深度技术支持。具有十年以上的企业信息技术运维管理与服务设计经验。

e766c7594629feba6441efc96a6c10ee.png

e9d6550f551d4f775830c8846aa730ad.gif

星标不迷路,开发更极速!

关注后记得星标「亚马逊云开发者」

听说,点完下面4个按钮

就不会碰到bug了!

b617c32d831ab3879034bce4cd94bd8b.gif

点击阅读原文查看博客!获得更详细内容!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值