本文匯總了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等引擎。