目录
依赖环境:
安装
表引擎
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
用于将数据存储在磁盘上,每列都存储在单独的压缩文件中。写入时,数据将附加到文件末尾。,该引擎没有并发控制,如果同时从表中读取和写入数据,则读取操作将抛异常,如果同时写入多个查询的表,则数据将被破坏。 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只能在所在节点查到。
数据以未压缩的形式 直接保存在内存中。简单查询下有很高的性能(超过10G/s) 除了用于测试,一般用的地方不多。
本身不存储数据,但可用于同时从多个其他的表总读取数据,
举例:
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');
当你有巨量数据要插入到表中,你要高效地一批批写入数据片段,并希望这些数据片段在后台按照一定规则合并。相比在插入时不断修改(重写)数据进存储,这种策略会高效很多。
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');
分布式引擎,本身不存储数据, 但可以在多个服务器上进行分布式查询。 读是自动并行的。读取时,远程服务器表的索引(如果有的话)会被使用。
语法
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);可以看到每个节点分布的数据差不多。
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发送消息:
查看结果:
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
waterdrop使用spark的引擎来实现数据的抽取和传输到目的地。我们可以通过waterfrop
实现hive导入到clickhouse.