DUICUO

アパッチ・カイリンの冒険

1. Kylinの概要

1.1 キリンの定義

Apache Kylinは、Hadoop/Spark上でSQLクエリインターフェースとOLAP機能を提供し、超大規模データをサポートするオープンソースの分散分析エンジンです。eBay Inc.によって開発され、オープンソースコミュニティに貢献してきました。膨大なHiveテーブルを数秒未満でクエリできます。

公式サイト: https://kylin.apache.org/cn

1.2 Kylin の機能

Kylin の主な機能には、SQL インターフェースのサポート、非常に大規模なデータセットのサポート、1 秒未満の応答時間、スケーラビリティ、高スループット、BI ツールとの統合などがあります。

  • 標準 SQL インターフェース: Kylin は、外部サービス インターフェースとして標準 SQL を使用します。
  • 大規模データセットのサポート:Kylinのビッグデータサポート能力は、現在利用可能なあらゆるテクノロジーの中でもおそらく最も先進的です。2015年には、eBayの本番環境で数百億件のレコードに対するクエリを1秒未満で実行可能となり、その後、モバイルアプリケーションのシナリオにおいて数千億件のレコードに対するクエリを1秒未満で実行した事例も見られました。
  • 1秒未満の応答時間:Kylinは事前計算により、優れたクエリ応答速度を誇ります。結合や集計などの複雑な計算の多くは、事前計算中にオフラインで完了するため、クエリ実行時に必要な計算量が大幅に削減され、応答速度が向上します。
  • スケーラビリティと高スループット: 単一の Kylin ノードは 1 秒あたり 70 件のクエリを処理でき、Kylin クラスターを構築することもできます。
  • BI ツールの統合: Kylin は、次のような既存の BI ツールと統合できます。

ODBC: Tableau、Excel、Power BI などのツールとの統合

JDBC: Saiku や BIRT などの Java ツールとの統合

RestAPI: JavaScript および Web ページとの統合

Kylin 開発チームは、Kylin サービスにアクセスするためにも使用できる Zepplin プラグインも提供しています。

1.3 前提条件

1.3.1 データウェアハウス

データ ウェアハウスは、さまざまな種類のデータ (履歴データや現在のデータを含む) を集中的に保存するシステムであり、BI (ビジネス インテリジェンス) のコア コンポーネントです。

1.3.2 ファクトテーブルとディメンションテーブル

ディメンションモデリングでは、メジャーは「ファクト」、コンテキストは「ディメンション」と呼ばれます。ディメンションとは、ファクトを分析するために必要な多様な環境です。例えば、取引プロセスを分析する場合、取引が発生するコンテキストは、買い手、売り手、製品、時間といったディメンションを用いて記述できます。一方、ファクトはビジネスプロセスを中心に設計され、ビジネスプロセスを記述するメジャーを取得することで表現されます。これには、参照されるディメンションとビジネスプロセスに関連するメジャーが含まれます。例えば、取引行動の中核を担う注文は、取引の状況を直接反映します。注文の流れは多くのビジネスプロセスを生み出し、発注、支払い、そして完了は注文プロセス全体の重要なノードとなります。これら3つのビジネスプロセスにおける取引件数、金額、そしてコンバージョン率を取得することは、日々のデータ統計分析の重要な焦点であり、取引ファクトテーブルの設計は、このニーズに効果的に対応することができます。

1.3.3 寸法

これは、データを観察する視点を指します。例えば、従業員データは性別、より正確には入社日や地域といったディメンションの観点から分析できます。ディメンションとは、性別における男性と女性、時間ディメンションにおける個々の日付など、離散的な値の集合です。そのため、統計分析では、同じディメンション値を持つレコードをグループ化し、集計関数を適用して合計、平均、最大値、最小値などの集計計算を行うことができます。

1.3.4 測定

これは、集計操作の結果として得られた、集計された(観測された)統計値を指します。例えば、従業員データにおける性別の異なる従業員の数や、同じ年に入社した従業員の数などです。

1.3.5 ビジネスインテリジェンス(ビジネス機能)

ビジネスインテリジェンスは、一般的に、企業内の既存データを知識に変換し、企業が情報に基づいたビジネス上の意思決定を行うのに役立つツールと理解されています。データを知識に変換するには、データウェアハウス、オンライン分析処理(OLAP)ツール、データマイニングなどの技術が必要です。

1.3.6 OLAP(オンライン分析処理)

OLAPは、アナリストが様々な視点から情報を迅速かつ一貫してインタラクティブに分析し、データのより深い理解を得ることを可能にするソフトウェア技術です。様々な視点から情報を分析するということは、異なる次元からデータを分析することを意味します。そのため、OLAPは多次元分析とも呼ばれます。

1.3.7 ROLAPとMOLAP

ROLAP: リレーショナル データベースに基づいているため、事前計算は必要ありません。

MOLAP: 多次元データセット (多次元データセットは OLAP キューブと呼ばれます) に基づいており、事前計算が必要です。

1.3.8 キューブとキューブイド

ディメンションとメジャーが確立されると、キューブ理論が成立します。これは、ディメンションとメジャーに基づく事前計算を伴う理論です。データモデルが与えられれば、そのすべてのディメンションを集約できます。N次元の場合、2のn乗通りの組み合わせが可能です。各ディメンションの組み合わせについて、メジャー値を集約し、結果を「キューボイド」と呼ばれるマテリアライズドビューとして保存します。すべてのディメンションの組み合わせにおけるキューボイドは、キューブと呼ばれる全体として考えられます。

1.3.9 スタースキーマ

すべてのディメンション テーブルがファクト テーブルに直接接続されると、スキーマ全体が星型になるため、「スター スキーマ」と呼ばれます。このモデルは、大幅な冗長性によってクエリの効率性を向上させ、OLAP シナリオに適しています。

1つ以上のディメンションテーブルがファクトテーブルに直接接続されておらず、他のディメンションテーブルを介してファクトテーブルに接続されている場合、図は複数の雪片が接続されたように見えるため、「スノーフレークモデル」と呼ばれます。このモデルはMySQLとOracleでよく使用されます。

1つ以上のディメンションテーブルがファクトテーブルに直接接続されておらず、他のディメンションテーブルを介してファクトテーブルに接続されている場合、図は複数の雪片が接続されたように見えるため、「スノーフレークモデル」と呼ばれます。このモデルはMySQLとOracleでよく使用されます。

星型モデル VS スノーフレークモデル

2 麒麟アーキテクチャ

2.1 コアアーキテクチャ

Kylin公式アーキテクチャ図

2.1.1 RESTサーバー

RESTサーバーは、Kylinプラットフォーム向けのアプリケーション開発を可能にするために設計された、アプリケーション開発のためのエントリポイントのセットです。これらのアプリケーションは、クエリの実行、結果の取得、Cubeビルドタスクのトリガー、メタデータの取得、ユーザー権限の取得といった機能を提供できます。さらに、RESTfulインターフェースを介してSQLクエリを実装することもできます。

2.1.2 クエリエンジン

キューブの準備が整うと、クエリエンジンはユーザークエリを取得して解析できるようになります。その後、システム内の他のコンポーネントと連携して、対応する結果をユーザーに返します。クエリSQLは基盤となるタスクに変換され、データはHBaseに保存されます。

2.1.3 ルーティング

この関数は、解析されたSQLから生成された実行プランを、Cubeにキャッシュされたクエリに変換する役割を担います。Cubeは事前に計算され、HBaseにキャッシュされます。これらのクエリは数ミリ秒(または数秒)で完了します。また、一部の操作では元のデータ(HadoopのHDFSに保存され、Hive経由でクエリされる)が使用されます。クエリのこの部分はレイテンシが高くなります(元のデータへのクエリを回避するため、デフォルトでは無効になっています)。

2.1.4 メタデータ管理ツール

Kylin はメタデータ駆動型アプリケーションです。メタデータ管理ツールは、Kylin に保存されているすべてのメタデータ(最も重要な Cube メタデータを含む)を管理するために不可欠なコンポーネントです。他のすべてのコンポーネントが適切に機能するには、このメタデータ管理ツールが必要です。Kylin のメタデータは HBase に保存されます。

2.1.5 タスクエンジン(キューブビルドエンジン)

このエンジンは、シェルスクリプト、Java API、MapReduceタスクなど、あらゆるオフラインタスクを処理するように設計されています。タスクエンジンはKylin内のすべてのタスクを管理・調整し、各タスクが効率的に実行されるようにし、発生する問題を解決します。

2.2 コアアルゴリズム

2.2.1 動作原理

Kylin は、データ モデルに対してキューブの事前計算を実行し、その結果を使用してクエリを高速化します。

  • データ モデルを指定し、ディメンションとメジャーを定義します。
  • Cube の事前計算では、すべての Cuboid を計算し、それらをマテリアライズド ビューとして保存します。事前計算プロセスでは、Kylin が Hive から生データを読み取り、選択したディメンションに従って計算を実行し、結果セットを HBase に保存します。デフォルトの計算エンジンは MapReduce ですが、Spark を選択することもできます。1 つのビルドの結果はセグメントと呼ばれます。ビルド プロセスでは複数の Cuboid が作成され、その具体的な作成プロセスは `kylin.Cube.algorithm` パラメータによって決定されます。パラメータ値は `auto`、`layer`、および `inmem` で、デフォルト値は `auto` です。つまり、Kylin は収集されたデータに基づいてアルゴリズム (layer または inmem) を動的に選択します。ユーザーが Kylin、データ、およびクラスターに精通している場合は、好みのアルゴリズムを直接設定できます。
  • クエリを実行し、Cuboid を読み取り、プログラムを実行して、クエリ結果を生成します。

2.2.2 建設方法

主なタイプには、レイヤーごとの構築アルゴリズムと高速構築アルゴリズムの 2 つがあります。

2.2.2.1 層ごとの構築アルゴリズム

N次元キューブは、1つのN次元サブキューブ、N個の(N-1)次元サブキューブ、N*(N-1)/2(N-2)次元サブキューブ、…、N個の1次元サブキューブと1つの0次元サブキューブ、合計2^N個のサブキューブで構成されます。レイヤーごとのアルゴリズムでは、次元レベルを下げながら計算が進められます。各レベルの計算(元のデータから集約される最初のレベルを除く)は、その上のレベルの結果に基づいています。たとえば、[Group by A, B]の結果は、[Group by A, B, C]の結果からCを除けば得られるため、冗長な計算が削減されます。0次元の直方体を計算すると、キューブ全体の計算が完了します。

各計算ラウンドは MapReduce タスクであり、順番に実行されます。N 次元キューブには少なくとも N+1 個の MapReduce ジョブが必要です。

アルゴリズムの利点:

  • このアルゴリズムは、MapReduce の機能を最大限に活用して複雑な中間ソートおよびシャッフル プロセスを処理し、明確でシンプルで保守しやすいコードを実現します。
  • Hadoop の成熟度が高まったおかげで、このアルゴリズムはクラスターに対する要件が低く、安定して実行されます。Kylin の内部メンテナンス中にこれらのステップでエラーが発生することはほとんどありません。Hadoop クラスターがビジー状態の場合でも、タスクを完了できます。

アルゴリズムの欠点:

  • キューブの次元数が多い場合、必要なMapReduceタスクの数もそれに応じて増加します。Hadoopタスクのスケジューリングは追加のリソースを消費するため、特にクラスターが大きい場合は、タスクを繰り返し送信することで発生する追加のオーバーヘッドがかなり大きくなる可能性があります。
  • このアルゴリズムは、Hadoop MapReduceに大量のデータを出力します。CombinerはMapperからReducerへのデータ転送を削減するために使用されますが、すべてのデータはHadoop MapReduceによってソートおよび結合された後に集約される必要があるため、クラスターへの負荷が増加します。
  • HDFS では読み取りと書き込みの操作が多数あります。各計算層の出力は次の計算層の入力として使用されるため、これらのキーと値のペアを HDFS に書き込む必要があります。すべての計算が完了したら、Kylin はこれらのファイルを HBase の HFile 形式に変換して HBase にインポートするという追加のタスクも必要になります。全体的に見て、このアルゴリズムは非効率的であり、特にキューブの次元数が多い場合は非効率的です。

2.2.2.2 高速ビルドアルゴリズム(inmem)

「By Segment」または「By Split」アルゴリズムとも呼ばれる高速ビルドアルゴリズムは、バージョン1.5.xで導入されました。このアルゴリズムは、まずMapperを用いて集約の大部分を実行し、その後集約結果をReducerに渡すことで、ネットワークボトルネックへの負荷を軽減します。このアルゴリズムの基本的な考え方は、Mapperによって割り当てられた各データブロックに対して、(すべてのCuboidsを含む)完全な小さなキューブセグメントを計算することです。各Mapperは計算されたキューブセグメントをReducerに出力し、そこでマージして最終結果である大きなキューブを生成します。このプロセスは図に示されています。

高速キューブアルゴリズム

古いアルゴリズムと比較すると、高速アルゴリズムには主に 2 つの違いがあります。

  • Mapper は事前集計にメモリを使用してすべての組み合わせを計算します。Mapper によって出力される各キーは一意であるため、Hadoop MapReduce に出力されるデータ量が削減されます。
  • MapReduceを1回実行すると、各レベルの計算がすべて完了するため、Hadoopタスクの割り当ての必要性が軽減されます。そのため、マシンの性能が良好な場合は、この手法が推奨されます。

2.2.3 キューブストレージの原理

ディメンション ディクショナリ テーブルに次の情報が含まれていると仮定します。

辞書情報

Cube 集計のディメンションとして住所、カテゴリ、日付を選択する場合、Cube がデータを事前に集計して HBase に保存する方法を理解する必要があります。

キューブストレージ

システムはすべてのディメンションに対して0-1マッピングを実行し、選択されているかどうかを示します。その後、選択されたディメンションごとに、対応するディメンション値がマッピングされます。この時点で、キーはCubeid + ディメンション値、値は対応する事前集計結果となります。

2.3 Kylinを入手する

2.3.1 Kylinのインストール

Kylin は Hadoop、HBase、Zookeeper、Spark に依存しているため、インストール前にすべての前提条件が満たされていることを確認する必要があります。インストールの詳細については、Baidu のチュートリアルをご覧ください。

2.3.2 データ準備

Kylin をインストールしたら、データソースの構築、モデルの作成、キューブの作成といった操作を行う必要があります。これらはすべて標準的な操作なので、特に説明は不要でしょう。モデルの作成は Power BI と似ています。テーブルの結合方法とフィールド、ファクトテーブル、各ディメンションのメトリックとディメンションを選択する必要があります。

2.4 注意事項

ルーティングはデフォルトで無効になっているため、安定した OLAP クエリ パフォーマンスを確保し、速度の不安定さを防ぐために、次の制約が適用されます。

2.4.1 SQL は、モデルの構築に使用される結合条件に従ってのみ記述できます。

作成プロセスに A と B の結合が含まれる場合、クエリは同じ方法でのみ実行できます。

2.4.2 グループ化と統計は、キューブの構築時に選択したディメンション フィールドに基づいてのみ実行できます。

4 つのディメンションを選択した場合、OLAP クエリを実行するときに、groupBy に選択できるのはこれらの 4 つのディメンションのみになります。

2.4.3 キューブの構築時に選択したメジャー フィールドのみをカウントできます。

キューブの構築時に2つのメトリックのみを追加した場合、その2つのメトリックのみをクエリできます。他のメトリックはクエリできません。

3. キューブ構築の最適化

3.1 派生ディメンションの使用

派生ディメンションは、有効なディメンション リスト内のディメンション テーブルから主キー以外のディメンションを除外し、ディメンション テーブルの主キー (その...) を使用するために使用されます。

これらを置き換えるために、主キー(ファクトテーブル内の対応する外部キー)が使用されます。Kylinは、ディメンションテーブルの主キーとディメンションテーブルの他のディメンション間のマッピング関係を基礎レベルで記録します。これにより、ディメンションテーブルの主キーは、クエリ実行中にこれらの主キー以外のディメンションに動的に「変換」され、リアルタイムで集計されます(クエリ時間が長くなる可能性があるため、通常は推奨されません)。

微分次元

3.2 集約グループの使用

集約グループは、さまざまなプルーニング戦略を指定して次元の組み合わせの数を削減できる強力なプルーニング ツールです。

3.2.1 必須寸法

強制寸法

必須ディメンション: ディメンションが必須ディメンションとして定義されている場合、グループ化後のディメンションの組み合わせにはそのディメンションが含まれている必要がありますが、必須ディメンションは単独では表示できません。

3.2.2 階層的次元

階層的次元

ディメンション A (年) -> ディメンション B (月) のように、ディメンション間に依存関係が指定されている場合、ディメンション B を単独で表示することはできません。ディメンション B を表示するには、ディメンション B がディメンション A 内に存在している必要があります。

3.2.3 ジョイント寸法

ジョイント寸法

各結合には2つ以上の次元が含まれます。特定の列が結合を形成する場合、そのグループによって生成される直方体では、これらの結合次元は一緒に出現するか、いずれの次元も出現しません。

3.3 行キーの最適化: Kylin は、すべてのディメンションを 1 つの完全な行キーに順番に結合し、この行キーを使用して行を昇順に並べ替えます。

すべての行を直方体に配置します。適切に設計された行キーは、データクエリのフィルタリングと位置特定をより効率的に実行し、I/O操作の数を減らし、クエリ速度を向上させます。行キー内の次元の順序は、クエリのパフォーマンスに大きな影響を与えます。

3.3.1 フィルタリングされたディメンションが最初に配置されます。

A の列挙値が 1、2、3、4 であり、B の列挙値が a、b、c、d であるとします。

フィルター

3.3.2 カーディナリティの高いディメンションを、カーディナリティの低いディメンションの前に配置します。

ABの結果を生成するには、ABCとABDの結果を取得できます(ABDの結果は行数が少なくなります)。Kylinシステムはデフォルトで小さい方のcubeidを選択するため、カーディナリティの次元は可能な限り前方に調整する必要があります。

3次元から2次元が生成されます。

4. 参考文献

キリン: https://www.bilibili.com/video/BV1QU4y1F7QH?p=19