ClickHouse入门
1 什么是ClickHouse
? ClickHouse 是俄羅斯的Yandex于2016年開源的列式存儲數據庫(DBMS),他的優勢就是快,每秒處理的數據量特別大,主要用于在線分析處理查詢(OLAP),能夠使用SQL查詢實時生成分析數據報告。
? 與Hadoop、Spark這些巨無霸組件相比,ClickHouse很輕量級,其特點:列式存儲數據庫,數據壓縮;關系型、支持SQL;分布式并行計算,把單機性能壓榨到極限;高可用;數據量級在PB級別。
適用場景:日志數據的行為分析,標簽畫像的分析,數據集市層分析等。
2 ClickHouse安裝
? 下載地址:https://packagecloud.io/altinity/clickhouse
? (1)安裝前準備:
? ①取消CentOS取消打開文件數限制:在/etc/security/limits.conf、/etc/security/limits.d/90-nproc.conf這2個文件的末尾加入一下
* soft nofile 65536 * hard nofile 65536 * soft nproc 131072 * hard nproc 131072? ②CentOS取消SELINUX:修改/etc/selinux/config中的SELINUX=disabled后重啟
SELINUX=disabled? ③關閉防火墻
? (2)下載四個安裝包
wget --content-disposition https://packagecloud.io/Altinity/clickhouse/packages/el/6/clickhouse-server-common-1.1.54362-1.el6.x86_64.rpm/download.rpm wget --content-disposition https://packagecloud.io/Altinity/clickhouse/packages/el/6/clickhouse-server-1.1.54362-1.el6.x86_64.rpm/download.rpm wget --content-disposition https://packagecloud.io/Altinity/clickhouse/packages/el/6/clickhouse-debuginfo-1.1.54362-1.el6.x86_64.rpm/download.rpm wget --content-disposition https://packagecloud.io/Altinity/clickhouse/packages/el/6/clickhouse-client-1.1.54362-1.el6.x86_64.rpm/download.rpm? (3)安裝server-common
sudo rpm -ivh clickhouse-server-common-1.1.54362-1.el6.x86_64.rpm? (2)安裝server
sudo rpm -ivh clickhouse-server-1.1.54362-1.el6.x86_64.rpm? 如果遇到下面依賴問題安裝依賴包
error: Failed dependencies:libicudata.so.42()(64bit) is needed by clickhouse-common-static-19.7.3.9-1.el6.x86_64libicui18n.so.42()(64bit) is needed by clickhouse-common-static-19.7.3.9-1.el6.x86_64libicuuc.so.42()(64bit) is needed by clickhouse-common-static-19.7.3.9-1.el6.x86_64 ---------------------------------------------------------------------------yum install libicu.x86_64 yum install -y unixODBC libicudata? (3)安裝debug
sudo rpm -ivh clickhouse-debuginfo-1.1.54362-1.el6.x86_64.rpm? (4)安裝client
sudo rpm -ivh clickhouse-client-1.1.54362-1.el6.x86_64.rpm? (5)驗證:因為安裝好后會直接寫如環境變量,所以直接clousehouse看有沒有提示就行
? (6)啟動
前臺啟動:clickhouse-server --config-file=/etc/clickhouse-server/config.xml 后臺啟動:nohup clickhouse-server --config-file=/etc/clickhouse-server/config.xml >null 2>&1 &? (7)client連接server
# clickhouse-client ClickHouse client version 1.1.54236. Connecting to localhost:9000. Connected to ClickHouse server version 1.1.54236.bigdata01 :)? 客戶端連接常用參數
| –host, -h | 服務端的 host 名稱, 默認是 ‘localhost’ |
| –port | 連接的端口,默認值: 9000。 |
| –user, -u | 用戶名。 默認值: default。 |
| –password | 密碼。 默認值: 空字符串。 |
| –query, -q | 非交互模式下的查詢語句. |
| –database, -d | 默認當前操作的數據庫。 默認值: default |
| –multiline, -m | 允許多行語句查詢 |
| –format, -f | 使用指定的默認格式輸出結果。 |
| –time, -t | 非交互模式下會打印查詢執行的時間到窗口。 |
| –stacktrace | 如果出現異常,會打印堆棧跟蹤信息。 |
| –config-file | 配置文件的名稱。 |
? (8)關閉ClickServer
service clickhouse-server stop3 分布式集群及配置文件
? 按上面步驟在4個節點安裝ClickHouse,然后修改配置文件
? 我是使用“Core Data & Core AI 流分析平臺 JDP” 網址:http://www.fusionlab.cn/
? 配置文件說明: ClickHouse的配置文件是config.xml,默認在/etc/clickhouse-server/目錄中
? (1)config.xml
<?xml version="1.0" encoding="utf-8"?> <yandex><!-- logger:日志記錄設置--><logger><count>10</count> -- ClickHouse存儲的已歸檔日志文件的數量<size>1000M</size> -- 文件的大小。適用于loganderrorlog,文件達到大小后,ClickHouse將對其進行存檔并重命名,并在其位置創建一個新的日志文件<errorlog>/var/log/clickhouse-server/error.log</errorlog> -- 錯誤日志文件<log>/var/log/clickhouse-server/server.log</log> --日志文件,根據級別包含所有條目<level>trace</level> --日志記錄級別。可接受的值: trace, debug, information, warning, error</logger><remote_servers incl="clickhouse_remote_servers"/><!-- listen_host:限制來源主機的請求, 如果要服務器回答所有請求,請指定“::”--><listen_host>::</listen_host><!--tcp_port:通過TCP協議與客戶端進行通信的端口,即ClickHouse端口--><tcp_port>9000</tcp_port><zookeeper incl="zookeeper-servers" optional="true"/><distributed_ddl><path>/clickhouse/task_queue/ddl</path></distributed_ddl><!--max_connections:最大連接數--_<max_connections>64</max_connections><builtin_dictionaries_reload_interval>3600</builtin_dictionaries_reload_interval><!--通過HTTP連接到服務器的端口--><http_port>8123</http_port><!--users_config:用戶配置文件,可以配置用戶訪問、profiles、quota、查詢等級等。--><users_config>users.xml</users_config><!--macros:復制表的參數替換,如果不使用復制表,則可以省略--><macros incl="macros" optional="true"/><!-- tmp_path:用于處理大型查詢的臨時數據的路徑--><tmp_path>/data/clickhouse/tmp/</tmp_path><!--max_table_size_to_drop:刪除表的限制,默認50G,0表示不限制_<max_table_size_to_drop>0</max_table_size_to_drop><!--uncompressed_cache_size:表引擎從MergeTree使用的未壓縮數據的緩存大小--><uncompressed_cache_size>8589934592</uncompressed_cache_size><!--include_from:帶替換文件的路徑--><include_from>/etc/clickhouse-server/config/metrika.xml</include_from><!--query_log:通過log_queries = 1設置,記錄接收到的查詢--><log_queries>1</log_queries><!--max_concurrent_queries:同時處理的最大請求數--><max_concurrent_queries>16</max_concurrent_queries><!--path:數據的目錄路徑。--><path>/data/clickhouse</path><!--interserver_http_host:其他服務器可以用來訪問該服務器的主機名。如果省略,則其定義方法與hostname -f命令相同><interserver_http_host>ambari01</interserver_http_host><!-- mark_cache_size:標記緩存的大小,用于MergeTree系列的表中--><mark_cache_size>10737418240</mark_cache_size><!--default_profile:默認設置配置文件,在參數user_config中指定--><default_profile>default</default_profile><!--keep_alive_timeout:ClickHouse在關閉連接之前等待傳入請求的秒數。 默認為3秒--><keep_alive_timeout>3</keep_alive_timeout><!--default_database:默認數據庫--><default_database>default</default_database><!-- interserver_http_port:于在ClickHouse服務器之間交換數據的端口--><interserver_http_port>9009</interserver_http_port>? (2)metrika.xml
<?xml version='1.0' encoding='utf-8'?> <yandex><!--宏配置,這里唯一標識一個副本名稱,每個實例都要配置并且都是唯一的--><macros><layer>01</layer>---layer:雙級分片設置,單集群所以這個值對我們沒有影響全部一樣即可<replica>ambari01-01-1</replica>---replica是副本標識,這里使用了cluster{layer}-{shard}-{replica}的表示方式,ambari01-01-1表示ambari01集群的01分片下的1號副本<shard>01</shard>---shard:分片編號</macros><!--zookeeper配置--><zookeeper-servers><node index="1"><host>ambari01</host><port>2181</port></node><node index="2"><host>ambari02</host><port>2181</port></node><node index="3"><host>ambari03</host><port>2181</port></node></zookeeper-servers><!--compression:MergeTree引擎表的數據壓縮設置--><clickhouse_compression><case><min_part_size>10000000000</min_part_size>--數據部分的最小大小<min_part_size_ratio>0.01</min_part_size_ratio> --數據部分大小與表大小的比率<method>lz4</method>---壓縮算法,zstd和lz4</case></clickhouse_compression><!--remote_servers:遠程服務器,分布式表引擎和集群表功能使用的集群的配置--><clickhouse_remote_servers><!---ck_cluster:集群名稱--><ck_cluster><!---第一個分片--><shard><!--internal_replication,表示是否只將數據寫入其中一個副本,默認為false,表示寫入所有副本,在復制表的情況下可能會導致重復和不一致,所以這里一定要改為true,clickhouse分布式表只管寫入一個副本,其余同步表的事情交給復制表和zookeeper來進行--><internal_replication>true</internal_replication><!---第一個分片的第一個副本--><replica><host>ambari01</host><user>admin</user><password>admin</password><port>9000</port></replica><!---第一個分片的第二個副本--><replica><host>ambari02</host><user>admin</user><password>admin</password><port>9000</port></replica></shard><!---第二個分片--><shard><internal_replication>true</internal_replication><!---第二個分片的第一個副本--><replica><host>ambari03</host><user>admin</user><password>admin</password><port>9000</port></replica><!---第二個分片的第二個副本--><replica><host>ambari04</host><user>admin</user><password>admin</password><port>9000</port></replica></shard></ck_cluster></clickhouse_remote_servers><!--networks表示允許被登陸clickhouse服務器的客戶端列表,支持通過ip、host、host_regexp方式設置--><networks><ip>::/0</ip></networks>? (3)users.xml
<?xml version="1.0" encoding="utf-8"?> <yandex><!--profile:類似于用戶角色,可以實現最大內存、負載方式等配置的服用--><profiles><!--可自定義名稱,default是默認存在的角色名稱--><default><load_balancing>random</load_balancing><max_memory_usage>10000000000</max_memory_usage><use_uncompressed_cache>0</use_uncompressed_cache></default><!--自定義readonly角色--><readonly><load_balancing>random</load_balancing><max_memory_usage>10000000000</max_memory_usage><readonly>1</readonly><use_uncompressed_cache>0</use_uncompressed_cache></readonly></profiles><!--quotas:限制一段時間內的資源使用等--><quotas><default><interval><duration>3600</duration><errors>0</errors><execution_time>0</execution_time><queries>0</queries><read_rows>0</read_rows><result_rows>0</result_rows></interval></default></quotas><!--users:設置包括用戶名、密碼、權限等--><users><admin><networks incl="networks" replace="replace"><ip>::/0</ip></networks><password_sha256_hex>8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918</password_sha256_hex><profile>default</profile><quota>default</quota></admin><ck><networks incl="networks" replace="replace"><ip>::/0</ip></networks><password_sha256_hex>8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918</password_sha256_hex><profile>readonly</profile><quota>default</quota></ck></users> </yandex> 生成密碼 PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'4 數據類型
? 官方文檔:https://clickhouse.yandex/docs/zh/data_types/
? 下面介紹幾種常見的數據類型
4.1 整型
? 固定長度的整型,包括有符號整型或無符號整型。
? (1)整型 范圍(-2n-1~2n-1-1):
| Int16 | [-32768 : 32767] |
| Int32 | [-2147483648 : 2147483647] |
| Int64 | [-9223372036854775808 : 9223372036854775807] |
? (2)無符號整型范圍(0~2n-1):
| UInt16 | [0 : 65535] |
| UInt32 | [0 : 4294967295] |
| UInt64 | [0 : 18446744073709551615] |
4.2 浮點型
? Float32 》 float ;Float64》double
? 建議盡可能以整數形式存儲數據,浮點型進行計算時可能引起四舍五入的誤差。
? 特殊的浮點型
? (1)Inf-正無窮
:) select 1-0.9 ┌───────minus(1, 0.9)─┐ │ 0.09999999999999998 │ └─────────────────────┘? (2)-Inf-負無窮
:) select -1/0 ┌─divide(1, 0)─┐ │ -inf │ └──────────────┘? (3)NaN-非數字
:) select 0/0 ┌─divide(0, 0)─┐ │ nan │ └──────────────┘4.3 字符串
? String:字符串可以任意長度的。它可以包含任意的字節集,包含空字節。
? FixedString(N):固定長度 N 的字符串,N 必須是嚴格的正自然數。當服務端讀取長度小于 N 的字符串時候,通過在字符串末尾添加空字節來達到 N 字節長度。 當服務端讀取長度大于 N 的字符串時候,將返回錯誤消息。
4.4 數組
? Array(T):由 T 類型元素組成的數組。T 可以是任意類型,包含數組類型。 但不推薦使用多維數組,ClickHouse 對多維數組的支持有限。如不能在 MergeTree 表中存儲多維數組。
? 創建方式:①使用array函數來創建數組array(T)②可以使用方括號[]
4.5 元組
? Tuple(T1, T2, …):元組,其中每個元素都有單獨的類型
? 創建方式:使用tuple函數tuple(T1, T2, …)
4.6 Date
? 日期類型,用兩個字節存儲,表示從 1970-01-01 (無符號) 到當前的日期值
4.7 枚舉
? 包括 Enum8 和 Enum16 類型。Enum 保存 ‘string’= integer 的對應關系。Enum8 用 ‘String’= Int8 對描述。Enum16 用 ‘String’= Int16 對描述。
? 使用案例:創建一個帶有一個枚舉 Enum8(‘hello’ = 1, ‘hi’ = 2) 類型的列:
CREATE TABLE t_enum(x Enum8('hello' = 1, 'hi' = 2) )ENGINE = TinyLog? 這個 x 列只能存儲類型定義中列出的值:‘hello’或’hi’。如果嘗試保存任何其他值則報錯
:) INSERT INTO t_enum VALUES ('hello'), ('hi')INSERT INTO t_enum VALUESOk.:) insert into t_enum values('a')INSERT INTO t_enum VALUESException on client: Code: 49. DB::Exception: Unknown element 'a' for type Enum8('hello' = 1, 'hi' = 2)? 從表中查詢數據時,ClickHouse 從 Enum 中輸出字符串值,如果需要看到對應行的數值,則必須將 Enum 值轉換為整數類型
SELECT CAST(x, 'Int8') FROM t_enum┌─CAST(x, 'Int8')─┐ │ 1 │ │ 2 │ └─────────────────┘5 SQL語法
5.1 CREATE
? (1) CREATE DATABASE:用于創建指定名稱的數據庫,語法如下:
CREATE DATABASE [IF NOT EXISTS] db_name? 如果查詢中存在IF NOT EXISTS,則當數據庫已經存在時,該查詢不會返回任何錯誤。
? (2)CREATE TABLE:對于創建表,語法如下:
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] (name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],... ) ENGINE = engine DEFAULT expr – 默認值,用法與SQL類似。 MATERIALIZED expr – 物化表達式,被該表達式指定的列不能被INSERT,因為它總是被計算出來的。 對于INSERT而言,不需要考慮這些列。 另外,在SELECT查詢中如果包含星號,此列不會被查詢。 ALIAS expr – 別名。? 有三種方式創建表:
? ①直接創建: create table t1(id UInt16,name String) engine=TinyLog
? ②創建一個與其他表具有相同結構的表:CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine]
? 可以對其指定不同的表引擎聲明。如果沒有表引擎聲明,則創建的表將與db2.name2使用相同的表引擎。
? ③使用指定的引擎創建一個與SELECT子句的結果具有相同結構的表,并使用SELECT子句的結果填充它。CREATE TABLE [IF NOT EXISTS] [db.]table_name ENGINE = engine AS SELECT …
5.2 INSERT INTO
? 主要用于向表中添加數據,基本格式如下:
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...? ClickHouse不支持的修改數據的查詢:UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE。
5.3 ALTER
? ALTER只支持MergeTree系列,Merge和Distributed引擎的表,基本語法:
ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|MODIFY COLUMN ...? 參數說明:ADD COLUMN – 向表中添加新列;DROP COLUMN – 在表中刪除列;MODIFY COLUMN – 更改列的類型
5.4 DESCRIBE TABLE
? 查看表結構:desc mt_table
5.5 CHECK TABLE
? 檢查表中的數據是否損壞,他會返回兩種結果:0 – 數據已損壞1 – 數據完整
? 該命令只支持Log,TinyLog和StripeLog引擎。
總結
以上是生活随笔為你收集整理的ClickHouse入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 邻接矩阵的深度优先遍历
- 下一篇: java 捆绑_java – 如何在ja