• 大数据ClickHouse(七):Special系列表引擎


    文章目录

    Special系列表引擎

    一、Memory

    ​​​​​​​二、Merge

    三、Distributed


    Special系列表引擎

    一、Memory

    Memory表引擎直接将数据保存在内存中,ClickHouse中的Memory表引擎具有以下特点:

    • Memory 引擎以未压缩的形式将数据存储在 RAM 中,数据完全以读取时获得的形式存储。
    • 并发数据访问是同步的,锁范围小,读写操作不会相互阻塞。
    • 不支持索引。
    • 查询是并行化的,在简单查询上达到最大速率(超过10 GB /秒),在相对较少的行(最多约100,000,000)上有高性能的查询。
    • 没有磁盘读取,不需要解压缩或反序列化数据,速度更快(在许多情况下,与 MergeTree 引擎的性能几乎一样高)。
    • 重新启动服务器时,表存在,但是表中数据全部清空。
    • Memory引擎多用于测试。

    示例:

    1. #在 newdb中创建表 t_memory ,表引擎使用Memory
    2. node1 :) create table t_memory(id UInt8 ,name String, age UInt8) engine = Memory;
    3. CREATE TABLE t_memory
    4. (
    5. `id` UInt8,
    6. `name` String,
    7. `age` UInt8
    8. )
    9. ENGINE = Memory
    10. Ok.
    11. 0 rows in set. Elapsed: 0.008 sec.
    12. #向表 t_memory中插入数据
    13. node1 :) insert into t_memory values (1,'张三',18),(2,'李四',19),(3,'王五',20);
    14. INSERT INTO t_memory VALUES
    15. Ok.
    16. 3 rows in set. Elapsed: 0.004 sec.
    17. #查询表t_memory中的数据
    18. node1 :) select * from t_memory;
    19. SELECT *
    20. FROM t_memory
    21. ┌─id─┬─name─┬─age─┐
    22. │ 1 │ 张三 │ 18 │
    23. │ 2 │ 李四 │ 19 │
    24. │ 3 │ 王五 │ 20 │
    25. └────┴──────┴─────┘
    26. 3 rows in set. Elapsed: 0.004 sec.
    27. #重启clickhouse 服务
    28. [root@node1 ~]# service clickhouse-server restart
    29. Stop clickhouse-server service: DONE
    30. Start clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/
    31. DONE
    32. #进入 newdb 库,查看表 t_memory数据,数据为空。
    33. node1 :) select * from t_memory;
    34. SELECT *
    35. FROM t_memory
    36. Ok.
    37. 0 rows in set. Elapsed: 0.003 sec.

    注意:”Memory”表引擎写法固定,不能小写。同时创建好表t_memory后,在对应的磁盘目录/var/lib/clickhouse/data/newdb下没有“t_memory”目录,基于内存存储,当重启ClickHouse服务后,表t_memory存在,但是表中数据全部清空。

    ​​​​​​​​​​​​​​二、Merge

    Merge 引擎 (不要跟 MergeTree 引擎混淆) 本身不存储数据,但可用于同时从任意多个其他的表中读取数据,这里需要多个表的结构相同,并且创建的Merge引擎表的结构也需要和这些表结构相同才能读取。

    读是自动并行的,不支持写入。读取时,那些被真正读取到数据的表如果设置了索引,索引也会被使用。

    Merge 引擎的参数:一个数据库名和一个用于匹配表名的正则表达式:

    Merge(数据库, 正则表达式)

    例如:Merge(hits, '^WatchLog') 表示数据会从 hits 数据库中表名匹配正则 ‘^WatchLog’ 的表中读取。

    注意:当选择需要读取的表时,会匹配正则表达式匹配上的表,如果当前Merge表的名称也符合正则表达式匹配表名,这个Merge表本身会自动排除,以避免进入递归死循环,当然也可以创建两个相互无限递归读取对方数据的 Merge 表,但这并没有什么意义。

    示例:

    1. #在newdb库中创建表m_t1,并插入数据
    2. node1 :) create table m_t1 (id UInt8 ,name String,age UInt8) engine = TinyLog;
    3. node1 :) insert into m_t1 values (1,'张三',18),(2,'李四',19)
    4. #在newdb库中创建表m_t2,并插入数据
    5. node1 :) create table m_t2 (id UInt8 ,name String,age UInt8) engine = TinyLog;
    6. node1 :) insert into m_t2 values (3,'王五',20),(4,'马六',21)
    7. #在newdb库中创建表m_t3,并插入数据
    8. node1 :) create table m_t3 (id UInt8 ,name String,age UInt8) engine = TinyLog;
    9. node1 :) insert into m_t3 values (5,'田七',22),(6,'赵八',23)
    10. #在newdb库中创建表t_merge,使用Merge引擎,匹配m开头的表
    11. node1 :) create table t_merge (id UInt8,name String,age UInt8) engine = Merge(newdb,'^m');
    12. #查询 t_merge表中的数据
    13. node1 :) select * from t_merge;
    14. SELECT *
    15. FROM t_merge
    16. ┌─id─┬─name──┬─age─┐
    17. │ 1 │ 张三 │ 18 │
    18. │ 2 │ 李四 │ 19 │
    19. └────┴───────┴─────┘
    20. ┌─id─┬─name─┬─age─┐
    21. │ 3 │ 王五 │ 20 │
    22. │ 4 │ 马六 │ 21 │
    23. └────┴──────┴─────┘
    24. ┌─id─┬─name─┬─age─┐
    25. │ 5 │ 田七 │ 22 │
    26. │ 6 │ 赵八 │ 23 │
    27. └────┴──────┴─────┘
    28. 6 rows in set. Elapsed: 0.008 sec.

     注意:t_merge表不会在对应的库路径下产生对应的目录结构。

    三、Distributed

    Distributed是ClickHouse中分布式引擎,之前所有的操作虽然说是在ClickHouse集群中进行的,但是实际上是在node1节点中单独操作的,与node2、node3无关,使用分布式引擎声明的表才可以在其他节点访问与操作。

    Distributed引擎和Merge引擎类似,本身不存放数据,功能是在不同的server上把多张相同结构的物理表合并为一张逻辑表。

    分布式引擎语法:

    Distributed(cluster_name, database_name, table_name[, sharding_key])

    对以上语法解释:

    • cluster_name:集群名称,与集群配置中的自定义名称相对应。配置在/etc/metrika.xml文件中,如下图:

    • database_name:数据库名称。
    • table_name:表名称。
    • sharding_key:可选的,用于分片的key值,在数据写入的过程中,分布式表会依据分片key的规则,将数据分布到各个节点的本地表。

    注意:创建分布式表是读时检查的机制,也就是说对创建分布式表和本地表的顺序并没有强制要求。

    示例:

    1. #在node1、node2、node3节点上启动ClickHouse 服务
    2. [root@node1 ~]# service clickhouse-server start
    3. [root@node2 ~]# service clickhouse-server start
    4. [root@node3 ~]# service clickhouse-server start
    5. #使用默认的default库,在每个节点上创建表 test_table
    6. node1 :) create table test_local (id UInt8,name String) engine= TinyLog
    7. node2 :) create table test_local (id UInt8,name String) engine= TinyLog
    8. node3 :) create table test_local (id UInt8,name String) engine= TinyLog
    9. #在node1上创建分布式表 t_distributed,表引擎使用 Distributed 引擎
    10. node1 :) create table t_distributed(id UInt8,name String) engine = Distributed(clickhouse_cluster_3shards_1replicas,default,test_local,id);
    11. 注意:以上分布式表 t_distributed 只存在与node1节点的clickhouse中。
    12. #分别在node1、node2、node3节点上向表test_local中插入2条数据
    13. node1 :) insert into test_local values (1,'张三'),(2,'李四');
    14. node2 :) insert into test_local values (3,'王五'),(4,'马六');
    15. node3 :) insert into test_local values (5,'田七'),(6,'赵八');
    16. #查询分布式表 t_distributed 中的数据
    17. node1 :) select * from t_distributed;
    18. SELECT *
    19. FROM t_distributed
    20. ┌─id─┬─name──┐
    21. │ 1 │ 张三 │
    22. │ 2 │ 李四 │
    23. └────┴───────┘
    24. ┌─id─┬─name─┐
    25. │ 5 │ 田七 │
    26. │ 6 │ 赵八 │
    27. └────┴──────┘
    28. ┌─id─┬─name─┐
    29. │ 3 │ 王五 │
    30. │ 4 │ 马六 │
    31. └────┴──────┘
    32. 6 rows in set. Elapsed: 0.010 sec.
    33. #向分布式表 t_distributed 中插入一些数据,然后查询 node1、node2、node3节点上的test_local数据,发现数据已经分布式存储在不同节点上
    34. node1 :) insert into t_distributed values (7,'zs'),(8,'ls'),(9,'ww'),(10,'ml'),(11,'tq'),(12,'zb');
    35. #node1查询本地表 test_local
    36. node1 :) select * from test_local;
    37. SELECT *
    38. FROM test_local
    39. ┌─id─┬─name─┐
    40. │ 1 │ 张三 │
    41. │ 2 │ 李四 │
    42. │ 9 │ ww │
    43. │ 12 │ zb │
    44. └────┴──────┘
    45. 4 rows in set. Elapsed: 0.004 sec.
    46. #node2查询本地表 test_local
    47. node2 :) select * from test_local;
    48. SELECT *
    49. FROM test_local
    50. ┌─id─┬─name─┐
    51. │ 3 │ 王五 │
    52. │ 4 │ 马六 │
    53. │ 7 │ zs │
    54. │ 10 │ ml │
    55. └────┴──────┘
    56. 4 rows in set. Elapsed: 0.004 sec.
    57. #node3查询本地表 test_local
    58. node3 :) select * from test_local;
    59. SELECT *
    60. FROM test_local
    61. ┌─id─┬─name─┐
    62. │ 5 │ 田七 │
    63. │ 6 │ 赵八 │
    64. │ 8 │ ls
    65. │ 11 │ tq │
    66. └────┴──────┘
    67. 4 rows in set. Elapsed: 0.005 sec.

    以上在node1节点上创建的分布式表t_distributed 虽然数据是分布式存储在每个clickhouse节点上的,但是只能在node1上查询t_distributed 表,其他clickhouse节点查询不到此分布式表。如果想要在每台clickhouse节点上都能访问分布式表我们可以指定集群,创建分布式表:

    1. #创建分布式表 t_cluster ,引擎使用Distributed 引擎
    2. node1 :) create table t_cluster on cluster clickhouse_cluster_3shards_1replicas (id UInt8,name String) engine = Distributed(clickhouse_cluster_3shards_1replicas,default,test_local,id);
    3. CREATE TABLE t_cluster ON CLUSTER clickhouse_cluster_3shards_1replicas
    4. (
    5. `id` UInt8,
    6. `name` String
    7. )
    8. ENGINE = Distributed(clickhouse_cluster_3shards_1replicas, default, test_local, id)
    9. ┌─host──┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
    10. │ node3 │ 9000 │ 0 │ │ 2 │ 0 │
    11. │ node2 │ 9000 │ 0 │ │ 1 │ 0 │
    12. │ node1 │ 9000 │ 0 │ │ 0 │ 0 │
    13. └───────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
    14. 3 rows in set. Elapsed: 0.152 sec.

    上面的语句中使用了ON CLUSTER分布式DDL(数据库定义语言),这意味着在集群的每个分片节点上,都会创建一张Distributed表,这样便可以从其中任意一端发起对所有分片的读、写请求。


    • 📢博客主页:https://lansonli.blog.csdn.net
    • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
    • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
    • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨
  • 相关阅读:
    ANSYS_Q3D仿真激光发射的寄生电感
    TL072ACDR 丝印072AC SOP-8 双路JFET输入运算放大器芯片
    Unity中Shader的ShadowMapping的原理(阴影)
    抢跑前装量产赛道,这家自动驾驶公司为何要自研域控制器?
    大数据题目的解题技巧
    反射和序列化操作会破坏单例模式
    为什么国内用户不选择商务智能(BI)工具?_光点科技
    我认识Handler又多了一点点...
    java版直播商城平台规划及常见的营销模式 电商源码/小程序/三级分销+商城免费搭建
    第2-1-4章 SpringBoot整合FastDFS文件存储服务
  • 原文地址:https://blog.csdn.net/xiaoweite1/article/details/126206657