目录
依赖环境:
zookeeper
安装
(注意:每台节点都需要操作)
安装包链接:https://pan.baidu.com/s/10k9Ym8x0IRSZmN98ChVwoQ 提取码:8uoq
- 指定路径上传rpm
- sudo yum install -y libtool
- sudo yum install -y *unixODBC*
- sudo yum search libicul
- sudo 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 函数相同表示方法,例如 JSONEachRow
- kafka_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,20
2,lisi,29
3,wangwu,25
4,zhaoliu,35
5,tianqi,35
6,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.