ビッグデータインタビューシリーズ--Hive

ハイブは、Hadoopの中に構造化されたデータを処理するデータウェアハウス・ツール・ベースであります

従来のデータベースとの間の差1.Hive
ハイブは、すべてのデータがHDFSに格納されているHadoopの、ハイブの上に構築されている:1、データ格納場所。そして、データベースのデータは、ブロック・デバイスまたはローカル・ファイル・システムに格納することができます。
図2に示すように、データ・フォーマット:カラム区切り線セパレータ、及びファイルデータを読み出すための方法であって、定義されていないハイブ特定のデータフォーマットは、3つのプロパティを指定するために、ユーザによって指定されました。データベースのストレージエンジンは、独自のデータフォーマットを定義します。すべてのデータは、特定の組織に応じて保存されます。
図3に示すように、データの更新は:ハイブ含有量が読み書きされ、従って、データの書き換えや削除をサポートしていない、ロード時にデータが決定します。データベース内のデータは頻繁に変更する必要が通常です。
図4は、実行遅延:ハイブクエリデータ、表全体(またはパーティション)をスキャンする必要性、従ってだけ大きなデータの処理に高い遅延は唯一の利点です。実行小型、低レイテンシを処理するデータベースのデータ。
図5は、指数:ハイブいいえ、データベースが有する
ハイブは、MapReduceのあるデータベース執行:6実行
7、スケーラビリティ:高いハイブ、低データベース
8、データサイズ:ハイブ大小データベース

2.Hiveの内部と外側のテーブル間の違い
、データを削除する際に内部テーブルには、ハイブは、テーブルのメタデータに属しますとデータがすべて削除され、そして、ハイブだけで、外部表のメタデータを削除すると、外部テーブルを削除しますそれは削除されません。

3.Hiveパーティションテーブルとサブテーブルバレル差
:パーティション
HDFSサブディレクトリ機能の実現を使用してハイブパーティション。各サブディレクトリには、各列のパーティションとカラム名に対応する値が含まれている
ハイブを分割する:ハイブが実際HDFSの抽象的に格納されているので、ハイブは、ディレクトリ名にパーティション名相当する、サブパーティション名は、サブディレクトリ名であり、そしてではない実際のフィールド。
部品のキット:
分バケットテーブルは、テーブルまたはさらに表組織のパーティションテーブルに基づいて、部品の値キットを使用してハイブを使用し、
ハッシュ、番号及びハッシュ結果と浴槽を分割するためのモジュロ演算方法を行いますサブバレルは、各バケットがデータを持っていることを確実にするが、各バケット内のデータの数は、必ずしも等しくありません。

:3つの主な違いがあります
。1.パーティションテーブルの対応HDFS上のディレクトリに、サブバレルテーブルの対応HDFS上のファイルへは。
2.パーツのキットは、ランダムにデータベースを分割し、データベース・パーティションは、非ランダムスプリットです。スキューデータ原因容易に分割するパーティションに従って列値、バレルサブ分割ハッシュ関数の配列に応じて、比較的に平均されるからです。
3.別のファイル(きめ細かい)に対応する部品のキットは、対応するパーティションは別のフォルダ(粗粒)は、クエリ処理の槽は、よりきめ細かいレンジ分割データであり、タブ領域の得点より高い効率、より効率的なサンプリングを行います。

4.Hiveテーブルメタデータ記憶
それぞれハイブ素子支持三つの異なるストレージ・サーバ、埋め込まれたエレメントストレージサーバ、ローカルサーバ記憶素子、記憶素子、リモートサーバ、異なる構成パラメータを使用して、各ストレージ。
1.埋め込まれたメモリは、主にこのモードでは、ユニットテストエレメントのために使用される、唯一のプロセスは、記憶素子に接続されていてもよい、ダービーは、埋め込まれた要素に格納されたデフォルトのデータベースです。
2.ローカルモードでは、各クライアントハイブは、データストアへの接続を開き、接続上でSQLクエリを要求します。
遠隔のモードでは、すべてのハイブクライアントは、クライアントとサーバのメタデータとの間の通信に使用されるサーバー・メタデータ、メタデータサーバクエリー配列、リサイクルプロトコルへの接続を開きます。

順番に5.Hive、並べ替えによって、で配布することにより、クラスタ、
ので、唯一のリデューサー(より多くのリデューサーがグローバル順序を保証することはできません)、入力による注文が世界秩序を行いますが、唯一のリデューサー:によって1.order大きなの入力は、長い計算時間を消費するときに発生します。
2.sort:データのソートがソート順により、減速に入る前に完了したことを、世界的にソートされていないことにより、ソートは、各減速機の出力は、グローバルな順序を保証するものではないことを保証します。ソートデータのデータによってのみ指定したフィールドでの並べ替えを減らすことができます同じことを保証することができます。
制御側端を低減する地図データに分割される方法によって配布:によって3.distribute。ハイブは、後に、デフォルトのハッシュアルゴリズムを使用して、分散型の数を減らすために、対応する列で配布します。削減ソートそれぞれのファイルを生成することによってソート。いくつかのケースでは、特定の行は通常、後続の操作のために収集され、減速機べきに制御する必要があります。それを行うにはちょうどで配布しています。したがって、で配布し、ソートすることにより、多くの場合、一緒に使用。
4.cluster:機能に加えて、クラスタはまた、機能の両方によって分類する配布します。しかし、唯一のソートフラッシュバックソートのは、ASCまたはDESCの照合順序を指定することはできません。

最適化の約6ハイブ話
1.Fetch把持手段は、いくつかのケースのためのハイブのクエリは必ずしもMapReduceの計算を使用することはできません、hive.fetch.task.conversionデフォルトハイブ-default.xml.templateファイルに複数あり、古いバージョンハイブデフォルトプロパティは後でフィールド、限界値を見つける、グローバル検索では、より多くの修正されたので、MapReduceのを離れて見ていない、最小限です。
テーブルのサイズが参加すると2、左側に小さなテーブル、効果的にOOMを回避することができます。
3.MapJoin
条件を満たしていないか、MapJoin MapJoinを指定しない場合、パーサは、ハイブは、すなわち、操作に参加しましょう共通に変換されます:結合完了段階を減らします。データスキューが発生しやすいです。MapJoin小さなテーブルは、すべてのメモリマップにロードすることができる減速処理を回避するために、端部に加わる
開放MapJoinパラメータ:
(1)自動Mapjoin設定
SET = trueにhive.auto.convert.joinを、真デフォルト
(2)大きなテーブル閾値設定小さなテーブル(小さなテーブルと考えデフォルト25M):
セットhive.mapjoin.smalltable.filesize = 25000000;
によって4.Group
デフォルトも、ときにキーデータを減少させるために分散同じデータのキー位相地図とき、それは大きな傾きです。
いないすべての重合操作は、最後の削減という結論で最終結果を削減し、最終的に行う必要があり、重合操作の多くは、最初の部分的にマップの端で重合を行うことができます。
重合パラメーターの開放端、地図
Mapの重合終了するかどうか(1)、デフォルトはTrueです
=真hive.map.aggrに
エントリマップ端の重合数で動作する(2)
hive.groupby.mapaggr.checkinterval = 100000
(3)データ負荷が(デフォルトはfalse)をバランシングする際に傾斜している
hive.groupby.skewindata =真の
オプションがtrueに設定されている場合、結果のクエリプランは、2つのMRジョブを持っています。最初のMR求人、地図出力結果はランダムに各重合操作は、セクションを行う削減削減するために、分散して出力されますが、このプロセスの結果は、おそらく異なるに配布するグループ化キーと同じであるにおける削減その負荷分散の目的を達成するために、第2のMR求人その後、キーによるグループによる結果は(同じを削減するために配布されるキーによる同じグループを確保することができます。このプロセス)の分散を削減し、最終的には最終的に完全なデータを前処理重合操作。
5.Count(別個の)最適化
少量のデータが最適化される必要はなく、データの量が原因でカウント、特に大きい場合DISTINCT操作は、タスクを達成減らす必要が過大に対処すべきデータの量を減らして使用し、これは、全体の仕事を完了するために、一般的に、再びカウントところでDISTINCT GROUPをCOUNT最初は互換的に使用困難である原因になります。
6.フィルターはランク
のみ*選択使用しないように必要な取り出し:カラム処理
の必要性は、フィルタ条件、フロントで追加条件を追加するとき、二つのテーブルが参加すると:行を。
7.並列実行
ハイブ問合せは、一つまたは複数の段階に変換されます。この段階では、MapReduceのステージサンプリング位相、統合相、リミット舞台ことができます。またはプロセスハイブ実装の他の段階が必要になることがあります。デフォルトでは、ハイブのみ実行ステージに一度。しかし、特定のジョブがステージの数を含んでいてもよいし、これらの段階は、いくつかのステージが並列に実行することができ、その結果、全体のジョブの実行時間が短縮されていることを確認することができると言うことである、お互いに完全に依存しなくてもよいです。以上の段階を並列に実行することができますがある場合は、ジョブがより速く完了することができます。
パラメータを設定することにより、Hive.exec.parallelは、それが同時に開くことができ、本当です。パラレル位相増加でジョブただし、共有クラスタ内で、我々は次のことに注意を払う必要があり、その後、クラスター使用率が増加します。

set hive.exec.parallel=true;              //打开任务并行执行
set hive.exec.parallel.thread.number=16;  //同一个sql允许最大并行度,默认为8。

8.厳格モード
ハイブは、それは悪ではない意思に影響を与えた可能性があるクエリを実行するユーザーを防ぐことができ、strictモードを提供します。
厳密でモデルhive.mapred.modeの厳格でのデフォルトの属性値を設定することにより。strictモードをオンにすると、変更hive.mapred.modeが厳しい、厳格なモードを無効にすることができるクエリの3種類になっている必要があり。
1)パーティションテーブルについて、パーティションフィールド句を含むか、または許可されていないの範囲を限定するためのフィルタ条件を除きます。言い換えれば、ユーザーはすべてのパーティションをスキャンすることが許可されています。この制限の理由であることは、パーティションテーブルは通常、非常に大規模なデータセットを持っており、データが急速に増加していることです。いいえパーティションの制限クエリは、このテーブルに対処するために許容できないほど膨大なリソースを消費することはできません。
2)リミット文の使用を要求文により、クエリの順序のために。ソート処理を実行するためによる順序は同じリデューサーで処理されているすべての結果のデータに配布されるので、力のユーザーは、長い時間のために減速追加の実行を防ぐことができLIMIT文を増加させます。
3)クエリのデカルト積を制限します。非常文は、リレーショナルデータベース・オプティマイザが効率的にONステートメントWHERE句に変換することができ、実行場所のクエリが、用途の実装でON文のJOIN使用していないことを期待して、リレーショナル・データベース・ユーザーの理解。残念ながら、ハイブは、テーブルが十分に大きい場合は、クエリが手に負えない状況になり、そのため、この最適化を実行しません。
9.SQLの最適化

1.去除查询中不需要的column
2.Where条件判断等在TableScan阶段就进行过滤
3.利用Partition信息,只读取符合条件的Partition
4.Map端join,以大表作驱动,小表载入所有mapper内存中
5.调整Join顺序,确保以大表作为驱动表
6.对于数据分布不均衡的表Group by时,为避免数据集中到少数的reducer上,分成两个map-reduce阶段。
第一个阶段先用Distinct列进行shuffle,然后在reduce端部分聚合,减小数据规模,
第二个map-reduce阶段再按group-by列聚合。
7.在map端用hash进行部分聚合,减小reduce端数据处理规模。
公開された27元の記事 ウォンの賞賛9 ビュー20000 +

おすすめ

転載: blog.csdn.net/I_Demo/article/details/104277223