業(yè)務(wù)需要一種OLAP引擎前塔,可以做到實(shí)時(shí)寫入存儲(chǔ)和查詢計(jì)算功能摹蘑,提供高效剑勾、穩(wěn)健的實(shí)時(shí)數(shù)據(jù)服務(wù),最終決定ClickHouse
笙蒙。
什么是ClickHouse沉填?
ClickHouse是一個(gè)用于聯(lián)機(jī)分析(OLAP)的列式數(shù)據(jù)庫管理系統(tǒng)(DBMS)。
列式數(shù)據(jù)庫更適合于OLAP場景(對(duì)于大多數(shù)查詢而言,處理速度至少提高了100倍)掏膏,下面詳細(xì)解釋了原因(通過圖片更有利于直觀理解),圖片來源于ClickHouse中文官方文檔敦锌。
行式
列式
我們使用Flink編寫程序馒疹,消費(fèi)kafka里面的主題數(shù)據(jù),清洗乙墙、歸一颖变,寫入到clickhouse里面去。
這里的關(guān)鍵點(diǎn)听想,由于第一次使用腥刹,無法分清應(yīng)該建立什么格式的clickhouse表,出現(xiàn)了一些問題汉买,最大的問題就是程序?qū)?shù)據(jù)寫入了衔峰,查詢發(fā)現(xiàn)數(shù)據(jù)不完整,只有一部分蛙粘。我也在網(wǎng)上查了一些原因垫卤,總結(jié)下來。
為什么有時(shí)看不到已經(jīng)創(chuàng)建好的表并且查詢結(jié)果一直抖動(dòng)時(shí)多時(shí)少出牧?
- 常見原因1:
建表流程存在問題穴肘。ClickHouse的分布式集群搭建并沒有原生的分布式DDL語義。如果您在自建ClickHouse集群時(shí)使用create table創(chuàng)建表舔痕,查詢雖然返回了成功评抚,但實(shí)際這個(gè)表只在當(dāng)前連接的Server上創(chuàng)建了。下次連接重置換一個(gè)Server伯复,您就看不到這個(gè)表了慨代。
解決方案:
建表時(shí),請(qǐng)使用create table <table_name> on cluster default語句啸如,on cluster default聲明會(huì)把這條語句廣播給default集群的所有節(jié)點(diǎn)進(jìn)行執(zhí)行鱼响。示例代碼如下。
Create table test on cluster default (a UInt64) Engine = MergeTree() order by tuple();
在test表上再創(chuàng)建一個(gè)分布式表引擎组底,建表語句如下。
Create table test_dis on cluster default as test Engine = Distributed(default, default, test, cityHash64(a));
- 常見原因2:
ReplicatedMergeTree存儲(chǔ)表配置有問題筐骇。ReplicatedMergeTree表引擎是對(duì)應(yīng)MergeTree表引擎的主備同步增強(qiáng)版债鸡,在單副本實(shí)例上限定只能創(chuàng)建MergeTree表引擎,在雙副本實(shí)例上只能創(chuàng)建ReplicatedMergeTree表引擎铛纬。
解決方案:
在雙副本實(shí)例上建表時(shí)厌均,請(qǐng)使用ReplicatedMergeTree(‘/clickhouse/tables/{database}/{table}/{shard}’, ‘{replica}’)或ReplicatedMergeTree()配置ReplicatedMergeTree表引擎。其中告唆,ReplicatedMergeTree(‘/clickhouse/tables/{database}/{table}/{shard}’, ‘{replica}’)為固定配置棺弊,無需修改晶密。
這里引出了復(fù)制表的概念,這里介紹一下模她,只有 MergeTree 系列里的表可支持副本:
- ReplicatedMergeTree
- ReplicatedSummingMergeTree
- ReplicatedReplacingMergeTree
- ReplicatedAggregatingMergeTree
ReplicatedCollapsingMergeTree - ReplicatedVersionedCollapsingMergeTree
- ReplicatedGraphiteMergeTree
副本是表級(jí)別的稻艰,不是整個(gè)服務(wù)器級(jí)的。所以侈净,服務(wù)器里可以同時(shí)有復(fù)制表和非復(fù)制表尊勿。副本不依賴分片。每個(gè)分片有它自己的獨(dú)立副本畜侦。
創(chuàng)建復(fù)制表
先做好準(zhǔn)備工作元扔,該建表的建表,然后編寫程序旋膳。在表引擎名稱上加上 Replicated 前綴澎语。例如:ReplicatedMergeTree。
- 首先創(chuàng)建一個(gè)分布式數(shù)據(jù)庫
create database test on cluster default_cluster;
- 創(chuàng)建本地表
由于clickhouse是分布式的验懊,創(chuàng)建本地表本來應(yīng)該在每個(gè)節(jié)點(diǎn)上創(chuàng)建的擅羞,但是指定on cluster關(guān)鍵字可以直接完成,建表語句如下:
CREATE TABLE test.test_data_shade on cluster default_cluster
(
`data` Map(String, String),
`uid` String,
`remote_addr` String,
`time` Datetime64,
`status` Int32,
...其它字段省略
`dt` String
)
ENGINE = ReplicatedMergeTree()
partition by dt
order by (dt, sipHash64(uid));
這里表引擎為ReplicatedMergeTree鲁森,即有副本的表祟滴,根據(jù)dt按天分區(qū),提升查詢效率歌溉,sipHash64是一個(gè)hash函數(shù)垄懂,根據(jù)uid散列使得相同uid數(shù)據(jù)在同一個(gè)分片上面,如果有去重需求痛垛,速度更快草慧,因?yàn)榭梢杂?jì)算每個(gè)分片去重,再匯總一下即可匙头。
- 創(chuàng)建分布式表
CREATE TABLE test.test_data_all on cluster default_cluster as test.test_data_shade ENGINE = Distributed('default_cluster', 'test', 'test_data_shade', sipHash64(uid));
在多副本分布式 ClickHouse 集群中漫谷,通常需要使用 Distributed 表寫入或讀取數(shù)據(jù),Distributed 表引擎自身不存儲(chǔ)任何數(shù)據(jù)蹂析,它能夠作為分布式表的一層透明代理舔示,在集群內(nèi)部自動(dòng)開展數(shù)據(jù)的寫入、分發(fā)电抚、查詢惕稻、路由等工作。
通過jdbc寫入
這個(gè)我是看的官方文檔蝙叛,里面有2種選擇俺祠,感興趣的同學(xué)可以都去嘗試一下。
這里貼一下我的Pom依賴
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.3.1-patch</version>
<classifier>shaded</classifier>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
Flink主程序,消費(fèi)kafka蜘渣,做清洗淌铐,然后寫入clickhouse,這都是常規(guī)操作蔫缸,這里貼一下關(guān)鍵代碼吧腿准。
連接clickhouse有2種方式,8123端口的http方式捂龄,和基于9000端口的tcp方式释涛。
這里官方推薦的是連接驅(qū)動(dòng)是0.3.2:
<dependency>
<!-- please stop using ru.yandex.clickhouse as it's been deprecated -->
<groupId>com.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.3.2-patch11</version>
<classifier>all</classifier>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
Note: ru.yandex.clickhouse.ClickHouseDriver has been deprecated and everything under ru.yandex.clickhouse will be removed in 0.3.3.
官方推薦升級(jí)到0.3.2,上面表格給出了升級(jí)方法倦沧,文檔地址:
https://github.com/ClickHouse/clickhouse-jdbc/tree/master/clickhouse-jdbc