ハイブ アーキテクチャとメタストア機能の簡単な紹介

ここ 2 日間、Java を使用して、Hive メタストア (Hive2 は使用できません) を介して Hive テーブルのデータを読み取る方法を調査していました。SQL クエリを直接サポートするのが最善です。さまざまな調査と試みの結果、最終的にこの道路は機能しないと判断されました。この期間、私は hive の内部アーキテクチャを勉強しました。これは実際には公式ドキュメントを読むことを意味します。忘れるのを恐れて記録しておきます。

hive server2ハイブには、ハイブとハイブの 2 つの主要コンポーネントがありますhive metastore。前者は外部に DML サービスを提供する役割を果たし、後者はデータのメタ情報を記録し、SQL が実行プランを生成するための基礎を提供します。(メタストアからテーブル内のデータを確認できないのはなぜですか?メタストアがまったく存在しないためです)。


ハイブアーキテクチャ

ここに画像の説明を挿入します

この写真は公式ウェブサイトから引用しました主要なコンポーネントと、Hadoop (Spark) との相互作用を示します。主なコンポーネントは次のとおりです。

  • UI: ユーザーがシステムにクエリやその他の操作を送信するためのインターフェイス。2011 年以降、コマンド ラインと Web GUI の 2 つの操作インターフェイスがサポートされています。
  • ドライバー: このコンポーネントはユーザーの操作リクエスト (クエリ) を受け取り、JDBC/ODBC インターフェイスからのリクエストをサポートし、セッションを作成し、リクエストを実行して結果を返します。
  • コンパイラー: このコンポーネントは、メタストアの支援を受けてクエリ ステートメントを解析し、さまざまなクエリ ブロックおよびクエリ ステートメントに対して構文分析を実行し、実行プランを生成します。
  • メタストア: このコンポーネントは、列および列タイプの情報を含む、データ ウェアハウス内のすべてのテーブルの構造情報とパーティション情報を保存します。データの読み書き時に必要なシリアライザーとデシリアライザー、および HDFS 上のデータの位置情報。メタストアには、データそのものではなく、データに関するメタ情報が保存されます。
  • 実行エンジン: このコンポーネントは、コンパイラーによって生成された実行プラン (複数のステージで構成される有向非巡回グラフ) の実行を担当します。実行計画内のさまざまなステージ間の依存関係を管理し、適切なシステム コンポーネントでステージを実行します。

上の図は、一般的なクエリ操作の実行プロセスも示しています。対話型インターフェイスを介してドライバーにクエリ要求を送信します (ステップ 1)。ドライバーはクエリ ステートメントのセッションを作成し、それをコンパイラーに送信して実行プランを生成します (ステップ 2)。コンパイラはメタストアから必要なメタ情報を取得します (ステップ 3 および 4)。コンパイラによって生成されるクエリ プランは、複数のステージで構成される有向非巡回グラフであり、各ステージは MapReduce タスクです。実行エンジンはこれらのステージを管理し、適切なコンポーネントに送信します (ステップ 6、6.1、6.2、および 6.3)。画像に描かれているステージは Hadoop に送信して実行するものですが、Hadoop の初期バージョン (現在は使用されていません) であり、Spark に送信して実行することもできます。各タスクの実行時にハイブ テーブルのデータを読み取る場合、実際にはテーブルに対応するデシリアライザーを使用して、HDFS からデータを直接読み取り、データを操作します。生成された中間出力は、後で使用できるようにシリアライザーを使用して HDFS の一時ファイルに書き込まれます。DML 操作の場合、最終的な一時ファイルはテーブルの場所に移動され、このスキームによりダーティ データが読み取られることがなくなります。クエリ リクエストの場合、実行エンジンは最終ファイルを HDFS から直接読み取り、結果をドライバーに返します (ステップ 7、8、および 9)。


ハイブデータモデル

Hive 内のデータは次のように編成されます。

  • テーブル: HIve テーブルはリレーショナル データベース テーブルに似ています。フィルタリング、投影、結合、ユニオンの機能があります。テーブル内のデータは HDFS に直接保存されます。サポート出演。
  • パーティション: テーブル内のデータは 1 つ以上のパーティションを持つことができます。パーティションは、データが HDFS にどのように保存されるかを決定します。同じパーティションのデータは同じディレクトリに保存されます。ディレクトリのネストは、複数のパーティションが存在する場合に発生します。通常、時間はパーティションとして使用されます。
  • バケット: この概念は中国語ではブロック、バケット、場合によってはパーティションとして翻訳されますが、「パーティション」という名前は上記の概念と混同されやすいです。テーブル内の同じパーティション内のデータは、特定の列のハッシュ値に応じてさらにブロックに分割され、各ブロックは別のファイルとして扱われます。最終的には、テーブル内の同じパーティションのデータが同じディレクトリに格納され、このディレクトリ内に多数のファイルが存在することがわかります。ブロックの出現により、クエリの効率が向上します。

メタストア

当初の設計意図

Hive Metastore は元々、Hive のテーブルとパーティションのメタデータ管理の問題を解決するために設計されました。Hive では、テーブルとパーティションのメタデータには、テーブル名、列名、データ型、パーティション キー、保存場所などの情報が含まれており、これらのメタデータを保存および管理する必要があります。Hive Metastore は、このメタデータを管理するように設計されています。Hive メタストアがない場合、Hive はテーブルとパーティションのメタデータを HDFS メタデータ ファイル (Hive メタデータ ストレージ ディレクトリと呼ばれることが多い) に保存します。Hive は、このディレクトリ内にテーブルと同じ名前のディレクトリを作成し、このディレクトリに "_metadata" という名前のファイルを作成します。このファイルには、テーブル名、列名、データ型などのテーブルのメタデータ情報が含まれています。 。パーティションの場合、Hive はテーブルのメタデータ ファイルにパーティション キーとパーティション値を記録しますが、パーティションの保存場所は記録しません。したがって、Hive Metastore がないと、ユーザーはパーティションの保存場所を手動で管理する必要があり、パーティション管理に不便さと非効率が生じる可能性があります。

具体的には、ユーザーは HDFS 内のパーティションごとにディレクトリを作成し、そのディレクトリの下にパーティションのデータを保存する必要があります。たとえば、「2019」という名前のパーティションを含む「sales」という名前のテーブルがある場合、ユーザーは次の手順に従ってパーティションの保存場所を手動で管理できます。

  1. HDFS に「sales」という名前のディレクトリを作成します。これは、「sales」テーブルのデータを保存するために使用されます。
  2. 「sales」ディレクトリの下に「2019」という名前のディレクトリを作成します。これは、「2019」パーティションのデータを保存するために使用されます。
  3. 「2019」パーティションのデータを「sales/2019」ディレクトリに保存します。

パーティションの保存場所を手動で管理する場合は、次の点に注意する必要があります。

  1. パーティション ディレクトリの名前は、パーティション キーの値と同じである必要があります。たとえば、「2019」パーティションのディレクトリ名は「2019」である必要があります。
  2. パーティション ディレクトリは、テーブルの保存ディレクトリの下にある必要があります。たとえば、「2019」パーティションのディレクトリは、「sales」テーブルの保存ディレクトリの下にある必要があります。
  3. Hive がディレクトリ内のデータにアクセスできるようにするには、パーティション ディレクトリのアクセス許可がテーブルのストレージ ディレクトリと同じである必要があります。

Metastore はメタデータとパーティションをどのように管理しますか?

  1. テーブルとパーティションのメタデータの保存: Hive Metastore は、テーブル名、列名、データ型、パーティション キー、保存場所などを含む、テーブルとパーティションのメタデータ情報を保存できます。ユーザーがテーブルやパーティションを作成または変更すると、Hive Metastore はメタデータ情報を自動的に更新します。
  2. メタデータ クエリのサポート: Hive Metastore はメタデータ クエリをサポートでき、ユーザーは Hive SQL ステートメントを通じてテーブルとパーティションのメタデータ情報をクエリできます。Hive Metastore はクエリをメタデータ ストレージ上の操作に自動的に変換するため、メタデータに対する効率的なクエリが可能になります。
  3. メタデータ変更のサポート: Hive Metastore はメタデータ変更をサポートしており、ユーザーは Hive SQL ステートメントを通じてテーブルとパーティションのメタデータ情報を変更できます。Hive Metastore は、変更をメタデータ ストレージ上の操作に自動的に変換するため、メタデータの効率的な変更が実現します。
  4. メタデータのバージョン管理とトランザクション管理のサポート: Hive Metastore は、メタデータのバージョン管理とトランザクション管理をサポートできます。ユーザーは、Hive SQL ステートメントを通じてメタデータのバージョン管理とトランザクション管理を実行し、メタデータの一貫性と信頼性を確保できます。
  5. パーティションのストレージの場所を管理する: Hive Metastore はパーティションのストレージの場所を自動的に管理できます。ユーザーがパーティションを作成または変更すると、Hive Metastore はパーティション データを正しい場所に自動的に保存します。ユーザーはパーティションの保存場所を手動で管理する必要がなくなり、パーティション管理の効率と信頼性が向上します。
  6. パーティション クエリのサポート: Hive Metastore はパーティション クエリをサポートし、ユーザーは Hive SQL ステートメントを通じてパーティション データをクエリできます。Hive Metastore は、クエリを HDFS ファイル システム操作に自動的に変換して、パーティション分割されたデータに対する効率的なクエリを実現します。
  7. パーティション アクセス許可制御のサポート: Hive Metastore はパーティション アクセス許可制御をサポートでき、ユーザーは Hive SQL ステートメントを通じてパーティション アクセス許可を設定し、パーティション データのセキュリティを保護できます。

つまり、Hive Metastore はパーティションの保存場所とメタデータ情報を自動的に管理できるため、パーティション管理の効率と信頼性が向上します。同時に、Hive Metastore はパーティション クエリやアクセス許可制御などの機能もサポートし、より包括的なパーティション管理ソリューションとクエリ効率の向上をユーザーに提供します。

メタデータオブジェクト

  • データベース: テーブルの名前空間。
  • テーブル: テーブルのメタストアには、すべての列、所有者、ストレージ、シリアル化および逆シリアル化の情報が含まれており、ユーザー指定のキーと値のペアを引き続き含むこともできます。ストレージ情報には、テーブル内のデータの位置情報、ファイルの入出力形式、バケット情報が含まれます。すべてのメタ情報は、テーブルの作成時に生成され、保存されます。
  • パーティション: 各パーティションには、独自の列情報、シリアル化と逆シリアル化、およびストレージ情報があります。これは、古いパーティションに影響を与えずにスキーマを変更するために行われます。

いくつかの小さな質問

1. Hive メタストアと Hive Server2 の違いは何ですか?

機能は異なりますが、hive2 は外部データクエリ機能を提供し、Metastore は Hive テーブルのメタデータ情報を管理し、外部メタデータ情報クエリ機能を提供します。

2. テーブル内のデータは Hive Metastore を通じてクエリできますか?

できません。Hive メタストアは Hive のメタデータ ストレージ サービスにすぎないため、テーブル内のデータを Hive メタストア自体を通じてクエリすることはできません。テーブル構造、パーティション情報、テーブルの場所などの Hive テーブルのメタデータ情報の管理を担当します。テーブル内の実際のデータ。Hive テーブル内のデータをクエリするには、hive2 クエリを使用する必要があります。Hive クエリ サービスを使用する場合、Hive メタストアを通じてテーブルのメタデータ情報 (テーブル構造、パーティション情報、テーブルの場所など) を取得し、それに基づいてストレージ システムからテーブル内の実際のデータを読み取ります。この情報。したがって、Hive メタストアは Hive クエリ サービスの重要なコンポーネントですが、テーブル自体のデータをクエリすることはできません。

3. なぜ Spark は Hive Metastore を通じてテーブル内のデータを読み取ることができるのですか?

Spark SQL と Hive は両方とも Hadoop エコシステムに基づいており、Hadoop のストレージとコンピューティング リソースを共有しているため、Spark は Hive Metastore を通じて Hive テーブル内のデータを読み取ることができます。具体的には、Spark SQL は、Hive Metastore を通じて Hive テーブルのメタデータ情報を取得できます。言い換えれば、Spark は、どのデータを使用したいか、そしてそれがどこに保存されているかを知っています。その後、Spark タスクは HDFS 上のデータを読み取ります。この時点では、hive2 を使用する必要はなく、読み取り、書き込み、計算プロセス全体が行われます。クラスタ内で行われ、データのセキュリティが保証されます。

おすすめ

転載: blog.csdn.net/yy_diego/article/details/130887242