クリックハウス®とは？

<font color="Grey">*[What is ClickHouse®?](https://aiven.io/blog/what-is-clickhouse)の翻訳です。*</font>

2022年9月14日

# クリックハウス®とは？

ビッグデータは複雑なビジネス上の意思決定に役立ちます。クリックハウスがどのようにビッグデータ・プロセスの本質に迫るように設計されているかをご覧ください。

スピードは、当社の製品、アプリケーション、ソリューションの成功の鍵です。次のステップを推測する代わりに、データは複雑なビジネス上の意思決定への道をより速くナビゲートします。本日は、ビッグデータの保存と分析に特化したソリューションをご紹介します：ClickHouseです。


ClickHouseは、カラム指向構造を採用した拡張性の高いオープンソースのデータベース管理システム（DBMS）です。オンライン分析処理（OLAP）用に設計されており、高いパフォーマンスを発揮する。ClickHouseは処理した結果をリアルタイムで瞬時に返すことができます。そのため、膨大な構造化データセットを扱うアプリケーションに最適です。データ分析、複雑なデータレポート、データサイエンス計算...。


ClickHouseは、その非常に高いパフォーマンスで高く評価されています。そのパフォーマンスは、多くの要因の総和から生まれます：


* 列指向のデータストレージ
* データ圧縮
* ベクトル計算エンジン
* 近似計算
* 物理的スパースインデックスの使用


しかし、ClickHouseの利点はパフォーマンスだけではない。ClickHouseは単なるデータベースではなく、分散クエリ処理、パーティショニング、データ複製、シャーディングをサポートする洗練されたデータベース管理システムです。テラバイト級のデータを扱うことができる、拡張性と信頼性の高いシステムです。


実際、ClickHouseは膨大な量のデータを書き込み、同時に大量の読み込み要求を処理するように設計されています。また、宣言的なSQLライクなクエリー言語を便利に使用することができます。


## ClickHouse の主な機能


ClickHouseは活発な開発コミュニティを持っており、積極的な開発と改良が続けられています。[変更履歴](https://clickhouse.com/docs/en/whats-new/changelog/)と[ロードマップ](https://clickhouse.com/docs/en/whats-new/roadmap/)で最新の機能と将来の計画を見ることができます。システムの急速な成長にもかかわらず、すべての新機能は、システムの速度に影響を与えないことを確認するために、パフォーマンス面で評価されています。そして、ClickHouseの既存の最大の機能の多くは、特にそのパフォーマンスと効率を向上させることを目的としています。


### 列指向DBMS


真の列指向データベースとして、ClickHouseは同じ列の値を物理的に隣り合わせに格納し、各値に余分なデータを付加しません。これは、カラム内の何億ものアイテムに添付された些細な量の余分なデータ（例えば文字列の長さなど）であっても、圧縮、解凍、読み込みの速度に大きく影響する場合に重要です。


### データ圧縮


望ましいパフォーマンスを達成するために、ClickHouseはデータ圧縮を使用します。これには、汎用の圧縮と、別々のカラムに格納された異なるタイプのデータを対象とする多数の特殊化されたコーデックが含まれます。


### 複数のサーバーにまたがるクエリー処理


ClickHouseは、異なるシャードにまたがるデータの分散クエリ処理をサポートしています。大規模なクエリは複数のコアで並列化され、必要なリソースを使用します。


### SQL クエリ構文


ClickHouseはANSI SQLに似たSQL構文をサポートしています。しかし、同一ではないため、他のSQL互換システムからの移行には翻訳が必要な場合があります。


### ベクトル計算エンジン


データ処理中、ClickHouseは列のかたまり（いわゆるベクトル）を扱い、演算は個々の値ではなく、項目の配列に対して実行されます。


### データベースロックなし


ClickHouseは、新しいデータを追加する際にロックに依存することなく、継続的にテーブルを更新します。


### プライマリ・インデックスとデータ・スキッピング・インデックス


クリックハウスはデータを物理的にプライマリキーでソートしています。セカンダリーインデックス（「データスキッピングインデックス」とも呼ばれる）は、どのデータがフィルタリング基準にマッチせずスキップされるべきかを事前に示します（そのためこの名前がついています）。


### 近似計算


より高いパフォーマンスを得るために、複雑なクエリでは、精度とパフォーマンスのトレードオフを見つけるために、データのサンプル上で計算を実行することができます。これは、例えば複雑なデータサイエンス計算に関連します。


ClickHouseは多くのシナリオで優れた選択肢となり得ますが、そのアーキテクチャ上の特徴に留意することが重要です。ClickHouseはかなりユニークなので、最適なパフォーマンスではないミスを犯しがちです。そのため、このDBMSの背後にあるものとその機能を理解することが重要です。


まず、最も特徴的な機能である列指向のストレージ構造から見ていきましょう。


## なぜカラム指向のデータベース管理システムなのか？


カラム指向の必要性がどこから来ているのか、なぜクリックハウスがカラム指向を採用しているのかをよりよく理解するために、2つの異なるタイプのシステムを詳しく見てみましょう：オンライントランザクション処理（OLTP）とオンライン分析処理（OLAP）です。特に、データを操作する粒度と、これらのシステムで一般的な操作の種類に注目してください。


### OLTP: オンライン・トランザクション処理


OLTPアプリケーションは、少量の行を挿入、更新、選択する操作を非常に頻繁に実行する。この種のアプリケーションでは、個々の行全体を扱う最も効果的な方法として、伝統的に行指向のアプローチを使用しています。


### OLAP：オンライン分析処理


OLAPシステムは全く異なるもので、操作は1行を対象とするのではなく、一度に何十万、何百万ものレコードを扱い、グループ化と集計メカニズムに依存する。OLAPシステムのデータはイベントによって表現され、更新の必要はほとんどない。そして重要なことは、一度に検索・処理する必要があるのは、通常フィールドのごく一部だけだということだ。このため、行指向システムのように完全な行を読み込むのは非常に非効率的である。


要するに、OLTPアプリケーションでは、個々の行を簡単に更新するためにレコードが保存されているのに対して、OLAPシステムでは、大量のデータを高速に読み込んで分析するためにデータが保存されているのである。


したがって、行指向のDBMSは、OLAPアプリケーションに典型的なデータ量の分析処理を効果的に管理することができなかった。


### OLAPと列指向システム


列指向システムはOLAPの課題を解決するために設計された。真のカラム型データベースでは、データは物理的にグループ化され、カラムごとに格納される。これによりディスクアクセスが最小化され、パフォーマンスが向上する。各カラムには同じ型のデータが格納されているため、効果的な圧縮メカニズムを使用することができる。


さらに、カラムナー・アプローチでは、単にファイルを作成または削除するだけなので、パフォーマンスのオーバーヘッドなしに新しいカラムを追加または削除することができる。これとは対照的に、行指向のデータベースで新しい列を追加する場合、すべての行のデータを更新する必要がある。


OLAPとOLTPシステムの違い、そして行指向と列指向の違いを理解することは、ClickHouseを使用するか否かを決定する際の鍵となります。次のセクションでは、これが具体的なシステム要件にどのように関係するのか、またClickHouseの採用を決定する際に注意すべき点について見ていきます。


## ClickHouseを使うとき


ClickHouseは、適切なシナリオで正しく使用すれば、競合他社を凌駕する強力でスケーラブルかつ高速なソリューションです。ClickHouseはOLAPアプリケーションのために作られ、データを読み込み、複雑なリクエストを高速に処理するための多くの最適化が含まれています。


ClickHouseを最大限に活用するには、次のような方法があります：


* 膨大なデータ（テラバイト単位）を継続的に読み書きする；
* 大量のカラムを持つテーブル（ClickHouseは大量のカラムが大好きです！）を持っているが、カラムの値は適度に短い；
* データが構造化されており、まだ集計されていない；
* 数千行に及ぶ大きなバッチでデータを挿入する；
* 操作の大部分は、集計を伴う読み取りである；
* 読み込みの場合、処理する行数は多いが、列数はかなり少ない；
* 後でデータを修正する必要がない；
* 特定の行を取り出す必要がない；
* トランザクションは必要ない。


例えば、Yandexは500以上のサーバーを使用し、毎日2500万件のレコードが送られてくる。ClickHouseを使用しているもう一つの会社、Bloombergは100以上のサーバーを持ち、毎日約1兆件の新しいレコードを受け入れている（2018年のデータ）。


## クリックハウスを使用しない場合


ClickHouseは高速に設計されています。しかし、ClickHouseをOLAPアプリケーションに最適なソリューションにしている最適化は、他のタイプのプロジェクトには最適ではありません。


OLTPにClickHouseを使用しないでください。ClickHouseはデータが不変であることを前提としています。ClickHouseデータベースから大きなデータの塊を削除することは技術的には可能ですが、高速ではありません。ClickHouseは単純にデータ変更用に設計されていないのです。また、インデックスが疎なため、キーによる単一行の検索や取得も非効率的です。最後に、ClickHouseはACIDトランザクションを完全にサポートしていません。


ClickHouseはキー・バリューDBMSではない。また、ファイル・ストレージとしても設計されていません。


ドキュメント指向のデータベースでもない。ClickHouseはあらかじめ定義されたスキーマを使用し、テーブル作成時に指定する必要があります。スキーマが優れていればいるほど、クエリはより効果的で高性能になります。


## 始めるには


クリックハウスとそのスーパーパワーに興味を持っていただけたでしょうか？そして、どのように自分自身で使い始めることができるのか疑問に思われたかもしれません。ClickHouseはオープンソースのプロジェクトであり、ドキュメントに従って自分でビルドすることができます。


しかし、ClickHouseクラスタのセットアップとメンテナンスは非常に困難です。データの適切なレプリケーション、フォールトトレランス、安定性を確保するには、多くの時間とエネルギーが必要です。そのためAivenは、頭痛の種を抱えることなくClickHouseのメリットを享受できるAiven for ClickHouseを提供することにしました。


Aiven for ClickHouseがあれば、お客様は構築中の製品に集中することができ、Aivenは基盤となるインフラをスムーズに稼働させますので、お客様はそのことを完全に忘れることができます。


**Aiven for ClickHouseはどのようにセットアップするのですか？


新しいサービスを作成する際、Aiven ConsoleでAiven for ClickHouseを選択します。(詳しい手順は[Getting Started documentation](https://docs.aiven.io/docs/products/clickhouse/getting-started.html)をご覧ください。）


サーバーが起動したら（数分で起動します）、[テストデータを追加](https://docs.aiven.io/docs/products/clickhouse/sample-dataset.html)して、[ユーザー](https://docs.aiven.io/docs/products/clickhouse/howto/add-service-users.html)、[テーブルとデータベース](https://docs.aiven.io/docs/products/clickhouse/concepts/databases-and-tables.html)の操作方法を確認してください。


Clickhouseでのインデックス作成とデータ処理の仕組みをより深く理解するには、インデックス作成に関する記事(https://docs.aiven.io/docs/products/clickhouse/concepts/indexing.html)をご覧ください。


Aivenと私たちのサービスに関する最新ニュースや、オープンソースに関する様々な情報を入手するには、[月刊ニュースレターを購読](https://aiven.io/newsletter)してください！Aivenに関する日々のニュースは、[LinkedIn](https://www.linkedin.com/company/aiven/)と[Twitter](https://twitter.com/aiven_io)のフィードでご覧いただけます。


サービスアップデートの情報を知りたい方は、[変更履歴](https://aiven.io/changelog)をご覧ください。


データインフラの管理にお困りですか？<https://console.aiven.io/signup>から今すぐ無料トライアルにお申し込みください！