安装ClickHouse
ClickHouse是一个用于联机分析的列式数据库管理系统,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。
ClickHouse是一个完全的列式数据库管理系统,允许在运行时创建表和数据库,加载数据和运行查询,而无需重新配置和重新启动服务器,支持线性扩展,简单方便,高可靠性。
文章目录
- 安装ClickHouse
- 目标
- docker 部署
- ClickHouse相关文档地址
- 部署脚本
- 检验
- 连接到控制台
- 使用DBeaver连接
- 快速入门
- 创建用户
- 查询用户
- 创建数据库(模式)
- 设置当前模式(数据库)
- 授予权限
- 查看用户和权限
- 修改密码
- 删除用户和数据库
- 查询数据库
- 创建表
- 插入数据
- 查询您的新表
- java客户端
- 环境要求
- Maven设置
- 配置
- 支持的数据类型
- 处理日期、时间和时区
- 创建连接
- 提供凭证和设置
- 简单语句
- 插入
目标
- 快速部署 ClickHouse
- 简单测试 ClickHouse
- jdbc 测试
docker 部署
ClickHouse相关文档地址
- dockerhub 地址 https://hub.docker.com/_/clickhouse
- ClickHouse 文档地址 https://clickhouse.com/docs/zh/introduction-clickhouse
- ClickHouse github地址https://github.com/ClickHouse/ClickHouse
部署脚本
mkdir -p /home/clickhouse
cd /home/clickhouse
cat > /home/clickhouse/docker-compose.yml << EOF
version: '3'
services:clickhouse:image: clickhouse:25.4.2.31ulimits:nofile:soft: 262144hard: 262144restart: alwayshostname: clickhousecontainer_name: clickhouseprivileged: trueenvironment:- CLICKHOUSE_DB=test- CLICKHOUSE_USER=root- CLICKHOUSE_PASSWORD=123456- CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1- TZ=Asia/Shanghaiports:- '18123:8123'- '19000:9000'volumes:- /home/clickhouse/ch_data:/var/lib/clickhouse- /home/clickhouse/ch_logs:/var/log/clickhouse-serverEOF
docker-compose up -d
参数解释:
- -p 18123:8123:将主机的 8123 端口映射到容器内的 18123 端口,用于访问 ClickHouse 的 HTTP 查询服务。
- –ulimit nofile=262144:262144:设置容器内 ClickHouse 进程的文件打开数量限制,防止因文件描述符不足导致问题。
- -e CLICKHOUSE_DB=test:设置 ClickHouse 的默认数据库名为 test。
- -e CLICKHOUSE_USER=root:设置 ClickHouse 的默认管理员用户名为 root。
- -e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1:启用 ClickHouse 的访问控制功能,需要设置管理员账号密码才能进行操作。
- -e TZ=Asia/Shanghai:设置容器的时区为上海时间,便于处理时间相关的数据。
- -e CLICKHOUSE_PASSWORD=123456:设置 ClickHouse 的管理员账号密码为 123456。
- 容器内配置文件路径/etc/ClickHouse-server/config.xml
检验
echo 'SELECT version()' | curl 'http://localhost:18123/?password=123456' --data-binary @-
连接到控制台
浏览器访问
http://ip:18123/play
测试
使用DBeaver连接
连接成功!
快速入门
创建用户
在 ClickHouse 中,你可以使用 CREATE USER
语句来创建一个新用户。例如,创建一个名为 example_user
的用户,并设置密码为 password123
:
CREATE USER example_user IDENTIFIED WITH plaintext_password BY 'password123';
这里,plaintext_password
是用于密码加密的算法,你也可以使用其他算法如 sha256_password
。
查询用户
用户列表:SELECT * FROM system.users;
角色权限:SELECT * FROM system.grants WHERE role_name = 'read_write';
关联关系:SELECT * FROM system.role_grants;
创建数据库(模式)
在 ClickHouse 中,你可以使用 CREATE DATABASE
语句来创建一个新的数据库。例如,创建一个名为 example_db
的数据库:
CREATE DATABASE example_db;
设置当前模式(数据库)
在 ClickHouse 中,你可以使用 USE
语句来设置当前操作的数据库。例如,要切换到 example_db
数据库:
USE example_db;
这样,之后你创建的表、执行的操作等都会默认在当前数据库 example_db
下进行。
授予权限
为了确保用户可以访问特定的数据库或表,你需要授予相应的权限。例如,授予 example_user
用户对 example_db
数据库的访问权限:
GRANT ALL ON example_db.* TO example_user;
这行命令授予了 example_user
对 example_db
数据库中所有表的全部权限。
查看用户和权限
你可以使用 SHOW USERS;
来查看所有用户,使用 SHOW GRANTS FOR example_user;
来查看特定用户的权限。
修改密码
如果需要修改用户的密码,可以使用以下命令:
ALTER USER example_user IDENTIFIED WITH 'plaintext' BY 'new_password123';
删除用户和数据库
如果你需要删除用户或数据库,可以使用以下命令:
-
删除用户:
DROP USER example_user;
-
删除数据库:
DROP DATABASE example_db;
查询数据库
show databases;
创建表
使用 CREATE TABLE
定义新表。在 ClickHouse 中,典型的 SQL DDL 命令同样适用,唯一的补充是 ClickHouse 中的表需要一个 ENGINE
子句。使用 MergeTree
利用 ClickHouse 的性能优势:
CREATE TABLE my_first_table
(user_id UInt32,message String,timestamp DateTime,metric Float32
)
ENGINE = MergeTree
PRIMARY KEY (user_id, timestamp);
插入数据
您可以在 ClickHouse 中使用熟悉的 INSERT INTO TABLE
命令,但重要的是要理解,每次插入 MergeTree
表时,ClickHouse 会在存储中创建一个我们称之为 part 的部分。这些部分稍后会在后台由 ClickHouse 合并。
在 ClickHouse 中,我们尽量批量插入大量行(一次数以万计或甚至数百万计),以减少后台合并所需的 parts 数量。
在本指南中,我们暂时不担心这个问题。运行以下命令,将几行数据插入到您的表中:
INSERT INTO my_first_table (user_id, message, timestamp, metric) VALUES(101, 'Hello, ClickHouse!', now(), -1.0 ),(102, 'Insert a lot of rows per batch', yesterday(), 1.41421 ),(102, 'Sort your data based on your commonly-used queries', today(), 2.718 ),(101, 'Granules are the smallest chunks of data read', now() + 5, 3.14159 )
查询您的新表
您可以像使用任何 SQL 数据库一样编写 SELECT
查询:
SELECT *
FROM my_first_table
ORDER BY timestamp
注意响应以漂亮的表格格式返回:
java客户端
clickhouse jdbc 文档介绍
环境要求
- OpenJDK 版本 >= 8
Maven设置
<!-- https://mvnrepository.com/artifact/com.clickhouse/clickhouse-jdbc -->
<dependency><groupId>com.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.8.5</version>
</dependency>
配置
驱动类: com.clickhouse.jdbc.ClickHouseDriver
URL 语法: jdbc:(ch|clickhouse)[:<protocol>]://endpoint1[,endpoint2,...][/<database>][?param1=value1¶m2=value2][#tag1,tag2,...]
,例如:
jdbc:clickhouse:http://localhost:8123
jdbc:clickhouse:https://localhost:8443?ssl=true
连接属性:
除了标准 JDBC 属性外,驱动程序还支持由底层 java client 提供的 ClickHouse 特定属性。如果功能不被支持,尽可能的方法将返回 SQLFeatureNotSupportedException
。其他自定义属性包括:
属性 | 默认 | 描述 |
---|---|---|
disable_frameworks_detection | true | 禁用用户代理的框架检测 |
jdbc_ignore_unsupported_values | false | 抑制 SQLFeatureNotSupportedException |
clickhouse.jdbc.v1 | false | 使用旧的 JDBC 实现,而不是新的 JDBC |
default_query_settings | null | 允许在查询操作中传递默认的查询设置 |
支持的数据类型
JDBC 驱动程序支持与底层 java client 相同的数据格式。
处理日期、时间和时区
java.sql.Date
、java.sql.Time
和 java.sql.Timestamp
可能会使时区计算复杂 - 尽管它们当然受到支持,您可能希望考虑使用 java.time 包。ZonedDateTime
和 OffsetDateTime
都是 java.sql.Timestamp
、java.sql.Date
和 java.sql.Time
的极好替代品。
创建连接
String url = "jdbc:ch://my-server:8123/system";Properties properties = new Properties();
DataSource dataSource = new DataSource(url, properties);//DataSource 或 DriverManager 是主要的入口点
try (Connection conn = dataSource.getConnection()) {
... // 使用连接做一些事情
提供凭证和设置
String url = "jdbc:ch://localhost:8123?jdbc_ignore_unsupported_values=true&socket_timeout=10";Properties info = new Properties();
info.put("user", "default");
info.put("password", "password");
info.put("database", "some_db");//使用 DataSource 创建连接
DataSource dataSource = new DataSource(url, info);
try (Connection conn = dataSource.getConnection()) {
... // 使用连接做一些事情
}// 使用 DriverManager 的备用方法
try (Connection conn = DriverManager.getConnection(url, info)) {
... // 使用连接做一些事情
}
简单语句
try (Connection conn = dataSource.getConnection(...);Statement stmt = conn.createStatement()) {ResultSet rs = stmt.executeQuery("select * from numbers(50000)");while(rs.next()) {// ...}
}
插入
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO mytable VALUES (?, ?)")) {ps.setString(1, "test"); // idps.setObject(2, LocalDateTime.now()); // timestampps.addBatch();...ps.executeBatch(); // 将所有数据流式传输到 ClickHouse
}