安裝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
}