暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【ClickHouse实战】带你了解ClickHouse特性、搭建及操作

知否Tech 2020-11-03
669

    

 

   本文简单介绍下ClickHouse主要知识点及单机及集群模式搭建及简单操作。


  • 背景


随着物联网IOT时代的来临,IOT设备感知和报警存储的数据越来越大,有用的价值数据需要数据分析师去分析。大数据分析成了非常重要的环节。当然近两年开启的开源大潮,为大数据分析工程师提供了十分富余的工具。但这同时也增加了开发者选择合适的工具的难度,尤其对于新入行的开发者来说。学习成本,框架的多样化和复杂度成了很大的难题。例如kafka,hdfs,spark,hive 等等组合才能产生最后的分析结果。把各种开源框架、工具、库、平台人工整合到一起所需工作之复杂,是大数据领域开发和数据分析师常有的抱怨之一,也是他们支持大数据分析平台简单化和统一化的首要原因。


  • 发展历史


Yandex在2016年6月15日开源了一个数据分析的数据库,名字叫做ClickHouse,这对保守俄罗斯人来说是个特大事。更让人惊讶的是,这个列式存储数据库的跑分要超过很多流行的商业MPP数据库软件,例如Vertica。如果你没有听过Vertica,那你一定听过 Michael Stonebraker,2014年图灵奖的获得者,PostgreSQL和Ingres发明者(Sybase和SQL Server都是继承 Ingres而来的), Paradigm4和SciDB的创办者。Michael Stonebraker于2005年创办Vertica公司,后来该公司被HP收购,HP Vertica成为MPP列式存储商业数据库的高性能代表,Facebook就购买了Vertica数据用于用户行为分析。


什么是ClickHouse?

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。

在传统的行式数据库系统中,数据按如下顺序存储:



处于同一行中的数据总是被物理的存储在一起。

常见的行式数据库系统有:MySQL、Postgres和MS SQL Server。

在列式数据库系统中,数据按如下的顺序存储:



该示例中只展示了数据在列式数据库中数据的排列方式。

对于存储而言,列式数据库总是将同一列的数据存储在一起,不同列的数据也总是分开存储。

常见的列式数据库有:Vertica、 Paraccel (Actian Matrix,Amazon Redshift)、 Sybase IQ、 Exasol、 Infobright、 InfiniDB、 MonetDB (VectorWise, Actian Vector)、 LucidDB、 SAP HANA、 Google Dremel、 Google PowerDrill、 Druid、 kdb+。

不同的数据存储方式适用不同的业务场景,数据访问的场景包括:进行了何种查询、多久查询一次以及各类查询的比例;每种查询读取多少数据————行、列和字节;读取数据和写入数据之间的关系;使用的数据集大小以及如何使用本地的数据集;是否使用事务,以及它们是如何进行隔离的;数据的复制机制与数据的完整性要求;每种类型的查询要求的延迟与吞吐量等等。

系统负载越高,依据使用场景进行定制化就越重要,并且定制将会变的越精细。没有一个系统能够同时适用所有明显不同的业务场景。如果系统适用于广泛的场景,在负载高的情况下,要兼顾所有的场景,那么将不得不做出选择。是要平衡还是要效率?


OLAP场景的关键特征 

* 大多数是读请求

* 数据总是以相当大的批(> 1000 rows)进行写入

* 不修改已添加的数据

* 每次查询都从数据库中读取大量的行,但是同时又仅需要少量的列

* 宽表,即每个表包含着大量的列

* 较少的查询(通常每台服务器每秒数百个查询或更少)

* 对于简单查询,允许延迟大约50毫秒

* 列中的数据相对较小:数字和短字符串(例如,每个URL 60个字节)

* 处理单个查询时需要高吞吐量(每个服务器每秒高达数十亿行)

* 事务不是必须的

* 对数据一致性要求低

* 每一个查询除了一个大表外都很小

* 查询结果明显小于源数据,换句话说,数据被过滤或聚合后能够被盛放在单台服务器的内存中

    很容易可以看出,OLAP场景与其他通常业务场景(例如,OLTP或K/V)有很大的不同, 因此想要使用OLTP或Key-Value数据库去高效的处理分析查询场景,并不是非常完美的适用方案。例如,使用OLAP数据库去处理分析请求通常要优于使用MongoDB或Redis去处理分析请求。


ClickHouse的特性

真正的列式数据库管理系统

在一个真正的列式数据库管理系统中,除了数据本身外不应该存在其他额外的数据。这意味着为了避免在值旁边存储它们的长度«number»,你必须支持固定长度数值类型。例如,10亿个UInt8类型的数据在未压缩的情况下大约消耗1GB左右的空间,如果不是这样的话,这将对CPU的使用产生强烈影响。即使是在未压缩的情况下,紧凑的存储数据也是非常重要的,因为解压缩的速度主要取决于未压缩数据的大小。

这是非常值得注意的,因为在一些其他系统中也可以将不同的列分别进行存储,但由于对其他场景进行的优化,使其无法有效的处理分析查询。例如:HBase,BigTable,Cassandra,HyperTable。在这些系统中,你可以得到每秒数十万的吞吐能力,但是无法得到每秒几亿行的吞吐能力。

需要说明的是,ClickHouse不单单是一个数据库, 它是一个数据库管理系统。因为它允许在运行时创建表和数据库、加载数据和运行查询,而无需重新配置或重启服务。

数据压缩

在一些列式数据库管理系统中(例如:InfiniDB CE 和 MonetDB) 并没有使用数据压缩。但是, 若想达到比较优异的性能,数据压缩确实起到了至关重要的作用。

数据的磁盘存储

许多的列式数据库(如 SAP HANA, Google PowerDrill)只能在内存中工作,这种方式会造成比实际更多的设备预算。ClickHouse被设计用于工作在传统磁盘上的系统,它提供每GB更低的存储成本,但如果有可以使用SSD和内存,它也会合理的利用这些资源。

多核心并行处理

ClickHouse会使用服务器上一切可用的资源,从而以最自然的方式并行处理大型查询。

多服务器分布式处理 

上面提到的列式数据库管理系统中,几乎没有一个支持分布式的查询处理。

在ClickHouse中,数据可以保存在不同的shard上,每一个shard都由一组用于容错的replica组成,查询可以并行地在所有shard上进行处理。这些对用户来说是透明的

支持SQL


ClickHouse支持基于SQL的声明式查询语言,该语言大部分情况下是与SQL标准兼容的。

支持的查询包括 GROUP BY,ORDER BY,IN,JOIN以及非相关子查询。

不支持窗口函数和相关子查询。

支持数据复制和数据完整性

更多信息,参见 数据复制

1. 没有完整的事务支持。

2. 缺少高频率,低延迟的修改或删除已存在数据的能力。仅能用于批量删除或修改数据,但这符合 GDPR。

3. 稀疏索引使得ClickHouse不适合通过其键检索单行的点查询。

在一个真正的列式数据库管理系统中,除了数据本身外不应该存在其他额外的数据。这意味着为了避免在值旁边存储它们的长度«number»,你必须支持固定长度数值类型。例如,10亿个UInt8类型的数据在未压缩的情况下大约消耗1GB左右的空间,如果不是这样的话,这将对CPU的使用产生强烈影响。即使是在未压缩的情况下,紧凑的存储数据也是非常重要的,因为解压缩的速度主要取决于未压缩数据的大小。

需要说明的是,ClickHouse不单单是一个数据库, 它是一个数据库管理系统。因为它允许在运行时创建表和数据库、加载数据和运行查询,而无需重新配置或重启服务。

在一些列式数据库管理系统中(例如:InfiniDB CE 和 MonetDB) 并没有使用数据压缩。但是, 若想达到比较优异的性能,数据压缩确实起到了至关重要的作用。

许多的列式数据库(如 SAP HANA, Google PowerDrill)只能在内存中工作,这种方式会造成比实际更多的设备预算。ClickHouse被设计用于工作在传统磁盘上的系统,它提供每GB更低的存储成本,但如果有可以使用SSD和内存,它也会合理的利用这些资源。

ClickHouse会使用服务器上一切可用的资源,从而以最自然的方式并行处理大型查询。


在ClickHouse中,数据可以保存在不同的shard上,每一个shard都由一组用于容错的replica组成,查询可以并行地在所有shard上进行处理。这些对用户来说是透明的

支持SQL

ClickHouse支持基于SQL的声明式查询语言,该语言大部分情况下是与SQL标准兼容的。

不支持窗口函数和相关子查询。

向量引擎

为了高效的使用CPU,数据不仅仅按列存储,同时还按向量(列的一部分)进行处理,这样可以更加高效地使用CPU。

实时的数据更新

ClickHouse支持在表中定义主键。为了使查询能够快速在主键中进行范围查找,数据总是以增量的方式有序的存储在MergeTree中。因此,数据可以持续不断地高效的写入到表中,并且写入的过程中不会存在任何加锁的行为。

索引

按照主键对数据进行排序,这将帮助ClickHouse在几十毫秒以内完成对数据特定值或范围的查找。

适合在线查询

在线查询意味着在没有对数据做任何预处理的情况下以极低的延迟处理查询并将结果加载到用户的页面中。

支持近似计算

1. 用于近似计算的各类聚合函数,如:distinct values, medians, quantiles

2. 基于数据的部分样本进行近似查询。这时,仅会从磁盘检索少部分比例的数据。

3. 不使用全部的聚合条件,通过随机选择有限个数据聚合条件进行聚合。这在数据聚合条件满足某些分布条件下,在提供相当准确的聚合结果的同时降低了计算资源的使用。

ClickHouse使用异步的多主复制技术。当数据被写入任何一个可用副本后,系统会在后台将数据分发给其他副本,以保证系统在不同副本上保持相同的数据。在大多数情况下ClickHouse能在故障后自动恢复,在一些少数的复杂情况下需要手动恢复。

限制

1. 没有完整的事务支持。

2. 缺少高频率,低延迟的修改或删除已存在数据的能力。仅能用于批量删除或修改数据,但这符合 GDPR。

3. 稀疏索引使得ClickHouse不适合通过其键检索单行的点查询。


ClickHouse 和一些技术的比较

1.商业OLAP数据库

例如:HP Vertica, Actian the Vector,

区别:ClickHouse是开源而且免费的

2.云解决方案

例如:亚马逊RedShift和谷歌的BigQuery

区别:ClickHouse可以使用自己机器部署,无需为云付费

3.Hadoop生态软件

例如:Cloudera Impala, Spark SQL, Facebook Presto , Apache Drill

区别:

ClickHouse支持实时的高并发系统

ClickHouse不依赖于Hadoop生态软件和基础

ClickHouse支持分布式机房的部署

4.开源OLAP数据库

例如:InfiniDB, MonetDB, LucidDB

区别:这些项目的应用的规模较小,并没有应用在大型的互联网服务当中,相比之下,ClickHouse的成熟度和稳定性远远超过这些软件。

5.开源分析,非关系型数据库

例如:Druid , Apache Kylin

区别:ClickHouse可以支持从原始数据的直接查询,ClickHouse支持类SQL语言,提供了传统关系型数据的便利。


  • ClickHouse搭建



  • 环境准备

    1.取消文件打开数

    2.取消 SELINUX

    3.关闭防火墙

  • 安装依赖包

    yum install -y libtool

    yum install -y *unixODBC*


介质下载地址

https://clickhouse.tech/

https://packagecloud.io/Altinity/clickhouse


  • 安装


    #安装
    [root@nn72 clickhouse]# ll
    total 103412
    -rw-r--r-- 1 root root 6384 Oct 6 06:32 clickhouse-client-20.8.3.18-1.el7.x86_64.rpm
    -rw-r--r-- 1 root root 69093220 Oct 6 06:32 clickhouse-common-static-20.8.3.18-1.el7.x86_64.rpm
    -rw-r--r-- 1 root root 36772044 Oct 6 06:36 clickhouse-server-20.8.3.18-1.el7.x86_64.rpm
    -rw-r--r-- 1 root root 14472 Oct 6 06:36 clickhouse-server-common-20.8.3.18-1.el7.x86_64.rpm
    [root@nn72 clickhouse]# rpm -ivh *.rpm
    Preparing... ################################# [100%]
    Updating installing...
    1:clickhouse-server-common-20.8.3.1################################# [ 25%]
    2:clickhouse-common-static-20.8.3.1################################# [ 50%]
    3:clickhouse-server-20.8.3.18-1.el7################################# [ 75%]
    Create user clickhouse.clickhouse with datadir var/lib/clickhouse
    4:clickhouse-client-20.8.3.18-1.el7################################# [100%]
    Create user clickhouse.clickhouse with datadir var/lib/clickhouse
    [root@nn72 clickhouse]#


    #启动


    [root@nn72 clickhouse]# service clickhouse-server start
    Start clickhouse-server service: Path to data directory in etc/clickhouse-server/config.xml: var/lib/clickhouse/
    DONE
    [root@nn72 clickhouse]# netstat -anlp |grep 9000
    tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 219452/clickhouse-s
    tcp6 0 0 ::1:9000 :::* LISTEN 219452/clickhouse-s
    [root@nn72 clickhouse]#


    #登录客户端连接server


    [root@nn72 clickhouse]# clickhouse-client
    ClickHouse client version 20.8.3.18.
    Connecting to localhost:9000 as user default.
    Connected to ClickHouse server version 20.8.3 revision 54438.


    nn72.hdp71.unicom :)


    • 主要参数介绍

      


    • client示例

      #client 示例
      #-q 非交互模式
      [root@nn72 clickhouse]# clickhouse-client -q 'show databases;'
      _temporary_and_external_tables
      default
      system
      [root@nn72 clickhouse]#
      #-d指定数据库
      [root@nn72 clickhouse]# clickhouse-client -d system
      ClickHouse client version 20.8.3.18.
      Connecting to database system at localhost:9000 as user default.
      Connected to ClickHouse server version 20.8.3 revision 54438.


      nn72.hdp71.unicom :) show tables;


      SHOW TABLES


      ┌─name───────────────────────────┐
      │ aggregate_function_combinators │
      │ asynchronous_metric_log │
      │ asynchronous_metrics │
      │ build_options │
      │ clusters │
      │ collations │
      │ columns │
      │ contributors │
      │ current_roles │
      │ data_type_families │
      │ databases │
      │ detached_parts │
      │ dictionaries │
      │ disks │
      │ distribution_queue │
      │ enabled_roles │
      │ events │
      │ formats │
      │ functions │
      │ grants │
      │ graphite_retentions │
      │ licenses │
      │ macros │
      │ merge_tree_settings │
      │ merges │
      │ metric_log │
      │ metrics │
      │ models │
      │ mutations │
      │ numbers │
      │ numbers_mt │
      │ one │
      │ parts │
      │ parts_columns │
      │ privileges │
      │ processes │
      │ query_log │
      │ query_thread_log │
      │ quota_limits │
      │ quota_usage │
      │ quotas │
      │ quotas_usage │
      │ replicas │
      │ replication_queue │
      │ role_grants │
      │ roles │
      │ row_policies │
      │ settings │
      │ settings_profile_elements │
      │ settings_profiles │
      │ stack_trace │
      │ storage_policies │
      │ table_engines │
      │ table_functions │
      │ tables │
      │ time_zones │
      │ trace_log │
      │ user_directories │
      │ users │
      │ zeros │
      │ zeros_mt │
      └────────────────────────────────┘


      61 rows in set. Elapsed: 0.003 sec.


      nn72.hdp71.unicom :)
      #-m 多行执行
      [root@nn72 clickhouse]# clickhouse-client -m
      ClickHouse client version 20.8.3.18.
      Connecting to localhost:9000 as user default.
      Connected to ClickHouse server version 20.8.3 revision 54438.


      nn72.hdp71.unicom :) show
      :-] databases;


      SHOW DATABASES


      ┌─name───────────────────────────┐
      │ _temporary_and_external_tables │
      │ default │
      │ system │
      └────────────────────────────────┘


      3 rows in set. Elapsed: 0.002 sec.


      nn72.hdp71.unicom :)


      #多行模式退出
      nn72.hdp71.unicom :) quit
      :-] ;
      Bye.
      #非交互式,-t 显示执行时间
      [root@nn72 clickhouse]# clickhouse-client -t -q "show databases;"
      _temporary_and_external_tables
      default
      system
      0.003
      [root@nn72 clickhouse]#
      #server 关闭
      [root@nn72 ~]# service clickhouse-server stop
      Stop clickhouse-server service: DONE


      • 集群安装

        #集群安装,分别在71/73节点安装clickhouse包,跟72步骤一致;


        #1、主配置文件修改(所有节点)
        #将113行注释放开,允许其他节点访问
        [root@nn72 ~]# vim etc/clickhouse-server/config.xml


        #修改前
        113 <!-- Listen specified host. use :: (wildcard IPv6 address), if you want to accept connections both with IPv4 and IPv6 from everywhere. -->
        114 <!-- <listen_host>::</listen_host> -->
        115 <!-- Same for hosts with disabled ipv6: -->
        116 <!-- <listen_host>0.0.0.0</listen_host> -->
        117
        118 <!-- Default values - try listen localhost on ipv4 and ipv6: -->
        119 <!--
        120 <listen_host>::1</listen_host>
        121 <listen_host>127.0.0.1</listen_host>



          #修改后
          <!-- Listen specified host. use :: (wildcard IPv6 address), if you want to accept connections both with IPv4 and IPv6 from everywhere. -->
          <listen_host>::</listen_host>
          <!-- Same for hosts with disabled ipv6: -->
          <!-- <listen_host>0.0.0.0</listen_host> -->


          <!-- Default values - try listen localhost on ipv4 and ipv6: -->
          <!--
          <listen_host>::1</listen_host>
          <listen_host>127.0.0.1</listen_host>


            #2、新增配置文件(所有节点)
            vim etc/metrika.xml
            <yandex>
            <clickhouse_remote_servers>
            <test_cluster> #集群名称
            <shard> #数据分片1(节点1)
            <internal_replication>true</internal_replication>
            <replica>
            <host>nn71.hdp71.unicom</host>
            <port>9000</port>
            </replica>
            </shard>
            <shard> #数据分片2(节点2)
            <replica>
            <internal_replication>true</internal_replication>
            <host>nn72.hdp71.unicom</host>
            <port>9000</port>
            </replica>
            </shard>
            <shard> #数据分片3(节点3)
            <replica>
            <internal_replication>true</internal_replication>
            <host>nn73.hdp71.unicom</host>
            <port>9000</port>
            </replica>
            </shard>
            </test_cluster>
            </clickhouse_remote_servers>




            <zookeeper-servers> #ZK配置
            <node index="1">
            <host>dn75.hdp71.unicom</host>
            <port>2181</port>
            </node>


            <node index="2">
            <host>dn76.hdp71.unicom</host>
            <port>2181</port>
            </node>
            <node index="3">
            <host>dn77.hdp71.unicom</host>
            <port>2181</port>
            </node>
            </zookeeper-servers>


            <macros> #本机IP
            <replica>nn71.hdp71.unicom</replica>
            </macros>


            <networks> #监听网络,::/0代表监听所有ip
            <ip>::/0</ip>
            </networks>


            <clickhouse_compression> #数据压缩算法
            <case>
            <min_part_size>10000000000</min_part_size>
            <min_part_size_ratio>0.01</min_part_size_ratio>
            <method>lz4</method>
            </case>
            </clickhouse_compression>
            </yandex>


            • 启动及集群验证


              #启动集群(所有节点)
              [root@nn73 ~]# service clickhouse-server start
              Start clickhouse-server service: Path to data directory in etc/clickhouse-server/config.xml: var/lib/clickhouse/
              DONE


              #验证集群配置


              [root@nn73 ~]# clickhouse-client
              ClickHouse client version 20.8.3.18.
              Connecting to localhost:9000 as user default.
              Connected to ClickHouse server version 20.8.3 revision 54438.


              nn73.hdp71.unicom :) select * from system.clusters


              SELECT *
              FROM system.clusters


              ┌─cluster───────────────────────────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─────────┬─host_address─┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
              │ test_cluster │ 1 │ 1 │ 1 │ nn71.hdp71.unicom │ 10.172.54.71 │ 9000 │ 0 │ default │ │ 0 │ 0 │
              │ test_cluster │ 2 │ 1 │ 1 │ nn72.hdp71.unicom │ 10.172.54.72 │ 9000 │ 0 │ default │ │ 0 │ 0 │
              │ test_cluster │ 3 │ 1 │ 1 │ nn73.hdp71.unicom │ 10.172.54.73 │ 9000 │ 1 │ default │ │ 0 │ 0 │
              │ test_cluster_two_shards │ 1 │ 1 │ 1 │ 127.0.0.1 │ 127.0.0.1 │ 9000 │ 1 │ default │ │ 0 │ 0 │
              │ test_cluster_two_shards │ 2 │ 1 │ 1 │ 127.0.0.2 │ 127.0.0.2 │ 9000 │ 0 │ default │ │ 0 │ 0 │
              │ test_cluster_two_shards_localhost │ 1 │ 1 │ 1 │ localhost │ ::1 │ 9000 │ 1 │ default │ │ 0 │ 0 │
              │ test_cluster_two_shards_localhost │ 2 │ 1 │ 1 │ localhost │ ::1 │ 9000 │ 1 │ default │ │ 0 │ 0 │
              │ test_shard_localhost │ 1 │ 1 │ 1 │ localhost │ ::1 │ 9000 │ 1 │ default │ │ 0 │ 0 │
              │ test_shard_localhost_secure │ 1 │ 1 │ 1 │ localhost │ ::1 │ 9440 │ 0 │ default │ │ 0 │ 0 │
              │ test_unavailable_shard │ 1 │ 1 │ 1 │ localhost │ ::1 │ 9000 │ 1 │ default │ │ 0 │ 0 │
              │ test_unavailable_shard │ 2 │ 1 │ 1 │ localhost │ ::1 │ 1 │ 0 │ default │ │ 0 │ 0 │
              └───────────────────────────────────┴───────────┴──────────────┴─────────────┴───────────────────┴──────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘



              • 数据类型对比



              • 演示示例


                #浮点数计算有可能出现四舍五入的误差
                nn73.hdp71.unicom :) select 1-0.9


                SELECT 1 - 0.9


                ┌───────minus(1, 0.9)─┐
                │ 0.09999999999999998 │
                └─────────────────────┘


                1 rows in set. Elapsed: 0.002 sec.



                  #正无穷
                  nn73.hdp71.unicom :) select 1/0


                  SELECT 1 0


                  ┌─divide(1, 0)─┐
                  │ inf │
                  └──────────────┘


                  1 rows in set. Elapsed: 0.002 sec.
                  #负无穷
                  nn73.hdp71.unicom :) select -1/0


                  SELECT -1 0


                  ┌─divide(-1, 0)─┐
                  │ -inf │
                  └───────────────┘


                  1 rows in set. Elapsed: 0.002 sec.
                  #NaN-非数字
                  nn73.hdp71.unicom :) select 0/0


                  SELECT 0 0


                  ┌─divide(0, 0)─┐
                  │ nan │
                  └──────────────┘


                  1 rows in set. Elapsed: 0.002 sec.


                    #枚举类型


                    nn73.hdp71.unicom :) create table enum(boo Enum8('true'=1,'false'=0))engine=TinyLog;


                    CREATE TABLE enum
                    (
                    `boo` Enum8('true' = 1, 'false' = 0)
                    )
                    ENGINE = TinyLog


                    Ok.


                    0 rows in set. Elapsed: 0.002 sec.


                    nn73.hdp71.unicom :) insert into enum values('true'),('false')


                    INSERT INTO enum VALUES


                    Ok.


                    2 rows in set. Elapsed: 0.002 sec.


                    nn73.hdp71.unicom :) select * from enum;


                    SELECT *
                    FROM enum


                    ┌─boo───┐
                    │ true │
                    │ false │
                    └───────┘


                    2 rows in set. Elapsed: 0.002 sec.


                    #cast 转换查看enum的代表数值
                    nn73.hdp71.unicom :) select cast(boo,'Int8') from enum;


                    SELECT cast(boo, 'Int8')
                    FROM enum


                    ┌─cast(boo, 'Int8')─┐
                    │ 1 │
                    │ 0 │
                    └───────────────────┘


                    4 rows in set. Elapsed: 0.002 sec.


                    nn73.hdp71.unicom :)



                    #枚举必须完全匹配,否则报错不识别



                      #数组类型
                      nn73.hdp71.unicom :) select array(1,2,3) as arr,toTypeName(arr)


                      SELECT
                      [1, 2, 3] AS arr,
                      toTypeName(arr)


                      ┌─arr─────┬─toTypeName(array(1, 2, 3))─┐
                      │ [1,2,3] │ Array(UInt8) │
                      └─────────┴────────────────────────────┘


                      1 rows in set. Elapsed: 0.003 sec.


                        #元组类型
                        nn73.hdp71.unicom :) select tuple(1,'a') AS x,toTypeName(x)


                        SELECT
                        (1, 'a') AS x,
                        toTypeName(x)


                        ┌─x───────┬─toTypeName(tuple(1, 'a'))─┐
                        │ (1,'a') │ Tuple(UInt8, String) │
                        └─────────┴───────────────────────────┘


                        1 rows in set. Elapsed: 0.003 sec.


                        详情请看官网

                        https://clickhouse.tech/docs/zh/sql-reference/data-types/uuid/



                        • 表引擎


                        表引擎(即表的类型)决定了:

                        * 数据的存储方式和位置,写到哪里以及从哪里读取数据

                        * 支持哪些查询以及如何支持。

                        * 并发数据访问。

                        * 索引的使用(如果存在)。

                        * 是否可以执行多线程请求。

                        * 数据复制参数。

                        引擎类型

                        MergeTree

                        适用于高负载任务的最通用和功能最强大的表引擎。这些引擎的共同特点是可以快速插入数据并进行后续的后台数据处理。MergeTree系列引擎支持数据复制(使用Replicated* 的引擎版本),分区和一些其他引擎不支持的其他功能。

                        该类型的引擎:

                        - MergeTree

                        - ReplacingMergeTree

                        - SummingMergeTree

                        - AggregatingMergeTree

                        - CollapsingMergeTree

                        - VersionedCollapsingMergeTree

                        - GraphiteMergeTree

                        日志

                        具有最小功能的轻量级引擎。当您需要快速写入许多小表(最多约100万行)并在以后整体读取它们时,该类型的引擎是最有效的。

                        该类型的引擎:

                        * TinyLog

                        * StripeLog

                        * Log

                        集成引擎

                        用于与其他的数据存储与处理系统集成的引擎。

                        该类型的引擎:

                        * Kafka

                        * MySQL

                        * ODBC

                        * JDBC

                        * HDFS

                        用于其他特定功能的引擎

                        该类型的引擎:

                        * Distributed

                        * MaterializedView

                        * Dictionary

                        * Merge

                        * File

                        * Null

                        * Set

                        * Join

                        * URL

                        * View

                        * Memory

                        * Buffer

                        虚拟列

                        虚拟列是表引擎组成的一部分,它在对应的表引擎的源代码中定义。

                        您不能在 CREATE TABLE 中指定虚拟列,并且虚拟列不会包含在 SHOW CREATE TABLE 和 DESCRIBE TABLE 的查询结果中。虚拟列是只读的,所以您不能向虚拟列中写入数据。

                        如果想要查询虚拟列中的数据,您必须在SELECT查询中包含虚拟列的名字。SELECT * 不会返回虚拟列的内容。

                        若您创建的表中有一列与虚拟列的名字相同,那么虚拟列将不能再被访问。我们不建议您这样做。为了避免这种列名的冲突,虚拟列的名字一般都以下划线开头。


                        #查看引擎表详情,见官网

                        https://clickhouse.tech/docs/zh/engines/table-engines/


                          #以TinyLog为例,简单介绍下


                          [root@nn73 ~]# clickhouse-client
                          ClickHouse client version 20.8.3.18.
                          Connecting to localhost:9000 as user default.
                          Connected to ClickHouse server version 20.8.3 revision 54438.


                          nn73.hdp71.unicom :) create table stu1(id Int8,name String)ENGINE=TinyLog;


                          CREATE TABLE stu1
                          (
                          `id` Int8,
                          `name` String
                          )
                          ENGINE = TinyLog


                          Ok.




                          nn73.hdp71.unicom :) insert into stu1 values(1,'guow');


                          INSERT INTO stu1 VALUES


                          Ok.


                          1 rows in set. Elapsed: 0.002 sec.


                            #查看数据目录,此处截图可以看出clickhouse是以列为存储的,分别存储的id列和name列,其中sizes.json是记录各列大小信息的。
                            [root@nn73 default]# pwd
                            /var/lib/clickhouse/data/default
                            [root@nn73 default]# ll stu1/
                            total 12
                            -rw-r----- 1 clickhouse clickhouse 27 Nov 2 21:51 id.bin
                            -rw-r----- 1 clickhouse clickhouse 31 Nov 2 21:51 name.bin
                            -rw-r----- 1 clickhouse clickhouse 64 Nov 2 21:51 sizes.json




                                本文针对clickhouse的主要知识点及集群搭建,简单操作进行介绍,后期针对各特性要点再逐个介绍。

                            文章转载自知否Tech,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论