HDFS
このエンジンは、Apache Hadoop エコシステムとの統合を提供し、ClickHouseを通じて HDFS 上のデータを管理することを可能にします。このエンジンは File や URL エンジンに似ていますが、Hadoop特有の機能を提供します。
この機能はClickHouseのエンジニアによるサポート対象ではなく、品質が不安定であることが知られています。問題が発生した場合は、自分で修正してプルリクエストを送ってください。
使用法
ENGINE = HDFS(URI, format)
エンジンパラメータ
URI- HDFS内の全体のファイルURI。URIのパス部分にはグロブを含めることができます。この場合、テーブルは読み取り専用になります。format- 利用可能なファイルフォーマットのいずれかを指定します。SELECTクエリを実行する場合、フォーマットは入力用にサポートされている必要があり、INSERTクエリを実行する場合は出力用にサポートされている必要があります。利用可能なフォーマットは Formats セクションにリストされています。- [PARTITION BY expr]
PARTITION BY
PARTITION BY — オプションです。ほとんどの場合、パーティションキーは必要ありませんが、必要な場合でも通常は月ごとに分けるほど詳細なパーティションキーは必要ありません。パーティショニングはクエリを高速化しません(ORDER BY 式とは対照的に)。非常に詳細なパーティショニングは避けてください。クライアントIDや名前でデータをパーティション分割しないでください(代わりに、クライアントIDや名前をORDER BY 式の最初のカラムにします)。
月ごとにパーティションを分ける場合は、toYYYYMM(date_column) 式を使用します。ここで、date_column は Date 型の日付を持つカラムです。ここでのパーティション名は "YYYYMM" フォーマットになります。
例:
1. hdfs_engine_table テーブルをセットアップ:
CREATE TABLE hdfs_engine_table (name String, value UInt32) ENGINE=HDFS('hdfs://hdfs1:9000/other_storage', 'TSV')
2. ファイルを埋める:
INSERT INTO hdfs_engine_table VALUES ('one', 1), ('two', 2), ('three', 3)
3. データをクエリ:
SELECT * FROM hdfs_engine_table LIMIT 2
┌─name─┬─value─┐
│ one │ 1 │
│ two │ 2 │
└──────┴───────┘
実装の詳細
読み取りと書き込みは並列で行われる可能性があります。
サポートされていないもの:
ALTERおよびSELECT...SAMPLE操作。- インデックス。
- ゼロコピー レプリケーションは可能ですが、推奨されません。
Noteゼロコピーのレプリケーションは本番環境には対応していません ClickHouseバージョン22.8以降ではデフォルトで無効になっています。この機能は本番環境での使用を推奨しません。
パス内のグロブ
複数のパスコンポーネントがグロブを含むことができます。処理されるためには、ファイルが存在し、全体のパスパターンに一致する必要があります。ファイルのリストは SELECT 中に決定されます(CREATE 時点ではなく)。
*—/を除く任意の文字を空文字列として含めた任意の数に置き換えます。?— 任意の一文字に置き換えます。{some_string,another_string,yet_another_one}— 文字列'some_string','another_string','yet_another_one'のいずれかに置き換えます。{N..M}— N から M までの範囲の任意の数字に置き換えます(両端を含む)。
{}を用いた構文は remote テーブル関数に似ています。
例
TSV形式の数ファイルがHDFSに以下のURIで保存されているとします:
- 'hdfs://hdfs1:9000/some_dir/some_file_1'
- 'hdfs://hdfs1:9000/some_dir/some_file_2'
- 'hdfs://hdfs1:9000/some_dir/some_file_3'
- 'hdfs://hdfs1:9000/another_dir/some_file_1'
- 'hdfs://hdfs1:9000/another_dir/some_file_2'
- 'hdfs://hdfs1:9000/another_dir/some_file_3'
すべての6つのファイルから成るテーブルを作成する方法はいくつかあります:
CREATE TABLE table_with_range (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_{1..3}', 'TSV')
別の方法:
CREATE TABLE table_with_question_mark (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_?', 'TSV')
両方のディレクトリのすべてのファイルから構成されるテーブル(クエリで記述されたフォーマットとスキーマに適合するすべてのファイル):
CREATE TABLE table_with_asterisk (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/*', 'TSV')
ファイルのリストが先頭ゼロ付きの数値範囲を含む場合は、個々の数字に対して中括弧 {} を使用するか、? を使用してください。
例
ファイル名が file000, file001, ... , file999 のファイルを持つテーブルを作成:
CREATE TABLE big_table (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/big_dir/file{0..9}{0..9}{0..9}', 'CSV')
設定
GraphiteMergeTreeと同様に、HDFSエンジンはClickHouseの設定ファイルを使用した拡張設定をサポートしています。使用できる設定キーはグローバル(hdfs)とユーザーレベル(hdfs_*)の二つです。グローバル設定が最初に適用され、次にユーザーレベルの設定が適用されます(存在する場合)。
<!-- HDFSエンジンタイプのグローバル設定オプション -->
<hdfs>
<hadoop_kerberos_keytab>/tmp/keytab/clickhouse.keytab</hadoop_kerberos_keytab>
<hadoop_kerberos_principal>clickuser@TEST.CLICKHOUSE.TECH</hadoop_kerberos_principal>
<hadoop_security_authentication>kerberos</hadoop_security_authentication>
</hdfs>
<!-- ユーザー "root" の特定の設定 -->
<hdfs_root>
<hadoop_kerberos_principal>root@TEST.CLICKHOUSE.TECH</hadoop_kerberos_principal>
</hdfs_root>
設定オプション
libhdfs3によってサポートされている設定
| パラメータ | デフォルト値 |
|---|---|
| rpc_client_connect_tcpnodelay | true |
| dfs_client_read_shortcircuit | true |
| output_replace-datanode-on-failure | true |
| input_notretry-another-node | false |
| input_localread_mappedfile | true |
| dfs_client_use_legacy_blockreader_local | false |
| rpc_client_ping_interval | 10 * 1000 |
| rpc_client_connect_timeout | 600 * 1000 |
| rpc_client_read_timeout | 3600 * 1000 |
| rpc_client_write_timeout | 3600 * 1000 |
| rpc_client_socket_linger_timeout | -1 |
| rpc_client_connect_retry | 10 |
| rpc_client_timeout | 3600 * 1000 |
| dfs_default_replica | 3 |
| input_connect_timeout | 600 * 1000 |
| input_read_timeout | 3600 * 1000 |
| input_write_timeout | 3600 * 1000 |
| input_localread_default_buffersize | 1 1024 1024 |
| dfs_prefetchsize | 10 |
| input_read_getblockinfo_retry | 3 |
| input_localread_blockinfo_cachesize | 1000 |
| input_read_max_retry | 60 |
| output_default_chunksize | 512 |
| output_default_packetsize | 64 * 1024 |
| output_default_write_retry | 10 |
| output_connect_timeout | 600 * 1000 |
| output_read_timeout | 3600 * 1000 |
| output_write_timeout | 3600 * 1000 |
| output_close_timeout | 3600 * 1000 |
| output_packetpool_size | 1024 |
| output_heartbeat_interval | 10 * 1000 |
| dfs_client_failover_max_attempts | 15 |
| dfs_client_read_shortcircuit_streams_cache_size | 256 |
| dfs_client_socketcache_expiryMsec | 3000 |
| dfs_client_socketcache_capacity | 16 |
| dfs_default_blocksize | 64 1024 1024 |
| dfs_default_uri | "hdfs://localhost:9000" |
| hadoop_security_authentication | "simple" |
| hadoop_security_kerberos_ticket_cache_path | "" |
| dfs_client_log_severity | "INFO" |
| dfs_domain_socket_path | "" |
HDFS Configuration Reference はいくつかのパラメータを説明するかもしれません。
ClickHouseエクストラ
| パラメータ | デフォルト値 |
|---|---|
| hadoop_kerberos_keytab | "" |
| hadoop_kerberos_principal | "" |
| libhdfs3_conf | "" |
制限事項
hadoop_security_kerberos_ticket_cache_pathおよびlibhdfs3_confはグローバルのみで、ユーザー固有にはできません
Kerberosサポート
もし hadoop_security_authentication パラメータが kerberos の値を持つとき、ClickHouseはKerberosを通じて認証します。
パラメータは こちら で、hadoop_security_kerberos_ticket_cache_path が役立つかもしれません。
libhdfs3の制限により古い方法のみがサポートされており、
データノードの通信はSASLで保護されていません(HADOOP_SECURE_DN_USER はそのようなセキュリティアプローチの信頼できる指標です)。tests/integration/test_storage_kerberized_hdfs/hdfs_configs/bootstrap.sh を参照として使用してください。
hadoop_kerberos_keytab、hadoop_kerberos_principal または hadoop_security_kerberos_ticket_cache_path が指定されている場合、Kerberos認証が使用されます。この場合、hadoop_kerberos_keytab と hadoop_kerberos_principal は必須です。
HDFS Namenode HAサポート
libhdfs3はHDFS namenode HAをサポートします。
hdfs-site.xmlをHDFSノードから/etc/clickhouse-server/にコピーします。- ClickHouseの設定ファイルに以下の部分を追加します:
<hdfs>
<libhdfs3_conf>/etc/clickhouse-server/hdfs-site.xml</libhdfs3_conf>
</hdfs>
- その後、HDFS URIでnamenodeアドレスとして
hdfs-site.xmlのdfs.nameservicesタグ値を使用します。たとえば、hdfs://appadmin@192.168.101.11:8020/abc/をhdfs://appadmin@my_nameservice/abc/に置き換えます。
仮想カラム
_path— ファイルへのパス。型:LowCardinalty(String)。_file— ファイルの名称。型:LowCardinalty(String)。_size— ファイルのバイト単位のサイズ。型:Nullable(UInt64)。サイズが不明な場合、値はNULLです。_time— ファイルの最終修正時刻。型:Nullable(DateTime)。時刻が不明な場合、値はNULLです。
ストレージ設定
- hdfs_truncate_on_insert - 挿入時にファイルを切り詰めることを許可します。デフォルトでは無効になっています。
- hdfs_create_new_file_on_insert - サフィックスを持つフォーマットでは、挿入ごとに新しいファイルを作成することを許可します。デフォルトでは無効になっています。
- hdfs_skip_empty_files - 読み取り時に空のファイルをスキップすることを許可します。デフォルトでは無効になっています。
関連項目