前言
插件及服務器版本
服務器:ubuntu 16.04
Hadoop:2.6
ClickHouse:20.9.3.45
文章目錄
-
- 簡介
- 引擎配置
- HDFS表引擎的兩種使用形式
- 引用
簡介
ClickHouse的HDFS引擎可以對接hdfs,這里假設HDFS環境已經配置完成,本文測試使用的HDFS版本為2.6
HDFS引擎定義方法如下:
ENGINE = HDFS(hdfs_uri,format)
參數定義:
- hdfs_uri表示HDFS的文件存儲路徑
- format表示文件格式(指ClickHouse支持的文件格式,常見有CSV、TSV和JSON等)
HDFS表引擎兩種使用方式:
- 即負責讀文件也負責寫文件
- 只負責讀文件,文件寫入工作則由外部系統完成
引擎配置
-
由於hdfs配置了HA,如果不做配置,創建一張只負責讀文件的表,並查詢數據,會報如下錯誤:
Code: 210. DB::Exception: Received from localhost:9000. DB::Exception: Unable to connect to HDFS: InvalidParameter: Cannot parse URI: hdfs://mycluster, missing port or invalid HA configuration Caused by: HdfsConfigNotFound: Config key: dfs.ha.namenodes.mycluster not found.
-
需要做如下配置解決問題
1、拷貝hdfs-site.xml文件至/etc/clickhouse-server,並修改文件名為hdfs-client.xml
2、修改ClickHouse Server啟動文件,添加環境變量Environment=“LIBHDFS3_CONF=/etc/clickhouse-server/hdfs-client.xml”
備注:
這里測試環境為ubuntu環境,啟動服務用systemctl啟動,所以修改啟動文件的路徑為:vi /etc/systemd/system/clickhouse-server.service
3、加載並重啟clickhouse-serversystemctl daemon-reload systemctl restart clickhouse-server.service
4、測試
新創建一張只讀表,對應的hdfs上已經提前放了一個測試文件 1.txtCREATE TABLE test_hdfs ( id Int32 ) ENGINE HDFS('hdfs://mycluster/1.txt','CSV');
查詢表里的數據
HDFS表引擎的兩種使用形式
-
即負責讀文件,也負責寫文件
-
創建一張新表
CREATE TABLE test_hdfs_read ( id Int32, name String ) ENGINE HDFS('hdfs://mycluster/test','CSV');
-
插入數據
insert into test_hdfs_read values (1,'tracy');
-
查詢表數據並查看hdfs目錄情況
這里可以看到hdfs目錄下多了一個test文件
-
-
只負責讀文件,文件寫入工作則由外部系統完成
這種形式類似於hive的外掛表,由其它系統直接將文件直接寫入HDFS,通過參數hdsfs_ui和format與HDFS的文件路徑、文件格式建立映射,其中hdfs_uri支持以下幾種常見的配置方法:
1. 絕對路徑:會指定路徑上的單個文件,例如hdfs://mycluster/1.txt
2. *通配符:匹配所有字符,例如hdfs://mycluster/ * ,會讀取hdfs://mycluster/路徑下的所有文件
3. ?通配符:匹配單個字符,例如hdfs://mycluster/test_?.txt會匹配所有test_?.txt的文件,?代表任意字符
4. {M…N}數字區間:匹配指定數字的文件,例如路徑hdfs://mycluster/test_{1…3}.txt,則會讀取hdfs://mycluster/路徑下的文件test_1.txt,test_2.txt,test_3.txt-
在hdfs新建一個目錄,並放3個文件
-
測試*通配符
CREATE TABLE test_hdfs_read_all ( `id` Int32, `name` String ) ENGINE = HDFS('hdfs://mycluster/test_hdfs_read/*', 'CSV')
-
測試?通配符
CREATE TABLE test_hdfs_read_1 ( `id` Int32, `name` String ) ENGINE = HDFS('hdfs://mycluster/test_hdfs_read/test_?.csv', 'CSV')
-
測試數字區間通配符通配符
CREATE TABLE test_hdfs_read_2 ( `id` Int32, `name` String ) ENGINE = HDFS('hdfs://mycluster/test_hdfs_read/test_{2..3}.csv', 'CSV')
這里只匹配了test_2和test_3,所以只有兩條記錄
-
引用
https://github.com/ClickHouse/ClickHouse/issues/8159