本文匯總了ClickHouse使用時的常見問題。
如何創建ClickHouse用戶?
您可以通過以下兩種方法創建ClickHouse用戶:
通過在EMR控制臺新增配置項創建ClickHouse用戶
在EMR控制臺ClickHouse服務的配置頁面,單擊server-users頁簽,新增配置項,參數為users.<YourUserName>.password或users.<YourUserName>.password_sha256_hex或users.<YourUserName>.password_double_sha1_hex,參數值您可以自定義,保存該配置項并重啟服務,即可創建用戶。
通過ClickHouse客戶端創建ClickHouse用戶
在EMR控制臺ClickHouse服務的配置頁面,單擊server-users頁簽,新增參數為users.default.access_management,參數值為1的配置項,保存該配置并重啟服務。使用默認用戶連接ClickHouse集群。
使用SSH方式登錄ClickHouse集群,詳情請參見登錄集群。
執行如下命令,啟動ClickHouse客戶端。
clickhouse-client -h core-1-1 -m
說明本示例登錄core-1-1節點,如果您有多個Core節點,可以登錄任意一個節點。
執行以下命令,創建用戶。
CREATE USER IF NOT EXISTS user_test ON CLUSTER new_cluster_emr IDENTIFIED WITH plaintext_password BY '123456';
說明本示例創建的用戶為user_test,密碼為123456,您可以根據實際情況修改。
創建用戶命令格式如下。
CREATE USER [IF NOT EXISTS | OR REPLACE] name1 [ON CLUSTER cluster_name1] [, name2 [ON CLUSTER cluster_name2] ...] [NOT IDENTIFIED | IDENTIFIED {[WITH {no_password | plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']}] [HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE] [DEFAULT ROLE role [,...]] [GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]] [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY | WRITABLE] | PROFILE 'profile_name'] [,...];
執行以下命令,查看已有的用戶。
SHOW USERS;
返回已有的用戶。
┌─name──────┐ │ default │ │ user_test │ │ user_test2 │ └─────────┘
數據丟失,如何處理?
問題現象:向ClickHouse寫入A條數據,但實際讀出來只有B條,且B小于A。
問題原因:通常情況下,ClickHouse中的數據不會丟失。但是在一個shard存在至少兩個副本,本地表的表引擎為*MergeTree,同時使用分布式表進行讀數的場景下,可能會出現讀出來的數據少于寫入數據的情況。
無論是通過分布式表寫數據,還是直接寫入本地表,每個機器上都會存在數據;而通過分布式表讀數據時,默認每個shard僅會使用一個連接,此時的連接數是會少于機器數的,所以存在一些機器上的數據無法被讀取的情況。代碼示例如下。
CREATE TABLE db.table_local ( ... ) Engine = MergeTree() CREATE TABLE db.table_distributed ( ... ) Engine = Distributed(cluster_emr, db, table_local, rand());
處理方法:
方式
操作
方式一(推薦)
刪除db.table_local并后重新創建表,使用復制表作為本地表。
方式二(不推薦)
您可以在EMR控制臺ClickHouse服務的配置頁面,單擊server-users頁簽,單擊新增配置項,新增參數profiles.<your_profile_name>.max_parallel_replicas,參數值至少為每個shard下replica的數量,并確保users.<your_clickhouse-client_name>.profile值為<your_profile_name>。
說明<your_profile_name>和<your_clickhouse-client_name>均需要替換為您實際的名稱。各參數詳細信息,請參見訪問權限控制。
如果以上方法還是無法解決您的問題,請購買專家服務處理。
報錯提示Memory limit (for total) exceeded時,該如何處理?
問題原因:內存超過了server可使用的總內存。
處理方法:在EMR控制臺ClickHouse服務的配置頁面,單擊server-config頁簽,單擊新增配置項,新增參數max_server_memory_usage,該參數可以配置的最大值為
機器物理內存大小 * max_server_memory_usage_to_ram_ratio
。說明ClickHouse中max_server_memory_usage_to_ram_ratio參數的默認值為0.9,如果您需要調整該參數值,可以新增max_server_memory_usage_to_ram_ratio參數,參數值您可以根據實際情況調整。
報錯提示Memory limit (for query) exceeded時,該如何處理?
問題原因:內存超過了單次Query可使用的最大內存。
處理方法:
場景
操作
全局方式
在EMR控制臺ClickHouse服務的配置頁面,單擊server-config頁簽,單擊新增配置項,新增參數profiles.<your_profile_name>.max_memory_usage,并確保users.<your_clickhouse-client_name>.profile值為<your_profile_name>。
說明<your_profile_name>和<your_clickhouse-client_name>均需要替換為您實際的名稱。各參數詳細信息,請參見訪問權限控制。
針對使用clickhouse-client
在EMR控制臺ClickHouse服務的配置頁面,單擊client-config頁簽,單擊新增配置項,新增參數max_memory_usage。
針對某一次會話Session
可以直接
SET max_memory_usage=xxxx
,該配置在Session生命周期內均會生效。針對某一次Query
可以在SQL中添加配置,該配置僅對當前Query生效。
例如,
SELECT column FROM table SETTINGS max_memory_usage=xxxx
。
報錯提示Memory limit (for user) exceeded時,該如何處理?
問題原因:內存超過了單個用戶可使用的最大內存。
處理方法:
場景
操作
全局方式
在EMR控制臺ClickHouse服務的配置頁面,單擊server-users頁簽,單擊新增配置項,新增參數profiles.<your_profile_name>.max_memory_usage_for_user,并確保users.<your_clickhouse-client_name>.profile值為<your_profile_name>。
說明<your_profile_name>和<your_clickhouse-client_name>均需要替換為您實際的名稱。各參數詳細信息,請參見訪問權限控制。
針對使用clickhouse-client
在EMR控制臺ClickHouse服務的配置頁面,單擊client-config頁簽,單擊新增配置項,新增參數max_memory_usage_for_user。
針對某一次會話Session
可以直接使用命令
SET max_memory_usage_for_user=xxxx
,該配置在Session生命周期內均會生效。針對某一次Query
可以在SQL中添加配置,該配置僅對當前Query生效。
例如,
SELECT column FROM table SETTINGS max_memory_usage_for_user=xxxx
。
OLAP集群中ClickHouse服務是如何分布的?
ClickHouse服務包含ClickHouse Runtime,ClickHouse Server和ClickHouse Keeper。
在EMR-3.x系列版本中,ClickHouse不包含ClickHouse Keeper,ClickHouse Runtime會在所有類型的機器上安裝,ClickHouse Server僅在Core節點中安裝。
在EMR-5.x系列版本中,ClickHouse Runtime會在所有類型的機器上安裝,ClickHouse Server僅在Core節點安裝,ClickHouse Keeper 的個數為1個或3個,僅在Core節點的前3個節點中安裝,不支持擴容。創建集群的時候如果Core節點是2個節點,則安裝一個ClickHouse Keeper,之后即使擴容Core節點至4個,ClickHouse Keeper節點也不會增加至3個。
為什么導入數據的速率逐漸下降?
ClickHouse表大多數使用的是MergeTree相關的表(例如ReplicatedMergeTree和ReplacingMergeTree等)。
MergeTree表本身在收到數據的時候通過在內存中排序等操作會直接刷寫磁盤形成一個存儲在磁盤上的Data Part。磁盤上的Data Part會不斷的通過后臺線程進行Merge操作,以使眾多小的Data Part合并成一個大的Data Part。在將數據導入至MergeTree表的時候,初始時后臺線程可能找不到任何可以進行Merge的Data Part,此時所有的資源都在處理導入的數據從接收到刷寫到磁盤這一步驟,所以導入數據的速率相對來說比較高。導入數據一段時間后,由于越來越多Data Part可以被后臺線程合并,會有一部分的資源用于處理合并的操作。隨著磁盤上的數據越來越多,合并所需要的計算資源也會越來越多,直到達到導入數據與合并數據的平衡,所以導入數據的速率會不斷下降。
如何升級ClickHouse版本?
EMR ClickHouse版本因為與EMR版本綁定,所以如果需要升級ClickHouse版本,必須升級EMR版本。
ClickHouse中為什么要定義集群?
ClickHouse中的集群是通過配置定義的邏輯集群,可以在ClickHouse中通過執行SQL select * from system.clusters
命令來查看ClickHouse當前的邏輯集群有哪些,分別是什么。
允許用戶通過配置定義的邏輯集群是為了將多臺機器形成一個ClickHouse集群,并且通過邏輯集群的配置,劃分機器與機器之間的關系(shard、replica),同時也方便用戶為不同的業務劃分不同的邏輯集群。
EMR ClickHouse默認配置了一個包含集群中所有節點的邏輯集群。
ClickHouse中Shard和Replica是什么意思?
在ClickHouse中,一個節點可以與另外的一個或多個節點互為副本(Replica),在這些節點上以Replicated*MergeTree為存儲引擎的表的數據會保持一致。
在ClickHouse中,一個節點或多個節點可以組成一個Shard,這個Shard內的節點互為副本。
如何進行性能測試?
通常使用SSB進行測試,詳情請參見社區文檔Star Schema Benchmark。其它測試用例請參見Tutorials and Example Datasets和clickhouse-benchmark。
集群創建后,是否還能修改Shard和Replica?
例如,創建集群時使用的是A shard B replica,創建好集群后想修改為C shard D replica。ClickHouse支持從A shard B replica修改為 C shard D replica,您可以在EMR ClickHouse控制臺中,修改server-metrika項的clickhouse_remote_servers的值即可實現。
但是,不建議直接將A shard B replica修改為C shard D replica,這樣可能出現一些問題,尤其是集群中已經有數據存在的情況下,可能會導致集群的數據錯誤。建議新增一個邏輯集群配置支持C shard D replica,同時保留A shard B replica的配置。
EMR ClickHouse中使用HDFS時的配置有哪些?
您可以參見社區文檔HDFS。
EMR ClickHouse與云數據庫ClickHouse產品有哪些區別?
EMR ClickHouse集群的產品ID以
c-
開頭的,例如c-3c8697f91408****;而云數據庫ClickHouse集群的產品ID以cc-
開頭的,例如cc-bp16qwvp7hy8i****。EMR ClickHouse為半托管產品,您可以直接登錄機器進行運維操作;云數據庫ClickHouse為全托管產品,不可以直接登錄機器進行運維操作。
ClickHouse是否支持查詢使用DLF元數據的Hive表?
目前,ClickHouse不支持查詢使用DLF元數據的Hive表,只支持使用MySQL或RDS作為元數據的Hive表。因此,不建議直接使用ClickHouse查詢Hive表。
根據具體需求,建議如下:
如果需要將Hive數據導入到ClickHouse,建議使用Apache Spark或Apache Seatunnel進行數據導入。
如果需要對Hive數據進行分析,建議使用StarRocks、Trino、Impala等引擎。