ClickHouse之入门学习-单节点安装 / 集群的建立 / 基本命令操作-日志系列引擎(2 )
一 单节点安装
1 安装curl工具
yum install -y curl
2 添加clickhouse的yum镜像
curl -s https://packagecloud.io/install/repositories/altinity/clickhouse/script.rpm.sh | sudo bash
3 检查镜像情况
yum list | grep clickhouse
(含以下两个部件 :
clickhouse-client.x86_64 20.5.4.40-1.el7 @Altinity_clickhouse
clickhouse-common-static.x86_64 20.5.4.40-1.el7 @Altinity_clickhouse)
4 安装clickhouse的服务端和客户端
yum install -y clickhouse-server clickhouse-client
5 启动服务端
service clickhouse-server start
6 启动交互式客户端(在机器根目录下启动)
clickhouse-client -m (加上-m 之后,在客户端可以多行输入)
二 建立clickhouse集群
1 启动zookeeper ,在每台机器的 /etc 目录下编写配置文件 /etc/metrika.xml
<yandex>
<clickhouse_remote_servers> //clickhouse的集群 ,分三块,每个节点一块
<clickhouse> //集群的名字
<shard> //块
<internal_replication>true</internal_replication>
<replica>
<host>linux03</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<internal_replication>true</internal_replication>
<host>linux04</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>linux05</host>
<port>9000</port>
</replica>
</shard>
</doit>
</clickhouse_remote_servers>
//zookeeper的集群
<zookeeper-servers>
<node index="1">
<host>linux03</host>
<port>2181</port>
</node>
<node index="2">
<host>linux04</host>
<port>2181</port>
</node>
<node index="3">
<host>linux05</host>
<port>2181</port>
</node>
</zookeeper-servers>
//添加配置文件的当前节点域名 ,集群的每台机器都需要配置,配置的是哪台就写哪台机器的域名
<macros>
<replica>linux03</replica>
</macros>
<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>
2 开启远程访问权限(三台虚拟机的clickhouse远程连接访问权限/称一个节点拥有一个分片)
进入机器的根目录下 /etc/clickhouse-server/ 目录下
vi config.xml;
进入配置文件中,在以下备注的这段代码下方添加 : <listen_host>::</listen_host>
<!--
<listen_host>::1</listen_host>
<listen_host>127.0.0.1</listen_host>
-->
然后:wq!保存退出
3 编写完成后需要重启虚拟机 , "三台一起重启"reboot
4 启动集群中所有的 clickhouse 服务端和客户端
service clickhouse-server start
clickhouse-client -m
5 在每台clickhouse的客户端中创建一个普通的表
create table tb_log(id UInt16, name String) ENGINE=TinyLog;
6 创建一个分布式表==>Distributed(集群名, 当前库名, tb_log, id–分区字段);
create table tb_distribute(id UInt16, name String) ENGINE=Distributed(clickhouse, db_ck, tb_log, id);
7 向分布式表中插入的数据会被分散到集群中的各个节点上 ;
向集群中某个关联的普通表中插入数据 ;
insert into tb_distribute(1,'zss');
insert into tb_distribute(2,'yss');
insert into tb_distribute(3,'tss');
在分布式表中(每台机器中的 tb_log表中)可以查看存储的数据,插入的数据是分布式存储在 clickhouse 集群中的 .
select * from tb_log
8 注意zookeeper的正常启动
三 shell客户端操作数据库的基本命令–>表类型为日志系列引擎
1 查看/展示数据库
show databases;
2 创建一个数据库
create database db_clickhouse;
3 使用/进入数据库
use db_clickhouse;
4 查看当前 / 正在使用的数据库
select currentDatabase()
5 进入数据库后,展示数据库的表单
show tables;
6 删除表
drop table tb_data;
7 创建表(入门实例)==>TinyLog引擎(指表的类型) 向表中插入内容
create table if not exists tb_user( //判断如果这个表在当前数据库中不存在
uid UInt64 , //整数类型:Int8/16/32/64 正数-负数 UInt8/16/32/64 只有正数
name String ,
age UInt8,
sal Float64 , //小数类型:Float32/64
gender String
) engine=TinyLog ; //TinyLog : 微小的/最简单的表日志系列引擎
insert into tb_user values(1001,'zss',23,10000,'M'),(1002,'lss',33,20000,'F') ;
8 创建表==>StripeLog引擎 向表中插入内容
create table if not exists tb_stripeLog(
uid UInt64 ,
name String ,
age UInt8,
sal Float64 ,
gender String
) engine=StripeLog ;
//查看表信息
desc tb_stripeLog;
//插入内容
insert into tb_stripeLog values(1001,'zss',23,10000,'M'),(1002,'lss',33,20000,'F') ;
9 查询数据存储路径( 机器中的哪个位置 ) :
引擎 : TinyLog
/var/lib/clickhouse/data/doit/tb_user
最终查询的数据存储的结果为以下几个文档, 每个字段都是分别存储在一个专门属于自己的文件中的;
uid.bin
name.bin
age.bin
sal.bin
gender.bin
引擎 : StripeLog
查询数据存储路径 : /var/lib/clickhouse/data/doit/tb_stripeLog
最终数据存储结果为以下几个文档:
data.bin
index.mrk
sizes.json
10 创建有日期( Date )数据类型的表单并插入内容
create table if not exists tb_date(
id UInt8 ,
name String ,
brithday date
) engine=TinyLog ;
//插入内容,不与创建表单连着写上这段代码
insert into tb_date values(1,'zss','1993-02-03'),(2,'1990-08-09') ;
11 创建有数组( Array )数据类型的表单并插入内容
create table if not exists tb_array(
id UInt8 ,
name String ,
age UInt8,
gender String ,
hobby Array(String)
) engine=TinyLog ;
//查看表单信息后再插入内容,不与创建表单时连起来使用
insert into tb_array values(1,'zss',23,'M',['sing','running']),(2,'lii',33,'F',['shopping','sing','dancing']) ;
//将数组里面的字段都转为 大写
SELECT
uid,
name,
arrayMap(x -> upper(x), hobby) //查找指定字段,并将数组里面的元素都转为大写
FROM tb_array
12 创建数组( Array )数据类型的表单并插入内容, 使用array join 将数组行转为列 ,一 一对应
create table tb_arr_join(
arr1 Array(String) ,
arr2 Array(Int8)
)engine=TinyLog ;
insert into tb_arr_join values(['a','b','c'] , [1,2,3]) ;
select * from tb_arr;
┌─arr1──────────┬─arr2────┐
│ ['a','b','c'] │ [1,2,3] │
└───────────────┴─────────┘
select
a1,
a2
from tb_arr_join
array join
arr1 as a1,
arr2 as a2 ;
┌─a1─┬─a2─┐
│ a │ 1 │
│ b │ 2 │
│ c │ 3 │
└────┴────┘
13 数据块演示(创建表和向表中插入内容代码连在一起写在 txt文档中,一起复制粘贴到 clickhouse客户端运行 )==> StripeLog
create table tb_block(
uid Int8 ,
name String ,
gender String ,
age UInt8
)engine = **StripeLog** ;
insert into tb_block values(1,'zss','M',23);
insert into tb_block values(2,'lss','M',22),(3,'ada','F',34);
查询结果
select * from tb_block;
结果如下 :
将以上两个数据块合并成一个数据块 ,操作如下 :
SELECT *
FROM tb_block
ORDER BY age DESC;
结果如下所示 :
14 数据的运算及数据类型的转换(这里没有指定在哪个表中)
select 45+23;
结果为 :
select '45'+23 ; //报错 ,String类型不可以与Int类型进行运算,需要将其转型
转型后代码如下 :
select toInt8('45')+23;
结果如下所示
四 java客户端连接clickhouse的基本操作(入门程序)
1 创建表并插入内容
create table if not exists tb_a(
id Int32,
name String,
gender String,
age Int32)engine=TinyLog;
insert into tb_a values (1,'zss','M',18)(2,'lii','F',16);
2 在java客户端创建一个maven项目 ,在 pom.xml 配置文件中导入一下代码,将clickhouse jar包导入 :
<dependencies>
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.1.54</version>
</dependency>
</dependencies>
3 新建一个 .java文件,在文件中写入一下代码 ,可以连接到clickhouse查询到特定表格的特定内容 ,操作如下 :
public class ClientHouseTest01 {
public static void main(String[] args) throws Exception {
//注册驱动
Class.forName("com.clickhouse.client.ClientHouseTest01"); //class文件的相对路径
//获取连接对象
String path = "jdbc:clickhouse://doit03:8123/doit"; //查询内容所在的位置,哪个节点哪个数据库中
Connection connection = DriverManager.getConnection(path);
//获取执行SQL对象
Statement statement = connection.createStatement();
//执行SQL语句
ResultSet resultSet = statement.executeQuery("select * from tb_a");
//得到结果集
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String gender = resultSet.getString("gender");
int age = resultSet.getInt("age");
System.out.println(id+"---"+name+"---"+gender+"---"+age);
}
//关流
resultSet.close();
statement.close();
connection.close();
}
}
4 注意事项 :
- 启动java程序之前 ,确保clickhouse服务端和shell客户端是开启状态的;
- 查询表内容的路径要确定好是在哪个节点的哪个数据库中;
- 确保clickhouse的集群都将shell客户端开启了 ;
- 确保将clickhouse的config.xml文件中的"开发访问权限"修改好了;