打造生产环境-高性能Clickhouse集群表-5层建表结构

构建高性能 ClickHouse 集群表的五层建表结构

在生产环境中,为了实现高效的数据摄取、存储、查询以及分布式计算性能优化,可以基于 ClickHouse 的特性设计五层建表结构。以下是基于 Kafka 数据流和 ClickHouse 的集群表设计方案。

总体表架构图

在这里插入图片描述

五层建表架构简介

Kafka 驱动表层

使用 Kafka 引擎表实现对 Kafka 消息的实时消费和摄取。

View 视图层

通过物化视图消费 Kafka 表中的数据,实现实时数据导入,同时保留必要的转换逻辑。

分布式入库层

分布式表用于管理多个节点上的本地表,以实现水平扩展和集群化数据分布。

Id 分区本地表层

以分区机制存储数据的本地表,分区可以基于 ID、时间等,提供高效查询和存储性能。

分布式查询层

分布式表的读写层,用于对整个集群中的数据进行统一查询和管理。

1. 创建kafka引擎表

CREATE TABLE hmys.shzy_dwzz_kafkav2  on cluster enic_cluster2
(
 `id` Int32,
    `uuid` Nullable(String) COMMENT '外部uuid唯一标识',
    `user_no` Nullable(Int32) COMMENT '用户ID',
    `member_no` Nullable(Int32) COMMENT '登陆者ID',
    `device_sn` Nullable(String) COMMENT '设备SN码',
    `device_no` Nullable(Int32) COMMENT '设备编号',
    `device_type` Nullable(Int32) COMMENT '',
    `created_at` Nullable(DateTime) COMMENT '创建时间',
    `creator` Nullable(String) COMMENT '创建者',
    `updated_at` Nullable(DateTime) COMMENT '修改时间',
    `modifier` Nullable(String) COMMENT '修改者',
    `ecg_feq` Nullable(Int32) COMMENT '采样频率',
    `ecg_len` Nullable(Int32) COMMENT '波形长度',
    `begin_time` Nullable(DateTime) COMMENT '开始时间',
    `end_time` Nullable(DateTime) COMMENT '结束时间',
    `take_time` Nullable(DateTime) COMMENT '检查时间',
    `file_image_path` Nullable(String) COMMENT '一段图URL',
    `file_image_detail` Nullable(String) COMMENT '详情图URL',
    `ecg_image_index_path` Nullable(String) COMMENT 'HW首页透明色背景',
    `type` Nullable(Int32) COMMENT '  ',
    `_version` UInt32
) ENGINE = Kafka()
SETTINGS kafka_broker_list ='192.168.1.128:9092,192.168.1.143:9092',
         kafka_topic_list = 'hmys_shzy_dwzz_2',
         kafka_group_name = 'hmys_shzy_dwzz',
         kafka_format = 'JSONEachRow',
       kafka_row_delimiter = '\n',
       kafka_skip_broken_messages = 1;

2。 创建本地表


CREATE TABLE hmys.shzy_dwzz_localv2  on cluster enic_cluster2
(
   `id` Int32,
       `uuid` Nullable(String) COMMENT '外部uuid唯一标识',
    `user_no` Nullable(Int32) COMMENT '用户ID',
    `member_no` Nullable(Int32) COMMENT '登陆者ID',
    `device_sn` Nullable(String) COMMENT '设备SN码',
    `device_no` Nullable(Int32) COMMENT '设备编号',
    `device_type` Nullable(Int32) COMMENT '',
    `created_at` Nullable(DateTime) COMMENT '创建时间',
    `creator` Nullable(String) COMMENT '创建者',
    `updated_at` Nullable(DateTime) COMMENT '修改时间',
    `modifier` Nullable(String) COMMENT '修改者',
    `ecg_feq` Nullable(Int32) COMMENT '采样频率',
    `ecg_len` Nullable(Int32) COMMENT '波形长度',
    `begin_time` Nullable(DateTime) COMMENT '开始时间',
    `end_time` Nullable(DateTime) COMMENT '结束时间',
    `take_time` Nullable(DateTime) COMMENT '检查时间',
    `file_image_path` Nullable(String) COMMENT '一段图URL',
    `file_image_detail` Nullable(String) COMMENT '详情图URL',
    `ecg_image_index_path` Nullable(String) COMMENT 'HW首页透明色背景',
    `type` Nullable(Int32) COMMENT '  ',
    `_version` UInt32
)
ENGINE = ReplacingMergeTree(_version)
PARTITION BY id % 8
ORDER BY ( id)
SETTINGS index_granularity = 8192, allow_nullable_key = 1;

3. 创建分布式表-管理本地表


CREATE TABLE hmys.shzy_dwzzv2  on cluster enic_cluster2 (
`id` Int32,
       `uuid` Nullable(String) COMMENT '外部uuid唯一标识',
    `user_no` Nullable(Int32) COMMENT '用户ID',
    `member_no` Nullable(Int32) COMMENT '登陆者ID',
    `device_sn` Nullable(String) COMMENT '设备SN码',
    `device_no` Nullable(Int32) COMMENT '设备编号',
    `device_type` Nullable(Int32) COMMENT '',
    `created_at` Nullable(DateTime) COMMENT '创建时间',
    `creator` Nullable(String) COMMENT '创建者',
    `updated_at` Nullable(DateTime) COMMENT '修改时间',
    `modifier` Nullable(String) COMMENT '修改者',
    `ecg_feq` Nullable(Int32) COMMENT '采样频率',
    `ecg_len` Nullable(Int32) COMMENT '波形长度',
    `begin_time` Nullable(DateTime) COMMENT '开始时间',
    `end_time` Nullable(DateTime) COMMENT '结束时间',
    `take_time` Nullable(DateTime) COMMENT '检查时间',
    `file_image_path` Nullable(String) COMMENT '一段图URL',
    `file_image_detail` Nullable(String) COMMENT '详情图URL',
    `ecg_image_index_path` Nullable(String) COMMENT 'HW首页透明色背景',
    `type` Nullable(Int32) COMMENT '  ',
    `_version` UInt32
)  ENGINE = Distributed(enic_cluster2,hmys,shzy_dwzz_localv2,id % 8);

4. 创建物化视图表,消费kafka表数据,导入到分布式表中

CREATE MATERIALIZED VIEW hmys.shzy_dwzz_kafka_viewv2   on cluster enic_cluster2 TO hmys.shzy_dwzzv2 AS
SELECT * FROM  hmys.shzy_dwzz_kafkav2 ;

总结

五层建表结构实现了从数据摄取到查询的高效数据处理流程:

Kafka 驱动表层:实时数据接入。
View 视图层:负责数据的转换和消费。
分布式入库层:构建全局分布式存储。
Id 分区本地表层:优化单节点存储和查询性能。
分布式查询层:高效的跨节点查询。

### 自动创表结构的最佳实践 在 ClickHouse 中自动创表结构可以通过多种方式实现,尤其是在数据源具有明确格式的情况下(如 CSV、JSON 等)。以下为几种常见场景下的自动方式及配置示例。 --- ### 使用 `file` 函数自动推断结构 ClickHouse 提供了 `file()` 函数,可以自动从 CSV 或 JSON 文件中推断列类型并创临时。该方式适用于一次性导入或测试场景。 ```sql CREATE TABLE auto_table AS SELECT * FROM file('data.csv', 'CSVWithNames'); ``` 此语句会读取 `data.csv` 文件并自动识别字段名和类型,适用于结构清晰的 CSV 文件。 --- ### 使用 `generateDDL` 配合 `file` 函数生成语句 为了将自动推断的结构持久化为正式,可先通过 `file()` 函数读取数据,再使用 `generateDDL` 工具生成语句。 ```sql SELECT generateDDL('auto_table', 'default', 'CSVWithNames', 'data.csv'); ``` 该语句会输出完整的语句,用户可将其复制执行以创正式--- ### 在 ETL 工具中自动(如 SeaTunnel) 在数据集成工具中(如 Apache SeaTunnel),可通过配置自动功能,根据源数据结构动态创目标。以下为 SeaTunnel 的配置示例: ```hocon env { job.mode = "BATCH" } source { LocalFile { path = "/data/input/data.csv" format = "csv" schema = { fields { id = "int" name = "string" value = "float" } } } } sink { ClickHouse { host = "localhost:8123" database = "default" table = "auto_table" username = "default" password = "" auto.create = true fields = ["id", "name", "value"] engine = "MergeTree" order_by = "id" } } ``` 在该配置中,`auto.create = true` 示如果目标不存在,则自动创;`engine` 和 `order_by` 指定了时使用的引擎和排序字段。 --- ### 使用 ClickHouse Keeper 实现结构同步 在集群环境中,若需多个节点保持一致的表结构,可结合 ClickHouse Keeper 实现自动结构同步。以下为配置示例: ```xml <yandex> <zookeeper> <node index="1"> <host>zookeeper1</host> <port>2181</port> </node> </zookeeper> </yandex> ``` 结合 `ReplicatedMergeTree` 引擎可实现自动结构复制: ```sql CREATE TABLE replicated_table ( id UInt32, name String ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/replicated_table', '{replica}') ORDER BY id; ``` 该方式适用于高可用和分布式部署场景,确保所有副本结构一致。 --- ### 最佳实践总结 - **测试环境**:优先使用 `file()` 函数快速验证数据结构。 - **生产环境**:结合 ETL 工具自动,或使用 DDL 工具生成语句。 - **集群部署**:采用 `ReplicatedMergeTree` 引擎与 ZooKeeper 配合,确保结构一致性。 - **性能优化**:根据数据量和查询模式选择合适的排序字段和分区策略。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值