blog

Apache Kylin 4.0 完全重複排除グローバル辞書の原則

OLAP データ分析の分野では、重複排除カウントは非常に一般的な要件であり、重複排除結果の要件に 応じて、近似重複排除と厳密重複排除に分けられます。 大規模なデータセットでは、正確な重複排除を達成し、...

Aug 6, 2020 · 4 min. read
シェア

グローバル辞書の説明

グローバル辞書が必要な理由

OLAPデータ分析の分野では、重複排除カウントは非常に一般的な要件であり、重複排除結果の要件に応じて、近似重複排除と厳密重複排除に分けられます。

大規模なデータセットにおいて、正確な重複排除を行い、かつ高速なクエリ応答を保証することは依然として困難です。正確な重複排除の処理方法としてよく使われるのがビットマップ法です。整数データについては、統計情報は、ビットマップに保存することができますが、整数に加え、データの実際の処理は、文字列や他の型になり、正確な重複除外を行う場合は、まず、統一されたマッピングのためのデータの辞書を構築する必要がありますし、統計情報のビットマップ法を介して。

Kylin は事前計算技術によってビッグデータ分析を高速化することが知られています。Cube をインクリメンタルに構築する場合、異なるセグメントが個別に辞書を構築して最終的な重複排除結果が誤ってしまうことを避けるため、Cube 内のすべてのセグメントが同じ辞書、つまりグローバル辞書を使用します。

グローバル辞書の進化

Kylinはバージョン1.5.3からグローバル辞書機能をサポートしていますが、その時点での作り方にも明らかな欠陥がありました:

グローバル辞書はジョブサーバ上の1箇所で構築されるため、データが増加すると構築時間が制御できなくなります。 データが蓄積されると、グローバル辞書の構築はKylinの構築ノードのメモリ要件を増加させ続けます。詳細はKylin分散グローバル・ディクショナリ 参照してください。しかし、Kylin 4.0は、クエリエンジンの新しい構造に適応するために 、 グローバル辞書を構築する別の分散方法を達成するために火花に基づいて 、 今日Kylin 4.0グローバル辞書が達成される方法の詳細を説明するために 。

スパーク・ベースのグローバル辞書

Kylin 4.0は、分散コーディング処理のためにSparkをベースとしたグローバル辞書を構築し、単一ノードへの負担を軽減し、最大整数数の制限を突破するための辞書数を構築します。

設計と原理

グローバル・ディクショナリの構造

  • 各ビルドタスクに対して新しいグローバル辞書が生成されます。
  • 辞書は新しいビルドタスクごとにバージョン番号ごとに保存され、古いグローバル辞書は徐々に削除されます。
  • 辞書は、メタデータ・ファイルと複数の辞書ファイルで構成され、各辞書ファイルはバケットと呼ばれます。
  • それぞれのバケツは2つのマッピングに分けられ、それらが組み合わされて完全なマッピング関係となります。

Bucketの概念と変換

Kylinはバケットという概念を導入しており、データをいくつかのバケットに分割して並列処理する方法と解釈できます。 辞書を構築する最初の時間は、1エンコードの最初から、エンコード完了後のすべてのバケットで、各バケットのオフセット値に従って、辞書の値の全体的な割り当てになります。コード内の2つのエンコーディングは2つのHashMapに格納され、一方はバケット内の相対的な辞書値を格納し、もう一方はすべてのバケット間の絶対的な辞書値を格納します。

次の図は、バケツ番号1のバケツの複数ビルドタスクにおける、バケツ内の辞書の受け渡しを示しています。各ビルドは、バケツの新しいバージョンを作成します。バージョン管理を追加する理由については、後で説明します。Curr(current)とPrev(previous)は、バケツ内の2つのHashMapで、それぞれ現在のバケツ内の辞書の相対エンコード値と、ビルドされたすべての辞書値の絶対エンコード値を格納します。すべての辞書値の絶対エンコード値。

構築ステップ

  • Sparkでフラットテーブルを作成し、冗長化されていない正確なカラムの識別値を取得します。
  • 重複排除後のリテラル数からスライス数を確認し、需要に応じて容量拡張が必要かどうかを判断します。
  • データを複数のスライスに分割し、別々にエンコードして、それぞれのディクショナリファイルに格納します。
  • 現在のビルドへのバージョン番号の割り当て
  • 辞書ファイルとメタデータデータの保存
  • 条件に基づいて古いバージョンを削除する必要性を判断

初期ビルド

  • バケットサイズの計算

    単一のバケツ閾値を扱うために構築される必要がある辞書の数の最大値と、バケツ数のデフォルト値を取ります。
  • バケットを作成し、エンコード用のデータを割り当てます。
  • メタ・ファイル・レコード・バケットのオフセット生成 関連する設定項目とそのデフォルト値を以下に示します。
kylin.dictionary.globalV2-min-hash-partitions=10
kylin.dictionary.globalV2-threshold-bucket-size=500000

非初期ビルド

  • 辞書の数からバケットを拡張する必要があるかどうかを判断します。
  • エンコードされた辞書値は、展開されたバケットに再割り当てされます。
  • 辞書データの最新版を読み込んでバケットに配布
  • バケツへの新しい値の割り当て
  • 以前のビルドからの辞書値は変更されません

バージョン管理

グローバル辞書は、タイムスタンプ・ベースのバージョン番号を単一のビルドに割り当てることで、分離されます。バージョン管理を含める理由は、構築タスクが同時に実行される可能性があり、グローバル辞書の構築時の現在のエンコーディングが同時実行をサポートしていないためです。バージョン管理を使用すると、各エンコーディングは構築されたグローバル・ディクショナリを完全に読み取ることができるため、ディクショナリの最新バージョンはグローバル・ディクショナリの最も完全なエンコーディングを持ち、キューブのグローバル・ディクショナリが読み取られるたびに最新バージョンが選択されるようになります。ディクショナリは最終的に、以下のようにファイル・ストレージ・システム上にバージョン別に格納されます。

Read next

「青い橋の杯」深さ優先探索 - 大地の宮殿での宝探し

ダンジョンの宝物庫はn x mのグリッドの行列です。各グリッドには宝が1つあります。各宝物には値が付けられています。ダンジョンの入り口は左上にあり、出口は右下にあります。 明は地下宮殿の入り口に連れて行かれ、王様から右か下にしか歩かないように言われます。あるマス目を通り抜けたとき、そのマス目にある宝物の価値が明の手にある宝物の価値より大きければ、明はそれを拾うことができます(もちろん、拾わないこともできますが...)。

Aug 6, 2020 · 2 min read