clickhouse介紹、安裝、數(shù)據(jù)類型、sql操作
1、介紹
ClickHouse是俄羅斯的Yandex于2016年開源的列式存儲數(shù)據(jù)庫(DBMS),使用C++語言編寫,主要用于在線分析處理查詢(OLAP),能夠使用SQL查詢實時生成分析數(shù)據(jù)報告。
OLAP(On-Line Analytical Processing)翻譯為聯(lián)機分析處理,專注于分析處理,從對數(shù)據(jù)庫操作來看,OLAP是對數(shù)據(jù)的查詢;
OLTP(on-line transaction processing)翻譯為聯(lián)機事務(wù)處理,專注于事務(wù)處理,從對數(shù)據(jù)庫操作來看,OLTP主要是對數(shù)據(jù)的增刪改。
1.1、特點:列式存儲
以下面的表為例:
1)采用行式存儲時,數(shù)據(jù)在磁盤上的組織結(jié)構(gòu)為:
好處是想查某個人所有的屬性時,可以通過一次磁盤查找加順序讀取就可以。但是當(dāng)想查所有人的年齡時,需要不停的查找,或者全表掃描才行,遍歷的很多數(shù)據(jù)都是不需要的。
2)采用列式存儲時,數(shù)據(jù)在磁盤上的組織結(jié)構(gòu)為:
這時想查所有人的年齡只需把年齡那一列拿出來就可以了。
3)列式存儲的好處:
對于列的聚合、計數(shù)、求和等統(tǒng)計操作原因優(yōu)于行式存儲;
由于某一列的數(shù)據(jù)類型都是相同的,針對于數(shù)據(jù)存儲更容易進行數(shù)據(jù)壓縮,每一列選擇更優(yōu)的數(shù)據(jù)壓縮算法,大大提高了數(shù)據(jù)的壓縮比重;
由于數(shù)據(jù)壓縮比更好,一方面節(jié)省了磁盤空間,另一方面對于cache也有了更大的發(fā)揮空間
DBMS的功能:幾乎覆蓋了標(biāo)準(zhǔn)SQL的大部分語法,包括DDL和DML,以及配套的各種函數(shù),用戶管理及權(quán)限管理,數(shù)據(jù)的備份與恢復(fù);
1.2、多樣化引擎
ClickHouse和MySQL類似,把表級的存儲引擎插件化,根據(jù)表的不同需求可以設(shè)定不同的存儲引擎。目前包括合并樹、日志、接口和其他四大類20多種引擎;
1.3、高吞吐寫入能力
ClickHouse采用類LSM Tree的結(jié)構(gòu),數(shù)據(jù)寫入后定期在后臺Compaction。通過類LSM tree的結(jié)構(gòu),ClickHouse在數(shù)據(jù)導(dǎo)入時全部是順序append寫,寫入后數(shù)據(jù)段不可更改,在后臺compaction時也是多個段merge sort后順序?qū)懟卮疟P。順序?qū)懙奶匦?,充分利用了磁盤的吞吐能力,即便在HDD上也有著優(yōu)異的寫入性能。
官方公開benchmark測試顯示能夠達到50MB-200MB/s的寫入吞吐能力,按照每行100Byte估算,大約相當(dāng)于50W-200W條/s的寫入速度
1.4、數(shù)據(jù)分區(qū)與線程級并行
ClickHouse將數(shù)據(jù)劃分為多個partition,每個partition再進一步劃分為多個index granularity(索引粒度),然后通過多個CPU核心分別處理其中的一部分來實現(xiàn)并行數(shù)據(jù)處理。在這種設(shè)計下,單條Query就能利用整機所有CPU。極致的并行處理能力,極大的降低了查詢延時
所以,ClickHouse即使對于大量數(shù)據(jù)的查詢也能夠化整為零平行處理。但是有一個弊端就是對于單條查詢使用多cpu,就不利于同時并發(fā)多條查詢。所以對于高qps的查詢業(yè)務(wù),ClickHouse并不是強項
2、安裝
2.1、準(zhǔn)備工作
確定防火墻處于關(guān)閉狀態(tài)
CentOS取消打開文件數(shù)限制
sudo vim /etc/security/limits.conf
在末尾加入:
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
第一列是限制的用戶和用戶組,soft軟限制,hard硬限制,nofile打開文件數(shù),nproc用戶進程數(shù),退出當(dāng)前用戶,重啟登錄,ulimit -a
查看打開文件數(shù)和用戶進程數(shù)是否更改
[root@aliyun ~]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 7284 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 65536 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 131072 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
2.2、安裝依賴
sudo yum install -y libtool sudo yum install -y *unixODBC*
CentOS取消SELINUX(不知道為什么我修改后,就沒網(wǎng)了) vim /etc/selinux/config 修改為:SELINUX=disabled 修改完重啟服務(wù)器
單機安裝,下載安裝包,安裝包下載,需要以下四個rpm包:
clickhouse-client-21.7.3.14-2.noarch.rpm clickhouse-common-static-21.7.3.14-2.x86_64.rpm clickhouse-common-static-dbg-21.7.3.14-2.x86_64.rpm clickhouse-server-21.7.3.14-2.noarch.rpm
mac下要下載arm的,注意?。?!
wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-client-21.7.3.14-2.noarch.rpm wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-common-static-21.7.3.14-2.x86_64.rpm wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-common-static-dbg-21.7.3.14-2.x86_64.rpm wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-server-21.7.3.14-2.noarch.rpm
2.3、修改配置文件
cd /etc/clickhouse-server/ sudo chmod 777 config.xml? sudo vim config.xml?
把<listen_host>0.0.0.0</listen_host>的注釋打開,這樣的話才能讓ClickHouse被除本機之外的服務(wù)器訪問。
這個配置文件中,ClickHouse一些默認(rèn)路徑配置:
數(shù)據(jù)文件路徑: /var/lib/clickhouse/
日志文件路徑:/var/log/clickhouse-server/clickhouse-server.log
啟動Server
sudo systemctl start clickhouse-server 或者 sudo clickhouse start
查看啟動狀態(tài):
sudo systemctl status clickhouse-server 或者 sudo clickhouse status
關(guān)閉開啟自啟
sudo systemctl disable clickhouse-server
2.4、使用client連接server
clickhouse-client -m
在連接的過程中出現(xiàn)了兩個錯誤:錯誤一:
Code: 210. DB::NetException: Connection refused (localhost:9000). (NETWORK_ERROR)
如果在配置文件中有<listen_host>::</listen_host>,就改成<listen_host>0.0.0.0</listen_host>,因為::是IPv6的通配符,我部署clickhouse的機器不支持ipv6。
錯誤二:
Code: 516. DB::Exception: Received from localhost:9000. DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name. (AUTHENTICATION_FAILED)
在命令中帶上–password:clickhouse-client -m --password
3、數(shù)據(jù)類型
3.1、整形
固定長度的整型,包括有符號整型或無符號整型:Int8、Int16、Int32、Int64
3.2、浮點數(shù)
Float32、Float64
浮點數(shù)計算精度缺失問題:select 1.0-0.9
┌──────minus(1., 0.9)─┐
│ 0.09999999999999998 │
└─────────────────────┘
3.3、布爾型
沒有單獨的類型來存儲布爾值??梢允褂肬Int8類型,取值限制為0或1。
Decimal型
Decimal32(s)相當(dāng)于Decimal(9-s,s)
Decimal64(s)相當(dāng)于Decimal(18-s,s)
Decimal128(s)相當(dāng)于Decimal(38-s,s)
3.4、字符串
String:字符串可以任意長度的。它可以包含任意的字節(jié)集,包含空字節(jié);
FixedString(N):固定長度N的字符串,N必須是嚴(yán)格的正自然數(shù)。當(dāng)服務(wù)端讀取長度小于N的字符串時候,通過在字符串末尾添加空字節(jié)來達到N字節(jié)長度。當(dāng)服務(wù)端讀取長度大于N的字符串時候,將返回錯誤消息。
3.5、枚舉類型
包括Enum8和Enum16類型。Enum保存**’string’=integer**的對應(yīng)關(guān)系
Enum8用’string’=Int8來描述
Enum16用’string’=Int16來描述
創(chuàng)建一個帶有一個枚舉Enum8(‘hello’ = 1, ‘world’ = 2)類型的列:
create table t_enum( x Enum8('hello' = 1,'world' = 2) )engine = TinyLog;
這個x列只能存儲類型定義中列出的值:‘hello’或’world’:
inser tinto t_enum values ('hello'),('hello'),('world'),('world');
如果嘗試保存任何其他值,ClickHouse拋出異常:
insert into t_enum values('a');
如果需要看到對應(yīng)行的數(shù)值,則必須將Enum值轉(zhuǎn)換為整數(shù)類型:
select cast(x,'Int8') from t_enum;
3.6、時間類型
目前ClickHouse有三種時間類型:
Date接受年-月-日的字符串,比如:2019-12-16;
Datetime接受年-月-日 時:分:秒的字符串,比如2019-12-16 20:50:10;
Datetime64 接受年-月-日 時:分:秒.亞秒的字符串,比如2019-12-16 20:50:10.66。
日期類型用兩個字節(jié)存儲,表示從1970-01-01到當(dāng)前的日期值
3.7、數(shù)組
Array(T):由T類型元素組成的數(shù)組,T可以是任意類型,包含數(shù)組類型。但不推薦使用多維數(shù)組,ClickHouse對多維數(shù)組的支持有限。例如,不能在MergeTree表中存儲多維數(shù)組,創(chuàng)建數(shù)組方式:使用array函數(shù)
select array(1, 2) as x, toTypeName(x);
使用方括號
select [1, 2] as x, toTypeName(x);
4、SQL操作
Insert
基本與標(biāo)準(zhǔn)SQL(MySQL)基本一致:
標(biāo)準(zhǔn):
insert into [table_name] values(…),(…)
從表中插入表:
insert into [table_name] select a,b,c from [table_name_2]
Update和Delete
ClickHouse提供了Delete和Update的能力,這類操作被稱為Mutation查詢,它可以看做Alter的一種。雖然可以實現(xiàn)修改和刪除,但是和一般的OLTP數(shù)據(jù)庫不一樣,Mutation語句是一種很重的操作,而且不支持事務(wù)。
重的原因主要是每次修改或者刪除都會導(dǎo)致放棄目標(biāo)數(shù)據(jù)的原有分區(qū),重建新分區(qū),所以盡量做批量的變更,不要進行頻繁小數(shù)據(jù)的操作。
刪除操作:
alter table t_order_smt delete where sku_id ='sku_001';
修改操作:
alter table t_order_smt update total_amount=toDecimal32(2000.00,2) where id=102;
由于操作比較重,所以Mutation語句分兩步執(zhí)行,同步執(zhí)行的部分其實只是進行新增數(shù)據(jù)、新增分區(qū)和并把舊分區(qū)打上邏輯上的失效標(biāo)記。直到觸發(fā)分區(qū)合并的時候,才會刪除舊數(shù)據(jù)釋放磁盤空間,一般不會開放這樣的功能給用戶,由管理員完成。
查詢操作
ClickHouse基本上與標(biāo)準(zhǔn)SQL差別不大:
支持子查詢;
支持CTE(Common Table Expression公用表表達式with子句);
支持各種JOIN,但是JOIN操作無法使用緩存,所以即使是兩次相同的JOIN語句,ClickHouse也會視為兩條新SQL;
不支持自定義函數(shù);
GROUP BY操作增加了with rollup、with cube、with total用來計算小計和總計。
測試下GROUP BY的三種操作,看下數(shù)據(jù):
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐ │ 101 │ sku_001 │ 1000 │ 2020-06-01 12:00:00 │ │ 101 │ sku_001 │ 1000 │ 2020-06-01 12:00:00 │ │ 102 │ sku_002 │ 2000 │ 2020-06-01 11:00:00 │ │ 102 │ sku_002 │ 2000 │ 2020-06-01 13:00:00 │ │ 102 │ sku_002 │ 12000 │ 2020-06-01 13:00:00 │ │ 102 │ sku_002 │ 2000 │ 2020-06-01 11:00:00 │ │ 102 │ sku_002 │ 2000 │ 2020-06-01 13:00:00 │ │ 102 │ sku_002 │ 12000 │ 2020-06-01 13:00:00 │ │ 102 │ sku_004 │ 2500 │ 2020-06-01 12:00:00 │ │ 102 │ sku_004 │ 2500 │ 2020-06-01 12:00:00 │ └─────┴─────────┴──────────────┴─────────────────────┘ ┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐ │ 102 │ sku_002 │ 600 │ 2020-06-02 12:00:00 │ │ 102 │ sku_002 │ 600 │ 2020-06-02 12:00:00 │ └─────┴─────────┴──────────────┴─────────────────────┘
with rollup:從右至左去掉維度進行小計
select id,sku_id,sum(total_amount) from t_order_mt group by id,sku_id with rollup;
with cube : 從右至左去掉維度進行小計,再從左至右去掉維度進行小計
select id,sku_id,sum(total_amount) from t_order_mt group by id,sku_id with cube;
with totals: 只計算合計
select id,sku_id,sum(total_amount) from t_order_mt group by id,sku_id with totals;
alter操作,同MySQL的修改字段基本一致。
1)新增字段:alter table tableName add column newcolname String after col1;
2)修改字段類型:alter table tableName modify column newcolname String;
3)刪除字段:alter table tableName drop column newcolname;
導(dǎo)出數(shù)據(jù)
clickhouse-client --query "select * from t_order_mt where create_time='2022-08-28 12:00:00'" --format CSVWithNames> /opt/module/data/rs1.csv
到此這篇關(guān)于clickhouse介紹、安裝、數(shù)據(jù)類型、sql操作的文章就介紹到這了,更多相關(guān)clickhouse安裝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sqlserver 支持定位當(dāng)前頁,自定義排序的分頁SQL(拒絕動態(tài)SQL)
sqlserver 支持定位當(dāng)前頁,自定義排序的分頁SQL(拒絕動態(tài)SQL)2010-05-05針對Sqlserver大數(shù)據(jù)量插入速度慢或丟失數(shù)據(jù)的解決方法
這篇文章主要介紹了針對Sqlserver大數(shù)據(jù)量插入速度慢或丟失數(shù)據(jù)的解決方法,很有實用價值,需要的朋友可以參考下2014-07-07跨服務(wù)器查詢導(dǎo)入數(shù)據(jù)的sql語句
此語句可用來將另一服務(wù)器中的數(shù)據(jù)插入到本數(shù)據(jù)庫中的某一表內(nèi)2009-10-10沒有SQL Server數(shù)據(jù)庫時如何打開.MDF文件
本文主要介紹了在安裝有Visual Studio 2005或以上的版本的前提下,沒有安裝SQL Server數(shù)據(jù)庫也可以打開.MDF數(shù)據(jù)庫文件的方法,需要的朋友可以參考下2015-08-08利用腳本自動安裝SQLServer的實現(xiàn)步驟分析
在工作中,經(jīng)常被要求一天安裝個10臺、8臺的SQL Server。2010-11-11SQL Server2019數(shù)據(jù)庫之簡單子查詢的具有方法
這篇文章主要介紹了SQL Server2019數(shù)據(jù)庫之簡單子查詢的具有方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04SQLite之Autoincrement關(guān)鍵字(自動遞增)
SQLite 的 AUTOINCREMENT 是一個關(guān)鍵字,用于表中的字段值自動遞增,關(guān)鍵字 AUTOINCREMENT 只能用于整型(INTEGER)字段。2015-10-10