メインコンテンツまでスキップ
メインコンテンツまでスキップ

HDFS

Not supported in ClickHouse Cloud

このエンジンは、ClickHouseを介してHDFS上のデータを管理することで、Apache Hadoopエコシステムとの統合を提供します。このエンジンは、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式とは対照的です)。過度に詳細なパーティショニングは決して使用しないでください。クライアント識別子や名前でデータをパーティションせず(その代わりに、クライアント識別子や名前をORDER BY式の最初のカラムにします)。

月単位で分割するには、toYYYYMM(date_column)式を使用します。ここで、date_columnDate型の日付を持つカラムです。パーティション名はここで"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操作。
    • インデックス。
    • ゼロコピーレプリケーションは可能ですが、推奨されません。
    ゼロコピーのレプリケーションは本番環境用ではありません

    ゼロコピーのレプリケーションは、ClickHouseバージョン22.8以降ではデフォルトで無効です。この機能は本番環境での使用は推奨されません。

パスのグロブ

複数のパスコンポーネントにグロブを含めることができます。処理されるファイルは存在し、全てのパスパターンに一致している必要があります。ファイルのリストはSELECT中に決定されます(CREATEの瞬間ではありません)。

  • * — 空の文字列を含む/以外の任意の文字の任意の数を置き換えます。
  • ? — 任意の1文字を置き換えます。
  • {some_string,another_string,yet_another_one} — 文字列 'some_string', 'another_string', 'yet_another_one'のいずれかを置き換えます。
  • {N..M} — NからMまでの範囲内の任意の数を含めて置き換えます。

{}を使った構造は、remoteテーブル関数に似ています。

  1. HDFS上に以下のURIを持つTSV形式のファイルがいくつかあるとします:

    • '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'
  2. すべての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')
注記

ファイルのリストに先頭0を含む数値範囲がある場合は、各桁ごとにブレースを使った構造を使用するか、?を使用してください。

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_*)の2つです。グローバル設定が最初に適用され、その後にユーザーレベルの設定が適用されます(存在する場合)。

<!-- Global configuration options for HDFS engine type -->
<hdfs>
  <hadoop_kerberos_keytab>/tmp/keytab/clickhouse.keytab</hadoop_kerberos_keytab>
  <hadoop_kerberos_principal>[email protected]</hadoop_kerberos_principal>
  <hadoop_security_authentication>kerberos</hadoop_security_authentication>
</hdfs>

<!-- Configuration specific for user "root" -->
<hdfs_root>
  <hadoop_kerberos_principal>[email protected]</hadoop_kerberos_principal>
</hdfs_root>

設定オプション

libhdfs3によってサポートされる

parameterdefault value
rpc_client_connect_tcpnodelaytrue
dfs_client_read_shortcircuittrue
output_replace-datanode-on-failuretrue
input_notretry-another-nodefalse
input_localread_mappedfiletrue
dfs_client_use_legacy_blockreader_localfalse
rpc_client_ping_interval10 * 1000
rpc_client_connect_timeout600 * 1000
rpc_client_read_timeout3600 * 1000
rpc_client_write_timeout3600 * 1000
rpc_client_socket_linger_timeout-1
rpc_client_connect_retry10
rpc_client_timeout3600 * 1000
dfs_default_replica3
input_connect_timeout600 * 1000
input_read_timeout3600 * 1000
input_write_timeout3600 * 1000
input_localread_default_buffersize1 * 1024 * 1024
dfs_prefetchsize10
input_read_getblockinfo_retry3
input_localread_blockinfo_cachesize1000
input_read_max_retry60
output_default_chunksize512
output_default_packetsize64 * 1024
output_default_write_retry10
output_connect_timeout600 * 1000
output_read_timeout3600 * 1000
output_write_timeout3600 * 1000
output_close_timeout3600 * 1000
output_packetpool_size1024
output_heartbeat_interval10 * 1000
dfs_client_failover_max_attempts15
dfs_client_read_shortcircuit_streams_cache_size256
dfs_client_socketcache_expiryMsec3000
dfs_client_socketcache_capacity16
dfs_default_blocksize64 * 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 構成リファレンスは、いくつかのパラメータについて説明しています。

ClickHouseの追加オプション

parameterdefault value
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の制限により、古い方法のみがサポートされていますので、datanodeの通信はSASLによって保護されていません(HADOOP_SECURE_DN_USERは、そのようなセキュリティアプローチの信頼できる指標です)。参考のために、tests/integration/test_storage_kerberized_hdfs/hdfs_configs/bootstrap.shを使用してください。

hadoop_kerberos_keytabhadoop_kerberos_principal、またはhadoop_security_kerberos_ticket_cache_pathが指定されている場合は、Kerberos認証が使用されます。この場合、hadoop_kerberos_keytabおよびhadoop_kerberos_principalは必須です。

HDFS Namenode HAサポート

libhdfs3はHDFS namenode HAをサポートしています。

  • HDFSノードからhdfs-site.xml/etc/clickhouse-server/にコピーします。
  • 次の部分をClickHouse設定ファイルに追加します:
<hdfs>
  <libhdfs3_conf>/etc/clickhouse-server/hdfs-site.xml</libhdfs3_conf>
</hdfs>
  • その後、hdfs-site.xmldfs.nameservicesタグの値をHDFS URIのnamenodeアドレスとして使用します。たとえば、hdfs://[email protected]:8020/abc/hdfs://appadmin@my_nameservice/abc/に置き換えます。

仮想カラム

  • _path — ファイルへのパス。タイプ: LowCardinality(String)
  • _file — ファイルの名前。タイプ: LowCardinality(String)
  • _size — ファイルのサイズ(バイト単位)。タイプ: Nullable(UInt64)。サイズが不明な場合は、値はNULLです。
  • _time — ファイルの最終更新時刻。タイプ: Nullable(DateTime)。時刻が不明な場合は、値はNULLです。

ストレージ設定

  • hdfs_truncate_on_insert - 挿入する前にファイルを切り捨てることを可能にします。デフォルトでは無効です。
  • hdfs_create_new_file_on_insert - フォーマットにサフィックスがある場合、各挿入時に新しいファイルを作成できます。デフォルトでは無効です。
  • hdfs_skip_empty_files - 読み取り中に空のファイルをスキップすることを可能にします。デフォルトでは無効です。

関連情報