Hive 原理の分析

1. はじめに

Hive は、Hadoop 上に構築されたデータ ウェアハウス フレームワークであり、ビッグ データ プラットフォームにバッチ処理コンピューティング機能を提供し、構造化/半構造化データのバッチ分析と要約を実行してデータ計算を完了できます。構造化データを操作するための SQL に似た Hive クエリ言語言語を提供します。その基本原理は、HQL 言語を MapReduce タスクに自動的に変換して、Hadoop クラスターに保存されている大量のデータのクエリと分析を完了することです。Hive テーブルの詳細については、オープンソース コミュニティの Hive チュートリアルを参照してください。

Hive の主な機能は次のとおりです。

  • 膨大な構造化データの分析と要約。
  • 複雑な MapReduce 記述タスクを SQL ステートメントに簡素化します。
  • 柔軟なデータ ストレージ形式。JSON、CSV、TEXTFILE、RCFILE、SEQUENCEFILE、ORC (Optimized Row Columnar) ストレージ形式をサポートします。

2、ハイブ構造

Hive は単一インスタンスのサービス プロセスです。サービス提供の原則は、HQL をコンパイルおよび解析して、対応する MapReduce タスクまたは HDFS タスクにすることです。次の図は、Hive の構造の概要です。
ここに画像の説明を挿入します

名前 説明する
ハイブサーバー 負荷分散のために複数の HiveServer をクラスターにデプロイできます。Hive データベース サービスを外部に提供し、ユーザーによって送信された HQL ステートメントをコンパイルし、それらを対応する Yarn タスクまたは HDFS 操作に解析して、データの抽出、変換、分析を完了します。
メタストア 1. 負荷分散のために複数の MetaStore をクラスターにデプロイできます。Hive メタデータ サービスを提供し、Hive テーブルの構造と属性情報の読み取り、書き込み、保守、および変更を担当します。2. HiveServer、Spark、WebHCat などの MetaStore クライアントに、メタデータにアクセスして操作するための Thrift インターフェイスを提供します。
WebHCat 負荷分散のために複数の WebHCat をクラスターにデプロイできます。Hive コマンドを実行し、Rest を通じて MapReduce タスクを送信するための Rest インターフェイスを提供します。
ハイブクライアント 人間とコンピューターの対話コマンド ライン Beeline、JDBC アプリケーション用に提供される JDBC ドライバー、Python アプリケーション用に提供される Python ドライバー、Mapreduce 用に提供される HCatalog 関連の JAR パッケージが含まれます。
ZooKeeper クラスター ZooKeeper は、各 HiveServer インスタンスの IP アドレス リストを記録する一時ノードとして機能します。クライアント ドライバーは Zookeeper に接続してリストを取得し、ルーティング メカニズムに従って対応する HiveServer インスタンスを選択します。
HDFS/HBase クラスター Hive テーブル データは HDFS クラスターに保存されます。
MapReduce/Yarn クラスター 分散コンピューティング サービスの提供: Hive のデータ操作のほとんどは MapReduce に依存しています。HiveServer の主な機能は、HQL ステートメントを MapReduce タスクに変換して、大量のデータの処理を完了することです。

HCatalog は Hive Metastore 上に構築されており、Hive の DDL 機能を備えています。別の意味では、HCatalog は Hadoop のテーブルおよびストレージ管理レイヤーでもあり、ユーザーはさまざまなデータ処理ツール (Pig や MapReduce など) を使用して、グリッド上の HDFS 上のデータをより簡単に読み書きできるようになります。これらのデータ処理ツールのインターフェイスを作成し、Hive のコマンド ライン インターフェイスを使用してデータ定義およびメタデータ探索コマンドを発行します。さらに、これらのコマンドをカプセル化することにより、WebHcat サーバーは、次の図に示すように、外部への RESTful インターフェイスも提供します。
ここに画像の説明を挿入します
HDFS および MapReduce アーキテクチャに基づくデータ ウェアハウスとしての Hive の主な機能は、HQL (Hive Query Language) をコンパイルおよび解析することによって、対応する MapReduce タスクまたは HDFS 操作を生成および実行することです。Hive と HiveQL の詳細については、HiveQL 言語マニュアルを参照してください。

次の図は、Hive の簡略化された構造図です。

  • メタストア - テーブル、列、パーティションなどのメタデータに対して読み取り、書き込み、更新操作を実行します。基礎となる層はリレーショナル データベースです。
  • ドライバー - HiveQL 実行のライフサイクルを管理し、Hive タスクの実行期間全体を通して実行されます。
  • コンパイラー - HiveQL をコンパイルし、相互依存する一連の Map/Reduce タスクに変換します。
  • オプティマイザー - オプティマイザーは論理オプティマイザーと物理オプティマイザーに分かれており、それぞれ HiveQL によって生成された実行プランと MapReduce タスクを最適化します。
  • Executor - タスクの依存関係に従って Map/Reduce タスクを個別に実行します。
  • ThriftServer - JDBC サーバーとして Thrift インターフェイスを提供し、Hive を他のアプリケーションと統合します。
  • クライアント - ユーザー アクセス用のインターフェイスを提供する WebUI および JDBC インターフェイスが含まれています。
    ここに画像の説明を挿入します

3. Hive CBO の原理の紹介

CBO、正式名称はCost Based Optimizationで、コストベースのオプティマイザーです。

最適化の目標は次のとおりです。

コンパイル段階では、クエリ ステートメントに含まれるテーブルとクエリ条件に基づいて、生成される中間結果が少ない効率的な結合シーケンスが計算され、クエリ時間とリソース消費が削減されます。

Hive で CBO を実装する全体的なプロセスは次のとおりです。

Hive は、オープン ソース コンポーネント Apache Calcite を使用して CBO を実装します。まず、SQL ステートメントが Hive の AST に変換され、次に Calcite が認識できる RelNode に変換されます。Calcite が RelNode の結合順序を調整した後、Hive は RelNode を AST に変換し、Hive の論理最適化プロセスと物理最適化プロセスを継続します。以下にフローチャートを示します。
ここに画像の説明を挿入します
Calcite が結合順序を調整する具体的なプロセスは次のとおりです。

  1. 結合に参加しているすべてのテーブルについて、最初のテーブルとして 1 つのテーブルを選択します。
  2. 選択された第1のテーブルに応じて、コストに応じて第2のテーブルと第3のテーブルが選択される。これから、複数の異なる実行計画を取得できます。
  3. 最終的な逐次最適化結果として最小コストの計画を計算します。

具体的なコストの計算方法は以下の通りです。

現在のバージョンでは、コストは結合によって生成されるデータ部分の数に基づいて測定されます。結合によって生成されるデータ部分の数が少ないほど、コストは小さくなります。結合エントリの数は、結合に参加するテーブルの選択率によって異なります。テーブル内のデータ項目の数は、テーブル レベルの統計情報から取得されます。

フィルター条件によってフィルターされる項目の数は、列レベルの統計情報、最大値、最小値、および NDV (個別値の数) によって推定されます。

たとえば、データ総数 1,000,000、NDV 50 の統計情報を持つテーブル table_a があり、クエリ条件は次のとおりです。

Select * from table_a where colum_a='value1';

この場合、最終的なクエリの推定数は 1,000,000 * 1/50 = 20,000 となり、選択率は 2% となります。
以下では、例として TPC-DS Q3 を使用して、CBO が結合順序を調整する方法を紹介します。

select 
    dt.d_year, 
    item.i_brand_id brand_id, 
    item.i_brand brand, 
    sum(ss_ext_sales_price) sum_agg 
from 
    date_dim dt, 
    store_sales, 
    item 
where 
    dt.d_date_sk = store_sales.ss_sold_date_sk 
    and store_sales.ss_item_sk = item.i_item_sk 
    and item.i_manufact_id = 436 
    and dt.d_moy = 12 
group by dt.d_year , item.i_brand , item.i_brand_id 
order by dt.d_year , sum_agg desc , brand_id 
limit 10;

ステートメントの説明: このステートメントは 3 つのテーブルを使用して内部結合を実行します。そのうち、store_sales は約 2900000000 個のデータを含むファクト テーブル、date_dim は約 73,000 個のデータを含むディメンション テーブル、item は約 18,000 個のデータを含むディメンション テーブルです。データ。各テーブルにはフィルタリング条件があり、その結合関係は次のようになります。CBO は
ここに画像の説明を挿入します
まず、結合する最適なフィルタリング効果が得られるテーブルを選択します。

最小値、最大値、NDV、データ項目数を分析します。CBO は、以下の表に示すように、さまざまなディメンション テーブルの選択率を推定します。

テーブル名 元データ数 フィルタリング後のデータ数 選択性
date_dim 73000 6200 8.5%
アイテム 18000 19 0.1%

上表は元のテーブルのデータ数を取得するため、フィルタリングされたデータ数を見積もった後、選択率=フィルタリングされたデータ数/元のデータ数を計算します。
上の表からわかるように、項目テーブルのフィルタリング効果が優れているため、CBO は項目テーブルの結合順序を進めます。
CBO をオンにしていない場合の結合図を以下に示します。 CBO をオンにした
ここに画像の説明を挿入します
後の結合図を以下に示します。
ここに画像の説明を挿入します
最適化後、中間結果の数が 495,000,000 から 2,900,000 に減少し、実行時間が短縮されていることがわかります。も大幅に削減されました。

4. Hive と HDFS コンポーネントの関係

Hive は Apache の Hadoop プロジェクトのサブプロジェクトであり、ファイル ストレージ システムとして HDFS を利用します。Hive は解析と計算を通じて構造化データを処理し、Hadoop HDFS は Hive に信頼性の高い基盤となるストレージ サポートを提供します。Hive データベース内のすべてのデータ ファイルは Hadoop HDFS ファイル システムに保存でき、すべての Hive データ操作は Hadoop HDFS インターフェイスを通じて実行されます。

5. Hive コンポーネントと MapReduce コンポーネントの関係

Hive のデータ計算は MapReduce に依存しています。MapReduce は、Apache の Hadoop プロジェクトのサブプロジェクトでもあり、Hadoop HDFS に基づく分散並列コンピューティング フレームワークです。Hive がデータ分析を実行するとき、ユーザーが対応する MapReduce タスクに送信した HQL ステートメントを解析し、実行のために MapReduce に送信します。

6. ハイブとテズの関係

Tez は Apache のオープン ソース プロジェクトです。有向非巡回グラフをサポートする分散コンピューティング フレームワークです。Hive がデータ分析に Tez エンジンを使用すると、ユーザーによって送信された HQL ステートメントが対応する Tez タスクに解析され、Tez に送信されます。実行のために。

7、HiveとDBServiceの関係

Hive の MetaStore (メタデータ サービス) は、Hive のデータベース、テーブル、パーティションなどの構造と属性情報 (つまり、Hive のメタデータ) を処理します。この情報はリレーショナル データベースに保存し、MetaStore によって管理および処理する必要があります。製品では、Hive のメタデータは DBService コンポーネントによって保存および維持され、Metadata コンポーネントはメタデータ サービスを提供します。

八、HiveとElasticsearchの関係

Hive は、拡張ファイル ストレージ システムとして Elasticsearch を使用できます。Hive は、Elasticsearch が提供する Elasticsearch-Hadoop プラグインを統合して、テーブルを作成し、テーブル データを Elasticsearch に保存し、Hive が Elasticsearch インデックス データを読み書きするという目的を達成します。

おすすめ

転載: blog.csdn.net/weixin_43114209/article/details/132524237