ClickHouseとは?
こんにちは!ClickHouse JapanのMasatoです。
ClickHouseは日本でのビジネスを本格的に展開するにあたりQiitaでClickHouseについてのTipsやユーザー事例などの記事を投稿していきます。なお公式ドキュメントはこちらです→ClickHouse Docs
ClickHouse®は、高性能で列指向のSQLデータベース管理システム(DBMS)であり、オンライン分析処理(OLAP)に特化しています。オープンソースソフトウェアとしても、クラウドサービスとしても利用可能です。
日本でのサービスも提供しております。ぜひ一度ClickHouseのスピードを体験してください!
ClickHouse Cloud
ClickHouse Opensource
分析とは何か?
分析(Analytics)、またはオンライン分析処理(OLAP)は、SQLクエリを用いて大規模データセットに対して複雑な計算(例: 集計、文字列処理、算術計算)を行うことを指します。
これとは異なり、トランザクションクエリ(OLTP: オンライントランザクション処理)は、1回のクエリで少数の行を読み書きするため、通常ミリ秒単位で完了します。一方で、分析クエリは日常的に数十億行から数兆行を処理します。
多くのユースケースでは、分析クエリは「リアルタイム」である必要があり、すなわち、1秒未満で結果を返すことが求められます。
行指向ストレージ vs. 列指向ストレージ
このような高いパフォーマンスは、適切なデータの「指向」によってのみ実現できます。
データベースは、行指向または列指向のいずれかの形式でデータを保存します。
行指向データベースでは、連続するテーブル行が順番に格納されます。このレイアウトでは、各行の列の値が一緒に保存されているため、行を素早く取得することができます。
一方、ClickHouseは列指向データベースです。このようなシステムでは、テーブルは列のコレクションとして保存されます。つまり、各列の値が順番に格納されます。このレイアウトでは、単一の行を復元するのが難しくなります(行の値の間にギャップが生じるため)が、フィルタリングや集計などの列操作は、行指向データベースに比べて大幅に高速になります。
この違いは、以下のような実例で説明するのが最も分かりやすいでしょう。ここでは、1億行の実際の匿名化されたWeb分析データに対してクエリを実行します。
SELECT MobilePhoneModel, COUNT() AS c FROM metrica.hits WHERE RegionID = 229 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND MobilePhone != 0 AND MobilePhoneModel not in ['', 'iPad'] GROUP BY MobilePhoneModel ORDER BY c DESC LIMIT 8;
このクエリは、ClickHouse SQL Playgroundで実行することができます。このクエリでは、100以上ある列の中からいくつかを選択し、フィルタリングを行います。その結果はミリ秒単位で返されます。
上の図の統計セクションから分かるように、このクエリは1億行を92ミリ秒で処理しており、約3億行/秒、または約7GB/秒未満のスループットを達成しています。
行指向DBMSの場合
行指向データベースでは、上記のクエリが既存の列の一部のみを処理する場合でも、他の列のデータをディスクからメモリに読み込む必要があります。その理由は、データがディスク上に「ブロック」と呼ばれるチャンク(通常は固定サイズ、例: 4KBまたは8KB)として保存されているからです。ブロックはディスクからメモリに読み込まれる最小単位です。
アプリケーションやデータベースがデータを要求すると、オペレーティングシステムのディスクI/Oサブシステムがディスクから必要なブロックを読み込みます。このとき、ブロックの一部のみが必要であっても、設計上、ディスク全体とファイルシステムの制約により、ブロック全体がメモリに読み込まれます。
列指向DBMSの場合
列指向データベースでは、各列の値がディスク上で順番に格納されているため、上記のクエリを実行する際に不要なデータを読み込むことはありません。
ディスクからメモリへのブロック単位の保存と転送が、分析クエリのデータアクセスパターンに一致しているため、クエリで必要な列だけがディスクから読み込まれます。これにより、使用されないデータの不要なI/Oを回避できます。
これは、行指向ストレージと比較してはるかに高速です。行指向の場合、必要のない列を含む行全体が読み込まれるため、不要なデータ読み込みが発生します。
データのレプリケーションと整合性
ClickHouseは、非同期のマルチマスターレプリケーション方式を採用しており、データが複数のノードに冗長的に保存されることを保証します。利用可能な任意のレプリカにデータが書き込まれると、残りのレプリカはバックグラウンドでそのコピーを取得します。この仕組みにより、異なるレプリカ間で同一のデータが維持されます。
ほとんどの障害からの復旧は自動的に行われますが、複雑なケースでは半自動的に対応することも可能です。
ロールベースアクセス制御
ClickHouseは、SQLクエリを使用してユーザーアカウント管理を実装しており、ANSI SQL標準や一般的なリレーショナルデータベース管理システムで見られるようなロールベースのアクセス制御設定を可能にしています。
SQLサポート
ClickHouseは、ANSI SQL標準と多くの点で同一の宣言型クエリ言語をサポートしています。サポートされているクエリ句には、GROUP BY, ORDER BY, FROM内のサブクエリ, JOIN句, IN演算子, ウィンドウ関数, およびスカラーサブクエリが含まれます。
近似計算
ClickHouseは、精度を犠牲にしてパフォーマンスを向上させる方法を提供します。例えば、一部の集計関数では、ユニークな値の数、中央値、パーセンタイルを近似的に計算します。また、データのサンプルを使用してクエリを実行することで、迅速に近似結果を得ることができます。さらに、すべてのキーではなく、限定された数のキーに対して集計を実行することも可能です。キーの分布がどれだけ偏っているかによりますが、これにより、正確な計算と比較してはるかに少ないリソースで合理的な精度の結果を得ることができます。
適応型結合アルゴリズム
ClickHouseは結合アルゴリズムを適応的に選択します。初めは高速なハッシュ結合を使用し、複数の大規模なテーブルが関与している場合はマージ結合に切り替えます。
優れたクエリパフォーマンス
ClickHouseは、非常に高速なクエリパフォーマンスで知られています。その理由について詳しく知りたい場合は、Why is ClickHouse fast? ガイドをご覧ください
ClickHouseについてもっと知りたい方は
コミュニティイベントを開催します!ClickHouseをお使いの方はもちろん、検討中の方、少し気になる方、ただの興味本位でも参加オッケーです!ぜひ遊びに来てください!
ClickHouse Meetup Tokyo
こちらの投稿はClickHouse Docsを翻訳したものとなります。公式なドキュメントはこちらを参照してください。ClickHouseDocs