ClickHouse への挿入と OLTP データベースの違い
インサートのベストプラクティス
大きなバッチサイズで挿入する
冪等な再試行のために、一貫したバッチを保つ
-
- データを受信するノードに問題がある場合、INSERT クエリ はタイムアウトするか、より具体的なエラーを返し、確認応答は返されません。
-
- ノードがデータの書き込みには成功しても、ネットワークの中断によって確認応答をクエリの送信元に返せない場合、送信元ではタイムアウトまたはネットワークエラーが発生します。
MergeTree テーブルまたは分散テーブルへの insert
internal_replication=true を設定することを推奨します。
これにより、ClickHouse が利用可能な任意のレプリカ分片へデータをレプリケートし、データの結果整合性が最終的に確保されます。
このクライアント側の負荷分散が難しい場合は、分散テーブル 経由で insert することもできます。この場合、書き込みは各ノードに分散されます。ここでも、internal_replication=true を設定することを推奨します。
ただし、この方法ではまず分散テーブルを持つノードにローカル書き込みを行い、その後で各分片に送信する必要があるため、パフォーマンスはやや低下します。
小さなバッチには非同期挿入を使用する
公式のClickHouseクライアントを使用する
Native フォーマットを優先する
HTTPインターフェイスを使用する
基本的な例
INSERT INTO TABLE コマンドを使用できます。スタートガイド”ClickHouse でテーブルを作成する”で作成したテーブルに、データをいくつか挿入してみましょう。
SELECTクエリを実行します:
Postgres からのデータの読み込み
ClickPipes。PostgreSQL データベースのレプリケーション向けに特化して設計された ETL ツールです。以下の両方で利用できます。- ClickHouse Cloud - ClickPipes のマネージドインジェストサービスから利用できます。
- セルフマネージド - PeerDB オープンソースプロジェクト経由で利用できます。
- 前の例で示したように、PostgreSQL table engineを使用してデータを直接読み取る方法。通常は、既知の watermark (たとえば timestamp) に基づくバッチレプリケーションで十分な場合や、一度限りの移行の場合に適しています。このアプローチは数千万行規模までスケールします。さらに大きなデータセットを移行する場合は、それぞれでデータの chunk を処理する複数のリクエストを検討してください。各 chunk については、パーティションを最終テーブルに移動する前にステージングテーブルを使用できます。これにより、失敗したリクエストを再試行できます。この一括ロード戦略の詳細については、こちらを参照してください。
- PostgreSQL からデータを CSV形式でエクスポートできます。その後、テーブル関数 を使用して、ローカルファイルまたは object storage 経由で ClickHouse に挿入できます。
大規模なデータセットの挿入でお困りですか?大規模なデータセットの挿入で支援が必要な場合や、ClickHouse Cloud へのデータのインポート時にエラーが発生した場合は、support@clickhouse.com までお問い合わせください。サポートいたします。
コマンドラインからのデータ挿入
- ClickHouse をインストールしている
clickhouse-serverが実行中であるwget、zcat、curlを使用できるターミナルにアクセスできる
clickhouse-client をバッチモードで使用して、コマンドラインから CSV ファイルを ClickHouse に挿入する方法を説明します。clickhouse-client をバッチモードで使用してコマンドライン経由でデータを挿入する方法の詳細と例については、“Batch mode” を参照してください。
この例では、2,800 万行の Hacker News データを含む Hacker News dataset を使用します。
CSV のダウンロード
次のコマンドを実行して、公開 S3 バケットからデータセットの CSV 版をダウンロードします:テーブルの作成
clickhouse-server が実行中であれば、clickhouse-client をバッチモードで使用して、次のスキーマを持つ空のテーブルをコマンドラインから直接作成できます:_EOF) をシングルクォートで囲んでいるため、補間が行われません。シングルクォートがない場合は、カラム名を囲むバッククォートをエスケープする必要があります。コマンドラインからデータを挿入する
次に、以下のコマンドを実行して、先ほどダウンロードしたファイルのデータをテーブルに挿入します:gzip、zcat などのツールでファイルを展開し、その後、適切な INSERT ステートメントと FORMAT を指定して、展開したデータを clickhouse-client にパイプで渡す必要があります。clickhouse-client を対話型モードで使用してデータを挿入する場合は、COMPRESSION 句を使うことで、INSERT 時の展開を ClickHouse に任せることができます。ClickHouse はファイル拡張子から圧縮形式を自動検出できますが、明示的に指定することも可能です。その場合、挿入クエリは次のようになります:hackernews テーブルの行数を確認できます:curl を使用してコマンドライン経由でデータを挿入する
前の手順では、まずwget を使って CSV ファイルをローカルマシンにダウンロードしました。1 つのコマンドで、リモート URL から直接データを挿入することもできます。次のコマンドを実行して hackernews テーブルのデータを削除し、ローカルマシンにダウンロードする中間手順なしで再度挿入できるようにします: