HiveSqlの原理の分析、mysqlとの違い

HiveSqlの原理分析

HiveSQLの最下層は、デフォルトでMRプログラムに基づいて実行されます。HiveSQLの動作原理を分析する前に、SQL操作を実装するためのMRプログラムの基本原理を見てみましょう。

基本的なSQL操作を実装するMapReduceの原則

MRへの参加の実現原理

注文からu.name、o.orderidを選択oユーザーuに参加o ouid = u.uid;
異なるテーブルのデータをマップの出力値でマークし、reduceステージのタグに従ってデータソースを判断します。MapReduceのプロセスは次のとおりです。
ここに画像の説明を挿入

MRでのグループバイの実現原理

ランク、isonlineによって都市グループからランク、isonline、カウント(*)を選択し、
GroupByフィールドをマップの出力キー値に結合し、MapReduceソートを使用し、LastKeyをreduceステージに保存してさまざまなキー区別します。MapReduceのプロセスは次のとおりです(もちろん、これは、Reduce側の非ハッシュ集約プロセスを説明するためだけのものです)。
ここに画像の説明を挿入

MRでの明確な実現原理

Dealidを選択し、dealidによって注文グループから(個別のuid)数を数えます。
別個のフィールドが1つしかない場合、MapステージでHash GroupByを考慮しない場合、mapreduce ソートを使用して、GroupByフィールドとDistinctフィールドをマップ出力キーに結合するだけです。同時に、GroupByフィールドを削減キーとして使用し、LastKeyを削減フェーズで保存して、重複排除を完了します。次のSQLなどの
ここに画像の説明を挿入
個別のフィールドが複数ある場合
取引グループを選択して、取引IDごとに注文グループからカウント(個別のuid)、カウント(個別の日付)を選択します。
実装には2つの方法があります。

  • 1)上記の個別フィールドの方法、つまり下の図に示す実装に従う場合は、uidと日付に従って個別にソートすることはできず、LastKeyによる重複排除はできません。それでも、reduceフェーズ中にメモリ内のハッシュによる重複排除を行う必要があります。
    ここに画像の説明を挿入
  • 2)2番目の実装では、すべての個別のフィールドに番号を付けることができます。データの各行はn行のデータを生成し、同じフィールドが個別にソートされます。この場合、重複を削除するために、削減フェーズ中にLastKeyのみを記録する必要があります。
    この実装はMapReduceの並べ替えをうまく利用して、reduceフェーズでの重複排除のメモリ消費を節約しますが、欠点はシャッフルデータの量が増えることです。
    リデュース値を生成するとき、他の個別のデータ行の値フィールドは、最初の個別のフィールドが配置されている行を除いて、空である可能性があることに注意してください。
    ここに画像の説明を挿入
SQLをMapReduceに変換するプロセス

SQLを実装するためのMapReduceの基本的な操作を理解した後、HiveがSQLをMapReduceタスクに変換する方法を見てみましょう。コンパイルプロセス全体は6つの段階に分かれています。

  • Antlrは、SQL文法規則を定義し、SQL字句解析、文法分析を完了し、SQLを抽象構文ツリーASTツリーに変換します
  • ASTツリーをトラバースして、基本的なクエリユニットQueryBlockを抽象化します。
  • 操作ツリーOperatorTreeに変換されたQueryBlockをトラバースします
  • 論理レイヤーオプティマイザーは、OperatorTree変換を実行し、不要なReduceSinkOperatorをマージし、シャッフルデータの量を削減します
  • OperatorTreeをトラバースし、MapReduceタスクに変換します
  • 物理層オプティマイザはMapReduceタスクを変換して、最終的な実行計画を生成します

MapReduceへのSQL変換のプロセスを詳細に説明するために、例として単純なSQLを示します。SQLにはサブクエリが含まれ、最後にデータがテーブルに書き込まれます

FROM
(
  SELECT
    p.datekey datekey,
    p.userid userid,
    c.clienttype
  FROM
    detail.usersequence_client c
    JOIN fact.orderpayment p ON p.orderid = c.orderid
    JOIN default.user du ON du.userid = p.userid
  WHERE p.datekey = 20131118
) base
INSERT OVERWRITE TABLE `test`.`customer_kpi`
SELECT
  base.datekey,
  base.clienttype,
  count(distinct base.userid) buyer_count
GROUP BY  base.datekey, base.clienttype

SQLで生成されたASTツリー
最終的に生成されたASTツリーを下の図の右側に示します(Antlr Worksを使用して生成され、Antlr WorksはAntlrが提供する文法ファイルを作成するためのエディターです)図はスケルトンのいくつかのノードのみを展開し、完全には展開していません。
サブクエリ1/2は、右側の最初の2つの部分に対応しています。
ここに画像の説明を挿入
ここで、内部サブクエリもTOK_DESTINATIONノードを生成することに注意してください。上記のSelectStatementの文法規則を参照してください。このノードは、特に文法の書き換えで追加されたノードです。その理由は、HiveでクエリされたすべてのデータHDFS一時ファイルに格納されるためです。中間サブクエリでも、クエリの最終結果でも、Insertステートメントは最終的に、テーブルが配置されているHDFSディレクトリにデータを書き込みます。

Hiveとmysqlの違い

類似点

HiveはSQLに似たクエリ言語HQL(hiveクエリ言語)を使用しています。動作言語は似ており、テーブルの作成、データベースの作成、基本的なチェックの追加、削除、変更を行います。
それ以外は基本的に類似点はありません。

違い

hqlの同様の構文に加えて、カーネル、ストレージの場所、それを更新できるかどうか、インデックスがあるかどうか、実行遅延、スケーラビリティ、およびデータサイズが異なります。

  • Hiveはデータウェアハウス用に設計されています。
  • 保存場所:HiveはHadoop上にあり、Mysqlはデバイスまたはローカルシステムにデータを保存します
  • データの更新:Hiveはデータの再書き込みと追加をサポートしていません。ロード時に決定されます。データベースはCRUDにすることができます
  • インデックス:インデックスなしのハイブ、毎回すべてのデータをスキャン、最下層はMR、並列計算、大量のデータに適しています; MySQLにはオンラインクエリデータに適したインデックスがあります
  • 実行:Hiveの最下層はMapReduce、MySQLの最下層は実行エンジンです。
  • スケーラビリティ:Hive:大量のデータ、スケーラビリティは非常に優れています; MySQL:比較的少ない
    ため、Mysqlはオンラインビジネスを実行でき、Hiveはオフライン分析ビジネスしか実行できません

参照:https://www.cnblogs.com/csguo/p/7553022.html

元の記事を9件公開 賞賛0件 訪問62件

おすすめ

転載: blog.csdn.net/yangbllove/article/details/105569900