前回は主にリレーショナルデータベースSQLの最適化について紹介しましたが、今回は誰もがよく使うHIVE SQLをベースにSQLの実行速度を最適化する方法を紹介します。
このシェアリングのロジックと順序は以下の通りです:
HIVE SQL最適化のコア
データの傾き
私たちは皆、ビッグデータの核心の一つは大量のデータであることを知っているので、大量のデータはビッグデータ自体の課題ではなく、そうでなければ、それはビッグデータと呼ばれることはありません。ビッグデータはデータの傾きを最も恐れている、いわゆる傾きは、すべてのタスクは、ビッグデータの大きな利点が発揮できないように、この性質に行くためにノードに入れられることです。下の全体像を考えて、プロセッサの束を見て、実際の作業は1つだけです。
なぜデータは歪んでいるのでしょうか?ビッグデータへの暴露は、ビッグデータのタスクの実行は、通常、フェーズで実行されることを知って、実行の前の段階は、中間結果を生成するために、次の段階では、実行の前の段階の結果をプルするために、ビッグデータは、マルチタスク並列分散されているので、どのように各タスクは、彼らが必要とするデータの独自のシェアをプルするのですか?これは通常、ハッシュアルゴリズムを使用し、このアルゴリズムでは、データのキー(ハッシュのグループ化は、ジャンに依存する)分布は、ノードに大量のデータになり、別のノードにはほとんどデータが不均一である場合。また、自然の不公平な分布は、計算時間の矛盾を引き起こす、いくつかの点のデータはすぐに終了しますが、最終的な出力の実装を完了するには、より多くのノードのデータの割り当てまで待つ必要があります。これは、データのスキューの一般的な説明です。
データ量の削減
ビッグデータは、大量のデータを恐れていないと言われていますが、ビューの最適化の観点では、データの計算に不要な参加を減らすことができれば、まだ大きな意義があります。データ量を削減する2つの方法で最適化することができます、最初のディスクIOを減らすために、特に一時的な計算結果の途中のMRコンピューティングフレームワークのためにディスクに書き込まれる、ディスクの速度はメモリよりもはるかに遅いです。第二に、データの量を減らすために、また、ネットワークIOを減らすことができる、ビッグデータは、ネットワークカードを介して必要な異なるノード間のデータの交換をクラスタ展開されていることを知って、ネットワークカードは、ディスクに比べて低速の多くを持っています。したがって、上記の2つの側面からだけでは、データの量を減らすために最適化にも不可欠です。
二次元の最適化について
HIVE SQL書き込みレベルでの最適化
1 As:
2,: パーティション分割されたテーブルの場合、必要なパーティションのみを選択します。例えば
最適化前: select * from student ;
最適化: select name,age,sex from student where dt=$dt;
これは、hiveのパーティション化されたテーブルはhdfs上のディレクトリ単位で保存されるため、パーティションを指定すると、hiveは特定のディレクトリにのみアクセスすることになり、読み込むデータ量を減らすことができます。
3:
4,、述語のプッシュダウンは、不要なデータをフィルタリングする前に、どこの条件フロントです。例えば
5、、マルチテーブルが最前線に書かれた小さなテーブルは、テーブルの関連付けのために同じキーを使用することが可能な限り満たすために関連付けられた条件を結合します。たとえば、関連付けの条件が満たされている場合は、各テーブルを関連付けるために同じキーを使用してみてください:
左結合
dim_city都市
on t1.city_id=t2.id
左結合
オーダーt2
on t1.id=t2.city_id
注:MRは実行中にデフォルトで最初のテーブルをメモリにロードし、次のテーブルと1つずつマッチングします。データ量の多い最初のテーブルがメモリにロードされるとOOMの危険性があるので、複数テーブルの相関の場合はデータ量の多いテーブルを左端に書き、どのテーブルのデータ量が少ないかを明確に把握することをお勧めします。
6.その他の注意点
1、変換のためのキャストの使用と矛盾して、関連する健康のデータ型が一貫していることを保証するために結合します;
2、健康なヌル値の関連付けが多い場合は、ヌル値の優先順位をフィルタリング結合;キーの値があまりにも乱数の最初の使用上の集中を分割し、対処する場合。
3.直積の使用は避けてください。
HIVE パラメータ構成の最適化
1、パラメータ構成によってグループ、グループ簡単なデータデータの傾きは、マップ内のプレ重合を開くことに加えて、順番に実装の速度を向上させる処理するデータ量の削減エンドを減らすことができます。具体的な構成は次のとおりです:
hive.map.aggr;--マップ側での事前集約を有効にします。
hive.groupby.skewindata;-データが歪んでいるときに動作します。原理は、2つのmrジョブを開始し、前者のジョブは、異なるreducersにランダムに割り当てられたランダムな分割を担当します。
2.およびサブバケットの結合は以下の通り:
3は、マップの数を調整し、一般的な原則を調整する:入力ファイルは、大きなファイルの数が少ない場合は、マッパーの数を減らす;入力ファイルは、非小さいファイルの数が多い場合は、マッパーの数を増やす;小さなファイルの最初の合併のファイルの数が多い場合。具体的な設定は次のとおりです:
mapred.min.split.size; --min.split.size
mapred.max.split.size; -- 最大分割サイズ
mapred.map.tasks;--マップタスクのタスク数を設定します。
マップタスクの数はこのルール、 map_num = MIN(split_num, MAX(default_num, mapred.map.tasks))、つまりスライス数と設定されたマップタスク数に基づいた最小値に従って計算されることを強調しておく必要があります。を増やせば分割数は減ります。マッパーの数を増やしたい場合は、mapred.min.split.size を減らすだけでなく、mapred.map.task を増やします。
4は、これは有利と有害なパラメータは、一般的に言えば、reducerの数を増やすと、実行速度を向上させることができますが、小さなファイルの数が多い増加し、あまりにも多くの小さなファイルは、マップの実行速度に影響を与えます。具体的なパラメータは次のとおりです:
5、構成は以下の通り:
6.:圧縮はデータ量を減らし、ディスクとネットワークのIOを減らします:
7.並列モデルは主にuoion操作向けで、ローカルモードは主にデータ量の少ないSQLや複雑でない操作向けです。具体的な構成は以下の通りです:
8は、ハイブのデフォルトのストレージ形式は、TextFileですが、このファイル形式は、圧縮を使用していない、それは大きなスペースを占有する、ストレージ形式SequenceFile、RCFile、Avro、ORC、Parquetの現在のサポートは、これらのストレージ形式は、基本的に圧縮され、列型のストレージは、これらのフォーマットを使用して、ファイルを直接インポートすることはできません。ストレージ形式の設定は、通常、テーブルを構築するときに指定されるような:
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
orcのみの保存形式を指定
9は、厳格なモードは、主にクラスタの圧力によって引き起こされるユーザーの不規則な操作を防止するために大きすぎる、あるいは利用できない、唯一の3つのケースの周り、それぞれ、クエリのパーティションテーブルが指定されていないパーティションです。具体的な構成は次のとおりです:
hive.mapred.mode=strict;--厳密モードを有効にします。




