what
官網說明
a fast open-source OLAP database management system. It is column-oriented and allows to generate analytical reports using SQL queries in real-time.
學習資料參考
GitHub
clickhouse-doc-zh
china
數據目錄
由淺入深系列
阿里雲clickhouse
optional
book
ClickHouse原理解析與應用實踐
個人
altinity
官網
clickhouse-operator
Altinity是國外一家從事ClickHouse諮詢、服務的公司,該公司高管由ClickHouse開發者,以及來自Percona的專家組成。目前Altinity的ClickHouse雲服務測試版已經上線。
安裝
數據類型
SQL
DESCRIBE TABLE:
CHECK TABLE
: 檢查表中的數據是否損壞,返回兩種結果: 0 – 數據已損壞; 1 – 數據完整;
該命令只支持 Log,TinyLog 和 StripeLog 引擎。
ORDER BY 決定每個分區中數據的排序規則;
PRIMARY KEY 決定一級索引(primary.idx);
ORDER BY 可以指代PRIMARY KEY,通常只用聲明ORDER BY 即可。
DROP 刪除元數據和數據,TRUNCATE 只刪除數據。
刪除數據:ALTER TABLE [db.]table DELETE WHERE filter_expr
更新數據:ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE filter_expr
條件:
- 版本號1.1.54388+,以及mergeTree引擎;
- 這兩條命令是異步執行的,可以通過查看錶 system.mutations 來查看命令的是否執行完畢
select * from system.mutations where table='test_update';
- 不可以用於分佈式表,需要在每臺機器上的local表中來執行
系統表
系統表說明
系統表用於實現部分系統功能,並提供途徑來獲取與系統運行狀態相關的信息。
系統表無法刪除(但可以執行 DETACH)。
系統表中的數據或者元數據沒有以文件的方式存儲在磁盤上。server 啓動時將創建所有系統表。
系統表是隻讀的。
系統表位於system數據庫中。
幾個主要的系統表:
- system.asynchronous_metrics
表引擎
TinyLog
Memory
Merge
Distributed
Distributed(logs, default, hits[, sharding_key])
Distributed(cluster_2shards_2replicas, default, topic_lycf_h5_pageview_ubt, rand());
參數:服務器配置文件中的集羣名,遠程數據庫名,遠程表名,數據分片鍵(可選)。數據分片鍵的概念就是數據插入時是根據什麼原則分配到具體分片上的。
集羣的名稱是在集羣搭建時的metrika.xml
文件中配置的,可在配置中配置任意數量的集羣。
MergeTree
MergeTree
數據是由多組part文件組成,每一個part的數據是按照主鍵進行字典序排列。這些數據片段在後臺按照一定規則合併。
SummingMergeTree
ReplacingMergeTree
和MergeTree的不同之處在於它會刪除具有相同主鍵的重複項。但數據的去重只會在merge的過程中出現,merge操作是後臺進程異步執行。
OPTIMIZE TABLE 操作可以手動觸發merge操作,但會引發對大量數據的讀和寫操作,降低性能。因此,ReplacingMergeTree 適用於在後臺清除重複的數據以節省空間,並不保證沒有重複的數據出現。
AggregatingMergeTree
ClickHouse會將相同主鍵的行(在一個數據片段內)替換爲單個存儲一系列聚合函數狀態的行。可以使用 AggregatingMergeTree 表來做增量數據統計聚合,包括物化視圖的數據聚合。
SummingMergeTree
當合並 SummingMergeTree 表的數據片段時,ClickHouse 會把所有具有相同主鍵的行進行彙總,將同一主鍵的行替換爲包含sum後的一行記錄。如果主鍵的組合方式使得單個鍵值對應於大量的行,則可以顯著的減少存儲空間並加快數據查詢的速度。
CollapsingMergeTree
在創建時與 MergeTree 基本一樣,除了最後多了一個參數,需要指定 Sign 位(必須是 Int8 類型)。CollapsingMergeTree 會異步的刪除(摺疊)除了特定列 Sign 1 和 -1 值以外的所有字段的值重複的行。
VersionedCollapsingMergeTree
是collapsingmergetree的升級,使用不同的collapsing算法,該算法允許使用多個線程以任何順序插入數據。
副本
INSERT 和 ALTER 操作副本間會複製。
CREATE,DROP,ATTACH,DETACH 和 RENAME 語句只會在單個服務器上執行,不會被複制。
複製表需要藉助Zookeeper。
相比非複製表,寫 zk 會導致 INSERT 的延遲略長一些,建議不要每秒一個INSERT,儘量批量寫入。
複製是多主異步。
默認INSERT 語句僅等待一個副本寫入成功後返回,insert_quorum參數可以指定幾個副本寫入成功後返回,默認爲0。
數據塊會自動去重。
只有 Replicated*MergeTree 系列裏的表可支持副本:
- ReplicatedMergeTree
- ReplicatedSummingMergeTree
- ReplicatedReplacingMergeTree
- ReplicatedAggregatingMergeTree
- ReplicatedCollapsingMergeTree
- ReplicatedVersionedCollapsingMergeTree
- ReplicatedGraphiteMergeTree:應用於Graphite data的數據彙總,減少存儲容量,提高Graphite查詢的效率。
https://cloud.tencent.com/developer/article/1510152
配置
配置文件包括/etc/clickhouse-server/config.xml
,users.xml
以及集羣配置文件/etc/metrika.xml
。通過metrika.xml可以看到節點登陸的明文用戶名,密碼。
配置說明
物化視圖
Materialized View,提高查詢速度,本質:觸發器。
原理
物化視圖的原理是服務器覺得空閒的時候,幫你做一次select再insert的動作,可以通過物化視圖來實現表間數據複製。
配置parallel_view_processing
來實現物化視圖是同步還是異步寫。
物化視圖也是一個普通的表。
pay attention:物化視圖不能修改表名
- 用途
當有需要在同個實例進行多表多寫時,就可以使用物化視圖來實現ClickHouse幫你做表的數據複製,減少多寫的帶寬消耗,降低集羣負載。
適用場景:- 需要有多個時間維度的表
- 同一個表需要建立不同的索引粒度
- How
CREATE MATERIALIZED VIEW db.table ENGINE = MergeTree() PARTITION BY day ORDER BY name AS SELECT * FROM db.old-table;
如果需要實現多個時間維度的表,則AS SELECT
時對時間字段多處理即可。
http://www.hohode.com/2019/10/16/Clickhouse物化視圖/
CREATE MATERIALIZED VIEW app.tracker_log (
dayDate,
stUInt64,
u_iString,
d_iString,
tk_idString,
timeDateTime,
catString,
actString,
e_tString,
c_pString) ENGINE = MergeTree() PARTITION BY day ORDER BY (st) POPULATE AS SELECT day, toUInt64(s_t) AS st, u_i, d_i, tk_id, toDateTime(toUInt64(st) / 1000) AS time, cat, act, e_t, multiIf((c_p = 'iOS') OR (c_p = 'IOS') OR (c_p = 'Android'), 'APP', (c_p = 'wap') OR (c_p = 'WAP'), 'WAP', 'PC') AS c_p FROM app.scene_tracker WHERE (s_t != '') AND ((u_i != '') OR (d_i != '')) AND (length(d_i) > 5) AND (length(cat) > 1) AND (length(act) > 1)
實例
https://blog.lzzrpi.xin/index.php/archives/205/
TO關鍵字指向目標表,缺點:ClickHouse不允許在TO中使用POPULATE關鍵字,需要注意,但可以避免,定義視圖的時候可以用where字句,手動insert進物化視圖的目標表中。
https://blog.51cto.com/11106335/1869120
http://www.clickhouse.com.cn/topic/5b33777b9d28dfde2ddc6197
端口
默認情況下,clickhouse-server 會在端口 8123 上監控 HTTP 請求
本地表 & 分佈式表
函數
https://clickhouse.tech/docs/en/sql-reference/aggregate-functions/reference/
函數有兩種類型:常規函數和聚合函數,區別是常規函數可以通過一行數據產生結果,聚合函數則需要一組數據來產生結果
modulo(a, b)
:計算兩個字段的餘數
uniqCombined
http://www.clickhouse.com.cn/topic/5a5f58519d28dfde2ddc5e2c
https://blog.csdn.net/u012111465/article/details/85250030
http://www.mooyle.com/bigdata/clickhouse/
SQL優化
- 不要用
select *
- 通過使用 limit 限制返回數據條數
- 根據需要查詢指定範圍的數據:
where
- 不要在唯一列或大基數列上進行分組或去重操作:
group by id
- 關聯查詢時小表在後,大表join小表;無論是Left Join 、Right Join還是Inner Join永遠都是拿着右表中的每一條記錄到左表中查找該記錄是否存在
- 使用 uniqCombined 替代 distinct:
SELECT count(DISTINCT create_user) from app.scene_model; -- wrong
SELECT uniqCombined(create_user) from app.scene_model; -- right:近似去重
- 不要在大結果集上構造 虛擬列:
select id, pv, uv, pv/uv rate from app.scene_model
,虛擬列非常消耗資源浪費性能,拿到pv uv後在前端顯示時構造比率。 - 儘量不去使用字符串類型
- 指定查詢分區獲取必要的數據
執行計劃
目前,ClickHouse沒有類似MySQL explain查詢執行計劃的功能。
如何在ClickHouse中查看SQL執行計劃
數據備份
ClickHouse 數據目錄的配置默認在config.xml
中的 path 字段,默認目錄爲/data/clickhouse/clickhouse-server/data
。
數據目錄格式
某個 clickhouse-server 的數據目錄結構如下所示。
test
|-- account
| |-- all_1_1_0
| | |-- checksums.txt
| | |-- columns.txt
| | |-- count.txt
| | |-- name.bin
| | |-- name.mrk2
| | |-- id.bin
| | |-- id.mrk2
| | |-- age.bin
| | |-- age.mrk2
| | |-- primary.idx
| |-- detached
|-- |-- format_version.txt
第一級目錄顯示數據庫名稱如test
第二級目錄爲表名稱如account數據表
第三級目錄顯示分區目錄
checksum.txt 存儲數據校驗信息
columns.txt 保存數據列的列名和數據類型
count.txt 存儲該分區的數據總數
.bin和.mrk2文件保存數據信息
primary.idx???
format_version.txt???
detached???
備份工具
clickhouse-backup 備份工具
監控
https://cloud.tencent.com/document/product/589/43539
https://clickhouse.tech/docs/zh/operations/monitoring/
https://wchch.github.io/2019/06/15/搭建clickhouse監控
https://hacpai.com/article/1515939854556
https://www.jianshu.com/p/37ca4c3e4203
https://github.com/f1yegor/clickhouse_exporter
訪問權限控制
虛擬列
個例:
http://www.clickhouse.com.cn/topic/5b1e168c9d28dfde2ddc612a
http://www.clickhouse.com.cn/topic/5b1755409d28dfde2ddc60fb
交互方式
curl:URL 的大小會限制在 16 KB,
wget
TCP
HTTP
各語言客戶端
MySQL接口?
使用HTTP客戶端的好處是,當查詢語句中進行group by後,緊跟着WITH TOTALS,並且是FORMAT JSON時能夠返回總數,這使得可以計算百分比。
工具
第三方代理服務器
chproxy
KittenHouse
clickhouse-bulk
可視化工具
開源
- Tabix
- HouseOps
- 燈塔
- DBeaver
收費
數據同步
HDFS to clickhouse
Hive to clickhouse
https://www.cnblogs.com/gomysql/p/6708650.html
other
https://zhuanlan.zhihu.com/p/71014268
http://www.clickhouse.com.cn/topic/5a366e48828d76d75ab5d59e
問題
Missing columns…required columns…
報錯信息:
ClickHouse exception, code: 47, host: 10.114.16.138, port: 8123; Code: 47, e.displayText() = DB::Exception: Missing columns: 'bussinessline' while processing query: '', required columns: 'bussinessline', source columns: 'bussinessLine' (version 19.16.8.34 (official build))
仔細看三個column,差別的地方在於大小寫不一樣,查閱文檔得知:clickhouse對於select/SELECT不區分大小寫,但是對於業務字段是大小寫敏感的。