ハイブインタビュー自習編

1.HIVEとは何ですか?

Hive は、Facebook がオープンソース化した Hadoop ベースのデータ ウェアハウス ツールで、構造化データ ファイルをテーブルにマップし、SQL のようなクエリ関数を提供できます。
Hive は、構造化データ ファイルをテーブルにマップし、H-SQL ステートメントを MapReduce プログラムに変換してクラスター上で実行できる、Hadoop ベースのデータ ウェアハウス ツールです。

2. Hive のアーキテクチャ モデルについて説明する

答え 1

クライアント -> Hive/HiveServer2 -> MetaStore -> Hadoop -> MapReduce
1. まず、クライアントは Hive にアクセスするか、HiveServer2 にアクセスします。
2. 次に、MetaStore は Hadoop にアクセスして関連するメタデータを記録します
。 3. 最初の 2 つのステップは、Hive 接続を開始した後の準備です。操作で
は、データを確認し、SQL 文を記述してデータを操作できるようになります
4. ドライバーは、YARN を呼び出すプランを生成することで最適解を見つけます。
このとき、メタデータ HADOOP YARN にアクセスします。

答え 2

Hive は大きく分けて、Hive サービス モジュール、Hive クライアント モジュール、メタデータ ストレージ モジュール、リアル データ ストレージ モジュールで構成されます。通常、hive コマンドを使用して Hive クライアントを起動するには、メタデータへのアクセスを保証するためにメタストア サービスを開始する必要があり、メタデータは MySQL などのサードパーティのリレーショナル データベースに保存されます。サードパーティのクライアント ツールを使用して Hive データにリモート アクセスする場合は、hiveserver2 サービスを開始する必要があります。次に、クエリ ステートメントが実行されると、クライアントは最初にハイブへのリクエストを開始し、次にハイブは独自のドライバー エンジンを使用してクエリ ステートメントを意味論的に分析し、論理的な実行プランを生成し、それを最適化して、 MR プログラム。いわゆる物理実行プランです。最後に、MR 物理実行プランが最適化され、最終的に MR プログラムはデフォルトで実行するために Yarn クラスターに送信されます。このプロセスでは、Hadoop クラスターとの対話が行われます。メタデータへのアクセス操作を通じて実現されます。最終的なクエリ結果がクライアント ウィンドウに返されます。

3. Hive の内部テーブルと外部テーブルの違いと、それらの使用シナリオを簡単に説明します。

1. まず違いについて話しましょう

内部テーブル: Hive でメタデータを削除すると、HDFS データも一緒に削除されます
外部テーブル: メタデータを削除しても、HDFS データは削除されません。

2. 使用シナリオ (主にデータを削除する必要があるかどうかを特性に基づいて判断)

内部テーブル: 元のログの変更されたデータ テーブルなど、変更された一時データを格納します
外部テーブル: 元のログなど、最も元のデータを格納します。

答え 2

Hive では、内部テーブル (マネージド テーブル) と外部テーブル (外部テーブル) の 2 種類のテーブルを作成できます。
内部テーブルを作成すると、Hive はテーブルのデータとメタデータを完全に管理します。言い換えれば、データのライフサイクルは Hive によって制御されます。内部テーブルを削除すると、Hive はメタデータと HDFS に保存されているデータの両方を削除します。このタイプのテーブルは、一時データや中間結果の保存に適しています。
外部テーブルを作成する場合、Hive はメタデータのみを管理し、データのライフ サイクルはユーザーが制御する必要があります。外部テーブルを削除すると、Hive はメタデータのみを削除し、データは HDFS に残ります。この種類のテーブルは、共有データおよび永続データの保存に適しています。同じデータにアクセスする必要がある複数の Hive インスタンスまたは他のアプリケーションがある場合は、外部テーブルを使用すると便利です。
内部テーブルと外部テーブルの選択は、主にデータの使用シナリオとライフサイクルによって決まります。データが一時的であり、Hive によってのみ使用される場合は、内部テーブルを選択できます。データが永続的で、複数のアプリケーションまたは Hive インスタンスで共有する必要がある場合は、外部テーブルを選択する必要があります。

4. Hive の hiveserver2 サービスとメタストア サービスを簡単に紹介します。

1.ハイブサーバー2

HiveServer2はリモートアクセスサービスを提供しており、
顧客はHiveServer2ミドルウェアにアクセスすることでHadoopクラスタにアクセスすることが
でき、HiveServer2のユーザー偽装機能により、HiveServer2のアクセスユーザーとHadoopのアクセスユーザーを同一にすることで、セキュリティの向上(権限分離)が可能となります。

2.metastore メタデータ アクセス インターフェイス

Hive と HiveServer2 にメタデータ アクセス インターフェイスを提供します。これは
2 つのタイプに分かれています
: 組み込み: Hive と HiveServer2 にのみサービスを提供できる組み込み Hive
独立サービス: 独立した MetaStore にアクセスしてメタデータ データベースにアクセスし、データはこのメタストアに保存されます。
ここに画像の説明を挿入します

答え 2

Hive のアーキテクチャでは、HiveServer2 と Metastore の 2 つの非常に重要なコンポーネントです。これらはそれぞれ、クライアント クエリ リクエストの処理と Hive メタデータの保存を担当します。
HiveServer2 は Hive によって提供されるサービス インターフェイスであり、ユーザーはこれを通じて HQL クエリやその他のコマンドを Hive に送信できます。HiveServer2 は、マルチユーザーの同時実行性と認証をサポートし、ログイン ユーザーおよびシミュレートされたユーザーの動的プロキシとして機能します。また、JDBC および ODBC へのインターフェイスも提供し、外部アプリケーションが Hive に接続できるようにします。たとえば、HiveServer2 を介して、Python、Java、C++、その他のアプリケーションや視覚化ツールから Hive データをクエリできます。
Metastore は、Hive がメタデータにアクセスするためのサービスです。Hive のメタデータには、テーブルの名前、列の名前と型、テーブルのパーティション、テーブルの保存場所、その他の情報が含まれます。テーブルの作成、テーブルのクエリ、テーブルの変更などのすべての Hive 操作では、メタストアを通じてメタデータを取得または更新する必要があります。Metastore は、同じ HiveServer2 プロセスにデプロイすることも、複数の Hive インスタンスで共有するための独立したサービスとしてデプロイすることもできます。
全体として、これら 2 つのサービスは Hive アーキテクチャの重要な部分であり、Hive の機能とパフォーマンスを保証します。HiveServer2 はユーザーに Hive にアクセスするためのインターフェイスを提供し、Metastore は Hive にメタデータ管理機能を提供します。

5. Hive の並べ替えシナリオとその実装方法について話しましょう。

1. グローバルソートによる順序、分割せずに大きなテーブルをソート
2. ローカルソートによるソート、リージョン内でのソート
3. 分散 このソートは実際のソートではなく、マップパーティションルールであり、パーティションの残りはハッシュに基づく領域の数

答え 2

Hive では、主に order by、sort by、distributed by の 3 つの方法で並べ替えを行うことができます。これら 3 つの方法は、ソート結果とパフォーマンスが異なります。
order by これは最も単純な並べ替え方法であり、すべての入力データをグローバルに並べ替えます。order by が実行されると、並べ替え用に別の Reducer が生成されます。つまり、すべてのデータをこの Reducer に送信してから、Reducer 上で並べ替える必要があります。このプロセスは多くの時間とコンピューティング リソースを消費するため、ORDER BY は小さなデータ セットの並べ替えには適していますが、大きなデータ セットの並べ替えにはパフォーマンスが低下する可能性があります。
sort by は、各 Reducer のデータを個別にソートし、結果を Reducer の順序で出力します。sort by は複数の Reducer を並行して並べ替えることができるため、order by よりもパフォーマンスが高くなります。ただし、sort by はグローバル ソートの結果を保証できません。保証できるのは、各 Reducer によって出力されたファイルが内部的に順序付けされていることと、sort by の実行中に各 Reducer に入力されるデータがランダムであることだけです。
distribution by は並べ替えを直接実行しませんが、MapReduce タスクでのデータの分散を決定します。distribution by は、指定された列に基づいてデータを異なる Reducer に分散し、同じキー値が同じ Reducer に確実に分散されるようにします。通常、より良い並べ替え効果を得るには、distributed by を sort by と一緒に使用します。

6. 6. Hive でパーティション テーブルを作成する方法と、パーティション テーブルを使用する利点について簡単に説明します。

1. パーティション テーブルの作成: キーワードによるパーティションと関連するパーティション フィールドを組み合わせてパーティション テーブルを作成します
2. パーティション テーブルの利点:
まず、パーティション テーブルとは何かを明確にしましょう。パーティションテーブルは特定のフィールドに従ってテーブルを分割します。これは実際には MapReduce パーティショニングと何ら変わりません。大きなデータ全体を多数の小さなデータに分割します。
クエリと変更がより便利になり、パーティション フィールドに従って直接検索できるようになりました。

答え 2

Hive のパーティション テーブルは基本的に、テーブル データを HDFS のディレクトリに管理して、クエリ効率を向上させます。テーブルの作成時にパーティション テーブルを指定する必要があります。パーティション テーブルは、partitioned by キーワードとパーティション フィールドを組み合わせて作成されます。パーティション テーブルでは、複数レベルのパーティション テーブルを宣言できます。
パーティション分割テーブルの主な利点は、クエリ効率の向上、ストレージ コストの削減、データ管理の容易化というおよそ 3 つの側面にあります。
データをクエリするとき、クエリ条件にパーティション列が含まれている場合、Hive はテーブル全体のデータを読み取るのではなく、条件を満たすパーティションのデータのみを読み取る必要があります。これにより、クエリ効率が大幅に向上します。
ストレージコストを削減するために、パーティションごとに異なるストレージ形式と圧縮アルゴリズムを設定できます。たとえば、履歴データの場合は、より高い圧縮率を選択してストレージ領域を節約できます。
パーティショニングを使用すると、データをより簡単に管理できるようになります。たとえば、他のパーティションに影響を与えることなく、パーティション内のデータを個別に削除またはアーカイブできます。
テーブルをパーティション分割する利点は明らかですが、過度のパーティション分割はメタデータ管理コストを増加させ、クエリのパフォーマンスに影響を与える可能性があります。したがって、パーティションを設計するときは、テーブル サイズ、クエリ モード、データ ライフ サイクルなどの要素を考慮する必要があります。

7. パーティション テーブルにデータをロードするにはどのような方法がありますか?

ここで区別する必要があるのは、パーティション テーブルには 2 つのタイプがあり、1 つは静的パーティショニング、もう 1 つは動的パーティショニングです。

  • 動的パーティショニングの主な目的は、大きなテーブルを多数の小さなテーブルに最適化することですが、このとき、大きなテーブルはすでに存在しており、それを分割するだけであるという前提に注意してください。したがって、ロードとは、テーブル全体のデータをパーティション テーブルに挿入することを意味します。
  • 静的パーティションは作成時のテーブルであるため、ロードまたは挿入のいずれかから取得できます。

答え 2

Hive では、データのロードとパーティションの作成には、静的パーティション化と動的パーティション化という 2 つの主なシナリオがあります。静的パーティションの
データ読み込みシナリオでは、load または insert を使用できますが、データをロードするときはパーティション フィールドに注意する必要があります。値も割り当てる必要があります。パーティション フィールドに値を割り当てることは、実際にはパーティションを作成するプロセスです。このプロセスでは、値を手動で割り当てる必要があります。
動的パーティションのデータ読み込みシナリオでは、パーティション テーブルにデータを挿入し、特定のクエリ結果に基づいてパーティションを自動的に作成できます。このシナリオでは、パーティション フィールドがクエリ対象のテーブルから取得される必要があり、パーティション テーブル全体のデータもクエリ対象のテーブルから取得される必要があることに注意してください。

8. パーティション テーブルを使用する場合、どのような問題に注意する必要がありますか? 定義するパーティションの数は多いほど良いのですか?

Hive パーティション テーブルを使用する場合は、いくつかの重要な考慮事項があります。

パーティションの数: パーティションを増やすとクエリの効率が向上しますが、過度のパーティション分割はメタデータ管理のコストを増加させ、クエリのパフォーマンスに影響を与える可能性があります。Hive のメタデータはメタデータ ストアに保存されます。パーティションが多すぎると、メタデータ ストアが過負荷になり、パフォーマンスのボトルネックが発生する可能性があります。一般に、テーブル内に数万を超えるパーティションを含めないことが最善です。

データ スキュー: パーティション キーの選択が不当である場合、データ スキュー、つまり一部のパーティションのデータ量が他のパーティションのデータ量よりも大幅に大きくなる可能性があります。データ スキューは、クエリのパフォーマンスとリソースの使用率に重大な影響を与える可能性があります。したがって、パーティション キーとしてデータを均等に分散できるキーを選択する必要があります。

パーティションのメンテナンス: 時間の経過とともに、新しいパーティションが追加されたり、古いパーティションが削除されたりすることがあります。定期的にアーカイブしたり、古いパーティションを削除して記憶域スペースを解放したりするなど、これらのパーティションを管理するための十分なリソースとポリシーがあることを確認する必要があります。

全体として、パーティショニングはクエリの効率とデータ管理の利便性を大幅に向上させる強力なツールです。ただし、データの偏りや過剰なパーティションの問題を避けるために、パーティション キーと番号を慎重に選択する必要もあります。同時に、パーティションを管理および維持するための十分なリソースと戦略も必要です。

9. Hive でバケット テーブルを作成する方法と、バケット テーブルはどのような状況で使用されますか?

Hive では、「バケット」に分割されたテーブル (バケット テーブルと呼ばれます) を作成できます。パーティション テーブルと同様に、バケット テーブルもきめ細かいデータ分離戦略です。バケットの数はテーブルの作成時に定義され、データが増加しても変更されません。
バケット テーブルを作成する構文は次のとおりです:
CREATE TABLE table_name (column1 type1, column2 type2,…)
CLUSTERED BY (column_name) INTO num_buckets BUCKETS;
たとえば、注文テーブルがある場合、注文に基づいてバケット化できます。作成ステートメントは次のとおりです:
CREATE TABLE 注文 (order_id INT, product_id INT, Price FLOAT)
CLUSTERED BY (order_id) INTO 64 BUCKETS;
この例では、すべての注文が order_id 列の値に基づいて 64 個のバケットに分割されます。 。各バケットは HDFS ファイルに対応し、同じ order_id 値を持つ注文は同じバケットに配置されます。

では、バケット テーブルはどのような状況で使用されるのでしょうか?

データ スキューの問題: データ スキューは、ビッグ データ処理における一般的な問題です。データ スキューとは、一部のキー値のデータ量が他のキー値のデータ量よりもはるかに大きいことを意味し、リソース使用率が不均一になる可能性があります。バケット化により、データをさまざまなバケットにより均等に分散できるため、データの偏りの問題を軽減できます。

特定の種類のクエリの最適化: たとえば、結合操作の場合、両方のテーブルが結合列に従ってバケット化され、バケットの数が同じ場合、Hive は各バケットで個別に結合を実行できるため、複数のバケットを並行して処理できます。クエリ効率。

サンプリング クエリ: Hive は、1 つ以上のバケットからのみデータを読み取ることができるバケット ベースのサンプリング メカニズムを提供します。これは、大規模なデータ セットの迅速な探索やデバッグに役立ちます。

ただし、バケット化にはより高度な設計と管理が必要であり、すべての状況に適しているわけではないことに注意してください。さらに、バケット化はパーティショニングを置き換えることはできません。パーティショニングとバケット化には、データ管理とクエリの最適化においてそれぞれ利点があり、通常は一緒に使用されます。

10 バケットとパーティションの違い

バケット化で制御できるのはバケットとそれに応じたカラムの数のみであり、割り当てルールはMapで決定されますが、パーティショニングは
より詳細であり、数を指定しません。
バケット結合は大きなテーブルの MapJoin をサポートしますが、パーティショニングはサポートしません。

11. よく使用される単一行関数のリスト

Round
rand
ceil Floor
substring
current_date
date
datediff date_add

12. Hive で行から列、列から行を実装するというアイデアと、上記 2 つの要件を達成するために一般的にどのような関数が使用されるかを説明します。

行から列へ:collect_Set/collect_list

列から行へ: 爆発

行から列へ: Hive では、行から列へは通常、collect_set やcollect_list などの集計関数を使用します。これらの関数は、特定の列の複数の行の値をセットまたはリストに集約します。たとえば、ユーザー ID とユーザーが購入したアイテムを含むテーブルがある場合、次のようなクエリを使用して、各ユーザーが購入したすべてのアイテムをリストに集約できます

これにより、各行がユーザー ID に対応し、製品列にユーザーが購入したすべての製品のリストが含まれる新しいテーブルが生成され、行から列への変換が実現されます。

列から行: Hive では、通常、列から行には展開関数が使用されます。配列またはマップ タイプのデータの列がある場合、explode 関数を使用してそれを複数の行に展開できます。たとえば、ユーザー ID とユーザーが購入した製品のリストを含むテーブルがある場合、次のようなクエリを使用して製品リストを複数の行に展開できます: SELECT user_id,explode(product_list) as productFROM Purchases; これ
により
、ユーザーごと、商品ごとにクエリを実行して行を生成、つまり商品リストを複数の行に展開し、列から行への変換を実現します。ただし、列を行に変換した後で元のテーブルのデータと対応させたい場合は、側面ビューを組み合わせてプロファイリングを完了する必要があります。

13. ウィンドウ処理機能をどのように理解していますか? ウィンドウ処理の本質を要約してください。

ウィンドウの開きを観察し、まず次の集合関数グループの違いを確認します。

集計関数: group by はテーブル構造を変更することでテーブルの内容を変更します
ウィンドウ関数: orderby によるパーティション分割などにより、特定のウィンドウ内のデータを計算するためにテーブル構造を変更する必要はありません。ウィンドウ処理は、集計の拡張バージョンです。
テーブル構造を変更することなく、元のテーブルに対して直接集計操作が実行され、各行が結果を取得することで集計結果が得られます。

  • 1. テーブル構造集計は、テーブル構造を直接変更して集計 (1 対多) を実現しますが、ウィンドウ処理はテーブル構造を変更せず、元のテーブルに基づいて直接動作します。
  • 2. 結果が集計された後、グループ化に参加していない列は、集計関数とウィンドウ化されたパーティションバイとパーティションによってのみ表現できます。

ウィンドウ関数は、通常の集計クエリよりも複雑なデータ分析タスクを処理するために使用される SQL の一部です。ウィンドウ関数が計算を実行するとき、入力行ごとに「ウィンドウ」が定義され、このウィンドウ内の一連の行がこの行の関数計算の基礎となります。
ウィンドウ関数の実行は 3 つのステップに分けることができます。
パーティション化: まず、すべての行が PARTITION BY 句に従ってパーティション化され、同じ PARTITION BY 式値を持つ行は同じパーティションに属します。

並べ替え: 各パーティション内の行は、ORDER BY 句に従って並べ替えられます。

ウィンドウの定義: 最後に、行ごとに、ウィンドウが配置されているパーティション内でウィンドウが定義されます。このウィンドウは ROWS または RANGE 句によって定義され、このウィンドウ内の行は、この行のウィンドウ関数の計算の基礎となります。

ウィンドウ関数の利点は、集計操作 (合計、カウント、最大値/最小値の検索など) を実行するものの、通常の集計関数のように複数の行を 1 つの行に集計するのではなく、代わりに結果が返されることです。入力された各行。これにより、詳細な情報を保持したまま集計分析を行うことができます。
たとえば、ウィンドウ関数を使用して各ユーザーの購入合計を計算し、それを他のユーザーの購入合計と比較して、最も多く購入したユーザーを見つけることができます。この例では、各行 (つまり、各ユーザー) のウィンドウはそのユーザーによるすべての購入で構成され、ウィンドウ関数はウィンドウ内の購入の総数を計算するために使用される合計関数です。
一般に、ウィンドウ関数の本質は、行ごとに「ウィンドウ」 (つまり、関連する行のグループ) を定義し、このウィンドウで集計計算を実行し、各行の結果を返すことです。 。

おすすめ

転載: blog.csdn.net/qq_42265608/article/details/132458869