ClickHouse 使用

    技术2023-11-18  77

    目录

     

     

    依赖环境:

    安装

    表引擎

    TinyLog

    memory

    merge

    MergeTree

    Distributed

    功能

    kafka增量同步数据到clickhouse

    clickhouse管理hdfs数据

    hive表迁移到clickhouse


     

    依赖环境:

                          zookeeper

    安装

       (注意:每台节点都需要操作)

      安装包链接:https://pan.baidu.com/s/10k9Ym8x0IRSZmN98ChVwoQ       提取码:8uoq

     指定路径上传rpmsudo yum install -y libtoolsudo yum install -y *unixODBC*sudo yum search libiculsudo yum install libicu.x86_64       #安装clickhouse缺少依赖libicudata.so.50()(64bit),所以需要安装该依赖sudo rpm -ivh *rpm    #解压安装sudo vim /etc/clickhouse-server/config.xml  #默认配置文件安装的位置 修改配置文件 node01 sudo vim /etc/metrika.xml <yandex>  <!-- 集群配置 -->  <clickhouse_remote_servers>      <bip_ck_cluster>          <shard>              <internal_replication>true</internal_replication>              <replica>                  <host>node01</host>                  <port>9001</port>              </replica>          </shard>          <shard>              <internal_replication>true</internal_replication>              <replica>                  <host>node02</host>                  <port>9001</port>              </replica>          </shard>           <shard>              <internal_replication>true</internal_replication>              <replica>                  <host>node03</host>                  <port>9001</port>              </replica>          </shard>      </bip_ck_cluster>  </clickhouse_remote_servers>  ​  <!-- 本节点副本,不同的机器配置不同 -->  <macros>      <replica>node01</replica>    </macros>    ​  <!-- ZK -->  <zookeeper-servers>    <node index="1">      <host>node01</host>      <port>2181</port>    </node>        <node index="2">      <host>node02</host>      <port>2181</port>    </node>        <node index="3">      <host>node03</host>      <port>2181</port>    </node>  </zookeeper-servers>  ​      <!-- 监听网络 -->      <networks>         <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>

     

    10.sudo chmod 777 /var/lib/clickhouse/

    11.systemctl start clickhouse-server   启动

     

    查看节点状况:  ps -ef | grep clickhouse      

    如果需要查看日志信息可去:/var/log/clickhouse-server

     

    表引擎

    clickhouse-client --port 9001

    TinyLog

    用于将数据存储在磁盘上,每列都存储在单独的压缩文件中。写入时,数据将附加到文件末尾。,该引擎没有并发控制,如果同时从表中读取和写入数据,则读取操作将抛异常,如果同时写入多个查询的表,则数据将被破坏。 write-once

    create table f1(a UInt16,b String)Engine=TinyLog; insert into f1 (a,b) values(1,'abc')

    默认数据保存到了/var/lib/clickhouse/data/..db/tableName

    .bin 表示压缩过的对应的列的数据

    sizes.json 中记录了每个 *.bin 文件的大小

    注意:  本表f1只能在所在节点查到。

     

    memory

    数据以未压缩的形式    直接保存在内存中。简单查询下有很高的性能(超过10G/s)  除了用于测试,一般用的地方不多。

     

    merge

    本身不存储数据,但可用于同时从多个其他的表总读取数据,

    举例:

    create table v1 (id UInt16, name String) ENGINE=TinyLog; create table v2 (id UInt16, name String) ENGINE=TinyLog; create table v3 (id UInt16, name String) ENGINE=TinyLog; --向表中插入数据 insert into v1(id, name) values (1, 'first');   insert into v2(id, name) values (2, 'second');   insert into v3(id, name) values (3, 'three'); -创建t表 ,把defalut数据库中所有以v开头的表连接起来 create table v(id UInt16, name String) ENGINE=Merge(currentDatabase(), '^v');

     

    MergeTree

    当你有巨量数据要插入到表中,你要高效地一批批写入数据片段,并希望这些数据片段在后台按照一定规则合并。相比在插入时不断修改(重写)数据进存储,这种策略会高效很多。

    CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]  (     name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],     name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],     ...  ) ENGINE [=] MergeTree(date-column [, sampling_expression], (primary, key), index_granularity)

    date-column:类型为 Date 的列名。ClickHouse 会自动依据这个列创建分区。 sampling_expression :采样表达式。 (primary, key) :主键。类型为Tuple(),主键可以是任意表达式构成的元组(通常是列名称的元组). index_granularity :索引粒度。即索引中相邻”标记”间的数据行数。设为 8192 可以适用大部分场景。  

    举例:

    --创建基于MergeTree的引擎表 create table mt_table (date  Date, id UInt8, name String) ENGINE=MergeTree(date, (id, name), 8192); --插入数据 insert into mt_table values ('2019-05-01', 1, 'zhangsan'); insert into mt_table values ('2019-06-01', 2, 'lisi'); insert into mt_table values ('2019-05-03', 3, 'wangwu');

     

     

     

    Distributed

    分布式引擎,本身不存储数据, 但可以在多个服务器上进行分布式查询。 读是自动并行的。读取时,远程服务器表的索引(如果有的话)会被使用。

    语法

     CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]  (     name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],     name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],     ...  ) ENGINE [=] Distributed(cluster_name, database, table [, sharding_key])

    cluster_name :服务器配置文件中的集群名,在/etc/metrika.xml中配置的 database :数据库名 table :表名 sharding_key :数据分片键

    举例:  

    在每个节点都创建该表。 create table table1(id UInt16, name String) ENGINE=TinyLog; 任意在某个节点添加数据 insert into table1 (id, name) values (1, 'zhangsan'); insert into table1 (id, name) values (2, 'lisi');  create table distributed_table(id UInt16, name String) ENGINE=Distributed(bip_ck_cluster, default, table1, id);

    可以看到每个节点分布的数据差不多。

    功能

    kafka增量同步数据到clickhouse

    1.创建topic

    ./kafka-topics.sh --create --partitions 3 --replication-factor 1 --topic ck --zookeeper node01:2181,node02:2181,node03:2181 

    2.创建ck表关联kafka CREATE TABLE queue (timestamp UInt64,level String,message String) ENGINE = Kafka SETTINGS kafka_broker_list ='node02:9092',kafka_topic_list = 'ck',kafka_group_name = 'consumer_ck',kafka_format = 'JSONEachRow',kafka_num_consumers = 3;

    kafka_broker_list:指定kafka集群地址kafka_topic_list:topic 列表kafka_group_name:Kafka 消费组名称kafka_format:消息体格式,使用与 SQL 部分的 FORMAT 函数相同表示方法,例如 JSONEachRowkafka_num_consumers:消费者线程数

    3.向topic写入数据:

    ./kafka-console-producer.sh --broker-list node02:6667 --topic ck

    >{"timestamp":153000000,"level":"1","message":"hello ck"}

    kafka发送消息:

    查看结果:

     

     

    clickhouse管理hdfs数据

    1.创建clickhouse表

    CREATE TABLE hdfs_engine_table (id Int32, name String, age Int32) ENGINE=HDFS('hdfs://node01:8020/other_storage/*', 'CSV'); ​

    2.准备数据: file.txt

    1,zhangsan,202,lisi,293,wangwu,254,zhaoliu,355,tianqi,356,kobe,40

    3.上传到hdfs

    hdfs  dfs -mkdir -p /other_storage 

    hdfs dfs -put file.txt /other_storage

    4.查看clickhouse

     

    hive表迁移到clickhouse

    waterdrop使用spark的引擎来实现数据的抽取和传输到目的地。我们可以通过waterfrop

    实现hive导入到clickhouse.

    Processed: 0.017, SQL: 9