HTTPインターフェース
HTTPインターフェースを使用すると、どのプラットフォームでも、どのプログラミング言語からでも、ClickHouseをREST APIの形で利用できます。HTTPインターフェースはネイティブインターフェースよりも制限がありますが、言語サポートが優れています。
デフォルトでは、clickhouse-server
はポート8123でHTTPをリッスンします(これは設定で変更可能です)。HTTPSもデフォルトでポート8443で有効にできます。
パラメーターなしで GET /
リクエストを送信すると、200レスポンスコードと、http_server_default_responseで定義されたデフォルト値の文字列「Ok.」(末尾に改行を含む)が返されます。
また、HTTPレスポンスコードの注意事項も参照してください。
時々、curl
コマンドがユーザーのオペレーティングシステムで利用できないことがあります。UbuntuやDebianでは、sudo apt install curl
を実行してください。実行する前に、このドキュメンテーションを参照してインストールしてください。
Web UIにはこちらからアクセスできます: http://localhost:8123/play
。
Web UIはクエリ実行中の進行状況の表示、クエリのキャンセル、およびストリーミング結果をサポートしています。クエリパイプラインのチャートとグラフを表示するための隠れた機能も備えています。
Web UIは、あなたのようなプロフェッショナルのために設計されています。

ヘルスチェックスクリプトでは、GET /ping
リクエストを使用します。このハンドラーは常に「Ok.」(末尾に改行)を返します。バージョン18.12.13から利用可能です。また、レプリカの遅延を確認するために/replicas_status
も参照してください。
リクエストは、URLの 'query' パラメーターとして送信するか、POSTとして送信できます。また、クエリの先頭を 'query' パラメーターに、残りをPOSTで送信します(後でこれが必要な理由を説明します)。デフォルトでは、URLのサイズは1MiBに制限されており、http_max_uri_size
設定で変更可能です。
成功した場合、200レスポンスコードとレスポンスボディ内の結果が返されます。エラーが発生した場合、500レスポンスコードとエラーメッセージがレスポンスボディに返されます。
GETメソッドを使用すると、'readonly' が設定されます。言い換えれば、データを変更するクエリには、POSTメソッドのみを使用できます。クエリ自体をPOSTボディまたはURLパラメーターのいずれかに送信できます。
例:
ご覧の通り、curl
はスペースをURLエスケープする必要があるため、やや不便です。wget
はすべてを自動でエスケープしますが、HTTP 1.1でのkeep-aliveおよびTransfer-Encoding: chunked使用時にはあまりうまく動作しないため、使用を推奨しません。
クエリの一部がパラメーターに送信され、別の部分がPOSTで送信される場合、これらの二つのデータ部分の間に改行が挿入されます。 例(これは機能しません):
デフォルトでは、データはTabSeparated形式で返されます。
他のフォーマットを要求するには、クエリのFORMAT句を使用します。
また、'default_format' URLパラメーターまたは'X-ClickHouse-Format'ヘッダーを使用して、TabSeparated以外のデフォルト形式を指定できます。
データを送信するためのPOSTメソッドは、INSERT
クエリに必要です。この場合、URLパラメーターにクエリの最初の部分を記述し、POSTを使用して挿入するデータを渡します。挿入するデータは、例えばMySQLからのタブ区切りのダンプである可能性があります。この方法で、INSERT
クエリはMySQLのLOAD DATA LOCAL INFILE
に置き換えられます。
例
テーブルの作成:
データ挿入のためにお馴染みのINSERTクエリを使用:
クエリとは別にデータを送信できます:
任意のデータフォーマットを指定できます。'Values'形式は、INSERT INTO t VALUESを書くときと同じです。
タブ区切りのダンプからデータを挿入するには、対応するフォーマットを指定します:
テーブルの内容を読み取ります。データは並行クエリ処理のために順不同で出力されます:
テーブルを削除します。
データテーブルを返さない成功したリクエストは、空のレスポンスボディが返されます。
圧縮
大量のデータを送信する際や即座に圧縮されたダンプを作成する際には、圧縮を利用できます。
データを送信する際に内部のClickHouse圧縮フォーマットを使用することができます。圧縮データは非標準フォーマットであり、これで作業するにはclickhouse-compressor
プログラムが必要です。このプログラムはclickhouse-client
パッケージと共にインストールされます。データ挿入の効率を高めるために、http_native_compression_disable_checksumming_on_decompress設定を使ってサーバー側のチェックサム検証を無効にすることができます。
URLにcompress=1
を指定すると、サーバーは送信するデータを圧縮します。URLにdecompress=1
を指定すると、サーバーはPOST
メソッドで渡すデータを解凍します。
HTTP圧縮を使用することもできます。ClickHouseは次の圧縮メソッドをサポートしています:
gzip
br
deflate
xz
zstd
lz4
bz2
snappy
圧縮されたPOST
リクエストを送信するには、リクエストヘッダーにContent-Encoding: compression_method
を追加します。ClickHouseにレスポンスを圧縮させるためには、enable_http_compression設定で圧縮を有効にし、リクエストにAccept-Encoding: compression_method
ヘッダーを追加します。すべての圧縮メソッドに対して、http_zlib_compression_level設定でデータの圧縮レベルを設定できます。
一部のHTTPクライアントはデフォルトでサーバーからのデータを解凍する場合があり(gzip
および deflate
)、圧縮設定を正しく使用しても解凍されたデータを受け取ることがあるかもしれません。
例
デフォルトのデータベース
'database' URLパラメーターまたは'X-ClickHouse-Database'ヘッダーを使用して、デフォルトのデータベースを指定できます。
デフォルトでは、サーバー設定に登録されているデータベースがデフォルトのデータベースとして使用されます。デフォルトでは、これは'default'という名前のデータベースです。もしくは、テーブル名の前にドットを付けてデータベースを常に指定することができます。
ユーザー名とパスワードは、以下のいずれかの3つの方法で指定できます:
- HTTPベーシック認証を使用します。例:
- 'user'と'password'のURLパラメーターに設定します(この方法は推奨しません。パラメーターがWebプロキシにログされ、ブラウザにキャッシュされる可能性があるため)。例:
- 'X-ClickHouse-User'と'X-ClickHouse-Key'ヘッダーを使用します。例:
ユーザー名が指定されていない場合、default
という名前が使用されます。パスワードが指定されていない場合、空のパスワードが使用されます。
URLパラメーターを使用して、単一クエリの処理設定や、全体の設定プロファイルを指定することも可能です。例:http://localhost:8123/?profile=web&max_rows_to_read=1000000000&query=SELECT+1
詳細については、設定セクションを参照してください。
他のパラメーターに関する情報は、「SET」セクションを参照してください。
HTTPプロトコルでのClickHouseセッションの使用
HTTPプロトコルでClickHouseセッションを使用することもできます。これを行うには、リクエストにsession_id
GETパラメーターを追加する必要があります。セッションIDには任意の文字列を使用できます。デフォルトでは、60秒間の非アクティブ状態が続いた後にセッションが終了します。このタイムアウト(秒単位)を変更するには、サーバー設定でdefault_session_timeout
設定を変更するか、リクエストにsession_timeout
GETパラメーターを追加します。セッションのステータスを確認するためには、session_check=1
パラメーターを使用します。単一のセッション内で同時に実行できるクエリは1つだけです。
X-ClickHouse-Progress
レスポンスヘッダーでクエリの進行状況に関する情報を取得できます。これを行うには、send_progress_in_http_headersを有効にします。ヘッダーのシーケンスの例:
利用可能なヘッダーフィールド:
read_rows
— 読み取られた行数。read_bytes
— 読み取られたデータのバイト数。total_rows_to_read
— 読み取るべき行数の合計。written_rows
— 書き込まれた行数。written_bytes
— 書き込まれたデータのバイト数。
リクエストが実行中でHTTP接続が失われた場合、自動的に停止することはありません。解析とデータのフォーマットはサーバー側で行われ、ネットワークの使用は効果的でない場合があります。 オプショナルな'query_id'パラメーターをクエリID(任意の文字列)として渡すことができます。詳細については、「設定、実行中のクエリの置き換え」セクションを参照してください。
オプショナルな'quota_key'パラメーターをクォータキー(任意の文字列)として渡すことができます。詳細については、「クォータ」セクションを参照してください。
HTTPインターフェースでは、クエリのために外部データ(外部一時テーブル)を渡すことができます。詳細については、「クエリ処理のための外部データ」セクションを参照してください。
レスポンスバッファリング
サーバー側でレスポンスバッファリングを有効にできます。これを目的とするために、buffer_size
およびwait_end_of_query
URLパラメータが用意されています。http_response_buffer_size
および http_wait_end_of_query
設定も使用できます。
buffer_size
は、結果をサーバーメモリ内にバッファリングするバイト数を決定します。結果ボディがこのスレッショルドを超える場合、バッファはHTTPチャネルに書き込まれ、残りのデータはHTTPチャネルに直接送信されます。
レスポンス全体がバッファリングされることを保証するには、wait_end_of_query=1
に設定します。この場合、メモリに保存されていないデータはサーバーの一時ファイルにバッファリングされます。
例:
バッファリングを使用して、クエリ処理エラーがレスポンスコードとHTTPヘッダーがクライアントに送信された後に発生する状況を避けることができます。この状況では、エラーメッセージがレスポンスボディの末尾に書き込まれ、クライアント側ではエラーが解析ステージでのみ検出されます。
クエリパラメータでのロール設定
これはClickHouse 24.4で追加された新機能です。
特定のシナリオでは、ステートメント自体を実行する前に権限のあるロールを最初に設定する必要があります。しかし、SET ROLE
とステートメントを同時に送信することはできません。これはマルチステートメントが許可されていないためです:
これによりエラーが発生します:
この制限を克服するために、代わりにrole
クエリパラメーターを使用できます:
これは、ステートメントの前にSET ROLE my_role
を実行するのと同等になります。
さらに、複数の role
クエリパラメーターを指定することも可能です:
この場合、?role=my_role&role=my_other_role
は、ステートメントの前にSET ROLE my_role, my_other_role
を実行するのと同じように機能します。
HTTPレスポンスコードの注意事項
HTTPプロトコルの制限により、HTTP 200レスポンスコードはクエリが成功したことを保証しません。
以下に例を示します:
この動作の理由はHTTPプロトコルの性質です。HTTPヘッダーが最初にHTTPコード200として送信され、その後にHTTPボディが送信され、エラーがプレーンテキストとしてボディに挿入されます。この動作は、Native
、TSV
、またはJSON
いずれのフォーマットが使用されていても独立しており、エラーメッセージは常にレスポンスストリームの中間に存在します。
この問題を緩和するために、wait_end_of_query=1
を有効にすることができます(レスポンスバッファリング)。この場合、HTTPヘッダーの送信はクエリが完全に解決されるまで遅延します。しかし、これは問題を完全には解決しません、なぜなら結果はまだhttp_response_buffer_size
内に収まらなければならず、send_progress_in_http_headers
などの他の設定がヘッダーの遅延に干渉する可能性があるからです。
すべてのエラーをキャッチする唯一の方法は、要求されたフォーマットを使用する前にHTTPボディを解析することです。
パラメータ付きクエリ
パラメータ付きのクエリを作成し、対応するHTTPリクエストパラメータから値を渡すことができます。詳細については、CLI用のパラメータ付きクエリを参照してください。
例
URLパラメーターのタブ
クエリパラメータは「エスケープ」形式から解析されます。これは、NULLを\N
としてあいまいなく解析する可能性などの利点があります。これを意味するのは、タブ文字を\t
(または\
とタブ)としてエンコードする必要があるということです。例えば、次のようなタブがabc
と123
の間に存在し、入力文字列が二つの値に分割されます:
しかし、実際のタブをURLパラメータで%09
を使用してエンコードしようとすると、正しく解析されません:
URLパラメータを使用する場合、\t
を%5C%09
としてエンコードする必要があります。それにより、次のように記述できます:
事前定義されたHTTPインターフェース
ClickHouseはHTTPインターフェースを通じて特定のクエリをサポートしています。例えば、次のようにテーブルにデータを書き込むことができます:
ClickHouseは事前定義されたHTTPインターフェースもサポートしており、Prometheusエクスポーターなどのサードパーティツールとの統合を容易にします。
例:
- まず、このセクションをサーバー設定ファイルに追加します:
- これで、Prometheus形式のデータを求めてURLに直接リクエストできるようになります:
設定がconfig.xmlファイルに行われていて、http_handlers
が多数のrules
を含むことに気づいたでしょう。ClickHouseは受信したHTTPリクエストを事前定義されたタイプに一致させ、最初に一致したルールがハンドラーを実行します。その後、ClickHouseは一致が成功すれば、それに応じた事前定義クエリを実行します。
今や、rule
はmethod
、headers
、url
、handler
を設定することができます:
-
method
はHTTPリクエストのメソッド部分のマッチングを担当します。method
はHTTPプロトコルの定義に完全に準拠します。methodはオプショナルな設定です。設定ファイルに定義されていない場合、HTTPリクエストのメソッド部分とは一致しません。 -
url
はHTTPリクエストのURL部分の一致を担当します。これはRE2の正規表現と互換性があります。これはオプショナルな設定です。設定ファイルに定義されていない場合、HTTPリクエストのURL部分とは一致しません。 -
headers
はHTTPリクエストのヘッダー部分の一致を担当します。これはRE2の正規表現と互換性があります。これはオプショナルな設定です。設定ファイルに定義されていない場合、HTTPリクエストのヘッダー部分とは一致しません。 -
handler
は主な処理部分を含みます。現在、handler
はtype
、status
、content_type
、http_response_headers
、response_content
、query
、query_param_name
を設定できます。type
は現在、3つのタイプ:predefined_query_handler、dynamic_query_handler、staticをサポートしています。-
query
—predefined_query_handler
タイプで使用し、ハンドラーが呼び出されたときにクエリを実行します。 -
query_param_name
—dynamic_query_handler
タイプで使用し、HTTPリクエストパラメーター内のquery_param_name
に対応する値を抽出して実行します。 -
status
—static
タイプで使用し、レスポンスステータスコードです。 -
content_type
— 任意のタイプで使用し、レスポンスコンテンツタイプです。 -
http_response_headers
— 任意のタイプで使用し、レスポンスヘッダーのマップです。コンテンツタイプを設定するためにも使用できます。 -
response_content
—static
タイプで使用し、クライアントに送信されるレスポンスコンテンツです。file://
またはconfig://
のプレフィックスを使用する場合は、クライアントに送信するファイルまたは設定からコンテンツを見つけます。
-
次に、異なる type
の設定方法を示します。
predefined_query_handler
predefined_query_handler
はSettings
とquery_params
の値を設定することをサポートしています。predefined_query_handler
タイプの中でquery
を設定できます。
query
の値は、HTTPリクエストが一致した場合にClickHouseが実行するpredefined_query_handler
の事前定義クエリです。これは必須の設定です。
次の例は、max_threads と max_final_threads
設定の値を定義し、これらの設定が正常に設定されているかどうかをチェックするためにシステムテーブルをクエリします。
デフォルトのhandlers
(query
、play
、ping
など)を保持するためには、<defaults/>
ルールを追加してください。
例:
1つのpredefined_query_handler
内では、1つのquery
のみをサポートされます。
dynamic_query_handler
dynamic_query_handler
では、クエリがHTTPリクエストのパラメーターの形で記述されます。これに対する違いは、predefined_query_handler
ではクエリが設定ファイルに書かれているという点です。dynamic_query_handler
でquery_param_name
を設定できます。
ClickHouseはHTTPリクエストのURL内のquery_param_name
に対応する値を抽出し、実行します。query_param_name
のデフォルト値は/query
です。これはオプショナルな設定です。設定ファイルに定義がない場合、このパラメーターは渡されません。
この機能を試してみるために、例では、max_threadsおよびmax_final_threads
の値を定義し、設定が正常に行われたかどうかを確認します。
例:
static
static
は content_type 、status および response_content
を返すことができます。 response_content
は指定されたコンテンツを返すことができます。
例:
メッセージを返す。
http_response_headers
は content_type
の代わりにコンテンツタイプを設定するために使用できます。
クライアントに送信される構成からコンテンツを見つけます。
ファイルからクライアントに送信されるコンテンツを見つけます。
Valid JSON/XML response on exception during HTTP streaming
HTTP 経由でクエリを実行中に、データの一部がすでに送信されているときに例外が発生することがあります。 通常、特定のデータ形式が出力データに使用された場合でも、プレーンテキストでクライアントに例外が送信され、出力が指定されたデータ形式の観点から無効になる場合があります。 これを防ぐために、http_write_exception_in_output_format
設定(デフォルトで有効)を使用すると、ClickHouse に指定された形式で例外を書き込むよう指示できます(現在、XMLおよびJSON形式でサポートされています)。
例: