MapReduce服务 MRS-ClickHouse表创建:创建本地复制表和分布式表

时间:2023-11-01 16:25:34

创建本地复制表和分布式表

  1. 客户端登录ClickHouse节点,例如:clickhouse client --host node-master3QsRI --multiline --port 9440 --secure;

    node-master3QsRI 参数为查看ClickHouse服务cluster等环境参数信息2对应的host_name参数的值

  2. 使用ReplicatedMergeTree引擎创建复制表。

    详细的语法说明请参考:https://clickhouse.tech/docs/zh/engines/table-engines/mergetree-family/replication/#creating-replicated-tables

    例如,如下在default_cluster_1集群节点上和default数据库下创建表名为test的ReplicatedMergeTree表:

    CREATE TABLE default.test ON CLUSTER default_cluster_1

    (

    `EventDate` DateTime,

    `id` UInt64

    )

    ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/test', '{replica}')

    PARTITION BY toYYYYMM(EventDate)

    ORDER BY id;

    参数说明如下:

    • ON CLUSTER语法表示分布式DDL,即执行一次就可在集群所有实例上创建同样的本地表。
    • default_cluster_1为查看ClickHouse服务cluster等环境参数信息2查询到的cluster集群标识符。
      ReplicatedMergeTree引擎族接收两个参数:
      • ZooKeeper中该表相关数据的存储路径。

        该路径必须在/clickhouse目录下,否则后续可能因为ZooKeeper配额不够导致数据插入失败

        为了避免不同表在ZooKeeper上数据冲突,目录格式必须按照如下规范填写:

        /clickhouse/tables/{shard}/default/test,其中/clickhouse/tables/{shard}为固定值,default为数据库名,test为创建的表名。

      • 副本名称,一般用{replica}即可。
    CREATE TABLE default.test ON CLUSTER default_cluster_1(    `EventDate` DateTime,     `id` UInt64)ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/test', '{replica}')PARTITION BY toYYYYMM(EventDate)ORDER BY id┌─host─────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐│ node-group-1tXED0002                   │  9000  │      0   │         │                   5   │                3   ││ node-group-1tXED0003                   │  9000  │      0   │         │                   4   │                3   ││ node-master1dOnG                       │  9000  │      0   │         │                   3   │                3   │└────────────────────┴────┴─────┴──── ┴─────────── ┴──────────┘┌─host─────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐│ node-master3QsRI                       │  9000  │      0   │         │                   2   │                0   ││ node-group-1tXED0001                   │  9000  │      0   │         │                   1   │                0   ││ node-master2OXQS                       │  9000  │      0   │         │                   0   │                0   │└────────────────────┴────┴─────┴──── ┴─────────── ┴──────────┘6 rows in set. Elapsed: 0.189 sec. 

  3. 使用Distributed引擎创建分布式表。

    例如,以下将在default_cluster_1集群节点上和default数据库下创建名为test_all 的Distributed表:

    CREATE TABLE default.test_all ON CLUSTER default_cluster_1

    (

    `EventDate` DateTime,

    `id` UInt64

    )

    ENGINE = Distributed(default_cluster_1, default, test, rand());

    CREATE TABLE default.test_all ON CLUSTER default_cluster_1(    `EventDate` DateTime,     `id` UInt64)ENGINE = Distributed(default_cluster_1, default, test, rand())┌─host─────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐│ node-group-1tXED0002                   │  9000  │      0   │         │                   5   │                0   ││ node-master3QsRI                       │  9000  │      0   │         │                   4   │                0   ││ node-group-1tXED0003                   │  9000  │      0   │         │                   3   │                0   ││ node-group-1tXED0001                   │  9000  │      0   │         │                   2   │                0   ││ node-master1dOnG                       │  9000  │      0   │         │                   1   │                0   ││ node-master2OXQS                       │  9000  │      0   │         │                   0   │                0   │└────────────────────┴────┴─────┴──── ┴─────────── ┴──────────┘6 rows in set. Elapsed: 0.115 sec. 

    Distributed引擎需要以下几个参数:

    • default_cluster_1为查看ClickHouse服务cluster等环境参数信息2查询到的cluster集群标识符。
    • default本地表所在的数据库名称。
    • test为本地表名称,该例中为2中创建的表名。
    • (可选的)分片键(sharding key)

      该键与config.xml中配置的分片权重(weight)一同决定写入分布式表时的路由,即数据最终落到哪个物理表上。它可以是表中一列的原始数据(如site_id),也可以是函数调用的结果,如上面的SQL语句采用了随机值rand()。注意该键要尽量保证数据均匀分布,另外一个常用的操作是采用区分度较高的列的哈希值,如intHash64(user_id)。

support.huaweicloud.com/cmpntguide-mrs/mrs_01_2398.html