clickhouse常見異常以及錯誤碼解決


一、異常

1)DB::Exception: Nested type Array(String) cannot be inside Nullable type (version 20.4.6.53 (official build))
原因:字段類型是Nullable(String),在使用一些字符串函數如splitByString,他們對Nullable類型是不支持的,需要轉成String。
解決:使用cast強轉一下字段類型就行:

select splitByString(',',cast(col as String)) col from test

2)DB::Exception: Cannot convert NULL value to non-Nullable type: while converting source column second_channel to destination column second_channel (version 20.4.6.53 (official build))
原因:字段類型是非空類型,insert null值到非空字段second_channel會報錯。
解決:可以將非空類型改成Nullable(String),但是要注意Nullable字段不允許用於order by。

3)DB::Exception: Memory limit (total) exceeded: would use 113.20 GiB (attempt to allocate chunk of 134200512 bytes), maximum: 113.14 GiB: While executing CreatingSetsTransform. (version 20.4.6.53 (official build))
原因:單次查詢出來的數據量,大於單台機器的剩余內存。
解決:可以將查詢范圍縮小,比如添加查詢條件對查詢結果取余,也可以清理或者添加物理機內存。

5)DB::Exception: Table columns structure in ZooKeeper is different from local table structure (version 20.12.3.3 (official build))
原因:Replicated(副本)表刪表重建,但zk中表結構刪除操作是異步的,默認為五分鍾。
解決:重啟該節點的ck,或者選擇等待幾分鍾內。

6)Too many parts (300). Merges are processing significantly  slower than inserts...

原因:使用 Flink 實時消費 Kafka 的數據,Sink 到 ClickHouse ,策略是一條一條插入,任務上線一段時間之后,ClickHouse 扛不住數據插入的壓力了(是因為MergeTree的merge的速度跟不上 data part 生成的速度)。

解決:優化 FLink ClickHouse Sink邏輯, 根據時間和數據量做觸發,滿足其一才會執行插入操作。

7)Caused by: org.apache.spark.memory.SparkOutOfMemoryError: error while calling spill() on org.apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter@5915c8a5

原因:磁盤空間不足。

8)spark sql unsupported type array

原因:因為數據源的數組類型和spark sql的數組類型不一致,可以將數組轉為string

解決:

select toString(field) from tablet

9)DB::NetException: Connection reset by peer, while reading from socket xxx

clickhouse-server進程自己掛掉

原因:異常拋出的時間點有出現clickhouse-server的重啟,通過監控系統看到機器的內存使用在該時間點出現高峰,在初期集群"裸奔"的時期,很多內存參數都沒有進行限制,導致clickhouse-server內存使用量太高被OS KILL掉。

解決:合理設置max_concurrent_queries,max_bytes_before_external_sort,background_pool_size,max_memory_usage,max_memory_usage_for_all_queries,max_bytes_before_external_group_by,尤其重要的是max_memory_usage_for_all_queries 【 單機最大的內存使用量可以設置略小於機器的物理內存(留一點內操作系統)】。

10)zookeeper的snapshot文件太大,follower從leader同步文件時超時

原因:clickhouse對zookeeper的依賴非常的重,表的元數據信息,每個數據塊的信息,每次插入的時候,數據同步的時候,都需要和zookeeper進行交互,存儲的數據非常的多。

解決:

  1. zookeeper的snapshot文件存儲盤不低於1T,注意清理策略; 

  2. zookeeper集群的znode最好能在400w以下; 

  3. 建表的時候添加use_minimalistic_part_header_in_zookeeper參數,對元數據進行壓縮存儲,對於高版本的clickhouse可以直接在原表上面修改該setting信息,【注意修改完成以后無法再回滾】。

11)分布式clickhouse表處於”read only mode”,插入失敗

原因:zookeeper壓力太大

解決:

  1. zookeeper機器的snapshot文件和log文件最好分盤存儲(推薦SSD)提高ZK的響應;

  2. 做好zookeeper集群和clickhouse集群的規划,可以多套zookeeper集群服務一套clickhouse集群。

二、錯誤碼

1)Code: 48

Received exception from server (version 21.1.2.15):
Code: 48. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Mutations are not supported by storage Distributed.

原因:分布式表不能進行更新,ALTER TABLE UPDATE/DELETE不支持分布式DDL

解決:需要在分布式環境中手動在每個節點上local的進行更新/刪除數據。


2)Code:1002
2021-02-22 07:31:31,656 ERROR [main] execute clickhouse Query Error
ru.yandex.clickhouse.except.ClickHouseUnknownException: ClickHouse exception, code: 1002, host: xxxx, port: 8123; xxxx:8123 failed to respond
原因: JDBC client端和server端對 http connection , header `keep-alive` 不一致。

解決:升級clickhouse-jdbc 驅動jar或者pom引入依賴版本到0.2.6 。


3)Code: 159,read timeout

原因:查詢超時導致報錯。
解決:執行某些SQL很耗時導致最后報錯讀超時,這是因為clickhouse執行單次SQL的默認最大等待時間是30s,如果有比較耗時的SQL, 可以通過將JdbcURL的socket_timeout參數值設置的大一點來解決這個問題(注意這個參數的時間單位是毫秒,默認是30000)。

 

4)Code 62,Max query size exceeded

原因:Select語句中使用in方式查詢報錯。

解決:
這其實是因為查詢語句特別的大造成的,而默認的max_query_size最大是256 KiB。打開/etc/clickhouse-server/users.xml(只配置了一些常用的用戶)。max_query_size這種配置,就需要在profiles部分中配置修改。

注意這里的單位是bytes(字節),我這里設置了102410241024=1,073,741,824,就解決問題了。如果是sql創建的用戶,需要通過sql修改配額,修改方式參考https://www.cnblogs.com/MrYang-11-GetKnow/p/15896355.html

 

5)Code: 168,AST is too big,Maximum: 50000

原因:AST太大了。

解決:
在users.xml配置文件中添加相應配置,或者通過sql修改,具體步驟參照修改權限文檔即可。

<max_ast_elements>10000000</max_ast_elements>
<max_expanded_ast_elements>10000000</max_expanded_ast_elements>

 

6)Code: 221,db::exception: no interserver io endpoint named…
復制副本數據時報錯導致無法同步數據,直接在err.log日志文件看到的報錯是:auto DB::StorageReplicatedMergeTree::processQueueEntry(ReplicatedMergeTreeQueue::SelectedEntryPtr)::(anonymous class)::operator()(DB::StorageReplicatedMergeTree::LogEntryPtr &) const: Poco::Exception. Code: 1000, e.code() = 111, Connection refused

原因:沒有指定interserver_http_host參數,clickhouse配置文件中關於對這個參數的描述我翻譯過來大概意思就是這個參數是其他副本用於請求此服務器的主機名;如果未指定,則與“hostname-f”命令類似確定,此設置可用於將復制切換到另一個網絡接口(服務器可以通過多個地址連接到多個網絡)。不指定該參數的話,服務器就會試圖連接到自己,而對應的端口號未提供服務時就會報Connection refused這樣的錯誤了。

 

7)Code: 253, Replica /clickhouse/tables/XXX/XXX/replicas/dba07 already exists
原因:建立副本表(ReplicatedMergeTree)的時候,如果數據庫的引擎是Atomic,則在刪除表之后馬上重建會報這個錯。刪除的時候clickhouse是通過異步線程清除掉zookeeper上的數據的,立馬新建的話可能異步線程還沒開始執行,如果不想做其他操作的話,等一會再執行創建語句就不會報這個錯了,也可以通過指定如下參數設置清除zookeeper上數據操作的延遲時間:

<!-- 修改參數 database_atomic_delay_before_drop_table_sec = 0 ,解決刪除副本表立馬重建會報錯的問題 -->
<database_atomic_delay_before_drop_table_sec>0</database_atomic_delay_before_drop_table_sec>

 

8)Code: 252
Code: 252, e.displayText() = DB::Exception: Too many partitions ,for single INSERT block (more than 100).
原因:單次插入的數據分區太多了,超過默認配置的 100 個了。
解決:
  1.合理設置分區字段 。
  2.修改這個 max_partitions_per_insert_block 參數,調大這個值。
  3.避免同一批次寫入包含太多分區的數據。

 

9)Code: 359
Code: 359,e.displayText()=DB::Exception: Table or Partition in xxx was not dropped.
Reason:
1. Size (158.40 GB) is greater than max_[table/partition]_size_to_drop (50.00 GB)
2. File '/data/clickhouse/clickhouse-server/flags/force_drop_table' intended to force DROP doesn't exist
原因:
1) 可以看到,刪除的數據實際大小已經超過了配置的大小。
2) 說明是可以跳過配置檢查,進行強制刪除的,但是沒找到這個文件 /data/clickhouse/clickhouse-server/flags/force_drop_table,所以不能跳過檢查,也就是不能強制刪除。
解決:
根據錯誤提示2 ,在所在的節點執行:

sudo touch '/data/clickhouse/clickhouse-server/flags/force_drop_table'
&& sudo chmod 666 '/data/clickhouse/clickhouse-server/flags/force_drop_table'

然后再次執行 刪除操作就可以了。需要注意的是,這個標識文件有效期只有一次,執行刪除完畢之后,這個文件就會消失。

 

10)Code: 117

Code: 117, e.displayText() = DB::Exception: Unexpected NULL value of not Nullable type String (version 20.8.3.18)
原因:因為null值導致的,hive底層存儲null值是用\N表示,而clickhouse處理null值的方式不一致,因為需要在建表時特殊說明。

解決:參照處理null值文檔

 

11)Code: 62

ERROR ApplicationMaster: User class threw exception: ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 62, host: 127.0.0.1, port: 8123; Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 1432 (end of query): . Expected one of: ENGINE, storage definition (version 20.8.3.18)ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 62, host: 127.0.0.1, port: 8123; Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 1432 (end of query): . Expected one of: ENGINE, storage definition (version 20.8.3.18)
原因:表不存在

解決:創建相關表

 

12)Code: 241

Code: 241. DB::Exception: Received from localhost:9000. DB::Exception: Memory limit (for query) exceeded: would use 9.31 GiB (attempt to allocate chunk of 4223048 bytes), maximum: 9.31 GiB: While executing MergeTreeThread: While executing CreatingSetsTransform.

原因:內存使用超出限制,默認的最大限制是10G。

解決:sql設置單次查詢內存或者設置用戶配額(sql設置或者users.xml設置調整max_memory_usage = 20000000000000)

小結:

  1. 如果是group by內存不夠,推薦配置上max_bytes_before_external_group_by參數,當使用內存到達該閾值,進行磁盤group by;

  2. 如果是order by內存不夠,推薦配置上max_bytes_before_external_sort參數,當使用內存到達該閾值,進行磁盤order by;

  3. 如果是count distinct內存不夠,推薦使用一些預估函數(如果業務場景允許),這樣不僅可以減少內存的使用同時還會提示查詢速度;

  4. 對於JOIN場景,需注意的是clickhouse在進行JOIN的時候都是將"右表"進行多節點的傳輸的(右表廣播),如果你已經遵循了該原則還是無法跑出來,那么只好擴內存或者分割數據跑出結果進行匯總。

 
        

13)Code: 202

ClickHouse exception, code: 202, host: xxxxx, port: 8123; Code: 202, e.displayText() = DB::Exception: Too many simultaneous queries. Maximum: 100
原因:最大並發為100。

解決:修改config.xml文件:<max_concurrent_queries>100</max_concurrent_queries>。

 

14)Code: 252

ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 252, host: xxxx, port: 8123; Code: 252, e.displayText() = DB::Exception: Too many parts (308). Merges are processing significantly slower than inserts. (version 20.8.3.18)
原因:插入的速度太快了,clickhouse合並的速度太慢。

解決:調小並行度,減少批次處理的條數。

小結:分區字段的設置要慎重考慮,如果每次插入涉及的分區太多,那么不僅容易出現上面的異常,同時在插入的時候也比較耗時,原因是每個數據目錄都需要和zookeeper進行交互。 

 

15)Code: 159

Code: 159. DB::Exception: Received from localhost:9000. DB::Exception: Watching task /clickhouse/task_queue/ddl/query-0000000002 is executing longer than distributed_ddl_task_timeout (=180) seconds. There are 3 unfinished hosts (0 of them are currently active), they are going to execute the query in background.
原因:ck端口是否寫錯
解決:檢查metrika.xml文件中ck端口

 

16)  Code: 32

Clickhouse code 32 DB::Exception: Attempt to read after eof

原因:建立dict字典表時,行數過多。(也可能是使用AggregateFunction觸發的,其需要調整相應參數以及聚合方法)

解決:1)緩存字典布局,一次僅將 全部數據 的一部分加載到內存中。

           2)max_insert_threads 參數變更,更改set max_insert_threads=32。

 

17)Code: 210

Code: 210, e.displayText() = DB::NetException: Connection refused: (10.121.21.33:9000), e.what() = DB::NetException  ConnectionPoolWithFailover: Connection failed at try ..

原因:配置文件中的remote_servers配置有誤

解決:檢查以下文件 /etc/clickhouse-server/config.xml 的 remote_servers 部分,可以參考https://www.cnblogs.com/MrYang-11-GetKnow/p/16106389.html進行配置。 

 

18)Code: 516

Code: 516. DB::Exception: Received from localhost:9000. DB::Exception: Received from chi-repl-05-replicated-0-0:9000. DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name.

原因:分布式表密碼設置有誤或網絡配置有誤

解決:

  1. 從默認用戶中刪除密碼並為默認用戶設置< network >限制。
  2. 為默認用戶設置密碼並在 remote_servers 中使用相同的密碼
  3. 為 remote_servers 設置< secret >
  4. 設置另一個用戶並在 remote_servers 中使用此用戶

 

19)Code: 253

Code: 253, Exception: Replica /clickhouse/tables/[...] already exists (version 21.8.10.19 Docker)

 原因:DROP TABLE ... 期間未清理 zookeeper,

解決:

 1)可能與 Atomic Database Engine 有關...使用 DROP TABLE ... SYNC

 2)嘗試執行 docker-compose down && docker volume prune -f && docker-compose up -d以確保 zookeeper 卷是干凈的並且不包含之前嘗試的數據

20) Code:999

 Code: 999, e.displayText() = Coordination::Exception: Not authenticated, path: /clickhouse, e.what() = Coordination::Exception

原因:zk添加用戶認證之后無權限連接

解決:config.xml 中zookeeper配置需要添加相關認證用戶密碼。(或者暴力解決,跳過zk認證,zk設置 :skipACL=yes

<yandex>
    <zookeeper>
        <node index="1">
            <host>X.X.X.X</host>
            <port>2181</port>
        </node>
        <node index="2">
            <host>Y.Y.Y.Y</host>
            <port>2181</port>
        </node>
        <node index="3">
            <host>Z.Z.Z.Z</host>
            <port>2181</port>
        </node>
        <identity>user:password</identity>
    </zookeeper>
</yandex>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM