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のテーブルと第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 インデックス データを読み書きするという目的を達成します。