ハイブは、Hadoopの解析世代に対して実行できるのMapReduceツールの文字列のSQL構文に沿ったものです。SQLを設計する分散コンピューティングのいくつかの特性に応じてハイブを使用してみてください、そして、従来のリレーショナルデータベースが異なっており、
だから、既存のリレーショナル・データベースの下で開発された固有の思考の一部を除去する必要があります。
基本原則:
1:選択は唯一のフィールドを使用する必要がある、パーティションテーブルのパーティションに追加する、各段階のデータの量を減らす、できるだけ早くデータをフィルタリングするようにしてください
選択... Aから
Bに参加
A.key = B.keyに
どこA.userid> 10
そしてB.userid <10
そしてA.dt = '20120417'
そしてB.dt = '20120417';
それはのように書き換えることが必要です。
選択....から(選択....から
どこDT = '201200417'
そしてユーザーID> 10
)A
Bから....を選択します(参加
どこDT = '201200417'
そしてユーザーID <10
)B
a.key = b.keyに。
図2に示すように、ライブラリの過去の経験の計算(すなわち異なる目的に従った方法の使用を最適化すると言うことです)
歴史家の計算と使用、ゾーニング
3:複雑なロジックを回避することが可能とアトミック操作は、SQLが含まれています
あなたは中間の複雑な論理テーブルを用いて達成することができます
4 jion操作は(現在はTCL小さなテーブルの多くは加入の右側にあります)参加の左側にある小さなテーブルに注意を払う必要があります。
それ以外の場合は、ディスクとメモリを大量に消費するためにつながります
5:部品番号は、ステートメント、実際のテストプロセスへの挿入を複数に分割しなければならない2より大きい組合全てまたは各組合のデータの大部分である場合、50%の実行時間を改善することができます
テーブルのテーブル名のパーティションをoverwite挿入(DT = ....)
(.....から選択
選択... Aから
労働組合のすべて
選択... Bから
労働組合のすべて
選択... Cから
)R
どこ...;
それはのように書き換えることができます。
テーブルのテーブル名のパーティション(DT = ....)に挿入
選択.... Aから
WHERE ...;
テーブルのテーブル名のパーティション(DT = ....)に挿入
選択.... Bから
WHERE ...;
テーブルのテーブル名のパーティション(DT = ....)に挿入
選択.... Cから
WHERE ...;
5:グループ操作、参加があればSQLはまずデータの偏りがあるかどうかに注意を払う、データ自体の特性を理解しなければなりません書きます
データスキューが発生した場合は、次のように扱われるべきです。
hive.exec.reducers.max = 200を設定します。
セットmapred.reduce.tasks = 200; ---増加数が削減します
この分割されたキーに対応するグループのレコードの数がこの値を超えると、特定の値は、データの量に応じ - ; = 100000 hive.groupby.mapaggr.checkintervalを設定します
hive.groupby.skewindata = trueのセット; - 傾きをtrueに設定する必要がある場合の処理でグループが発生
hive.skewjoin.key = 100000セット; - スピンオフに参加するこの値を超えた。これは、キーに対応するレコードの数は、データ値が特定の量に応じて設定されます
真= hive.optimize.skewjoin設定; - 傾きをtrueに設定する必要がある場合に発生するプロセスに参加
(1) 仕事をしない、実行するジョブを完了するために、できるだけ多くのことを行うようにジョブを開始2
一般的には、先行タスクは、その後の再利用の複数のタスク、モデルのデザインは、良いモデルが特に重要と密接にこれにリンクされているように、一緒にやって一緒に行うことができ、わずかに開始することです。
(2) 合理的な設定の数を減らします
数は、実際にパワープレーのHadoopの並列コンピューティングを減らし、過度の数を減らし、小さなファイルの問題の数が多い、データの量、唯一のあなたが最高の知っているリソースは、妥協点を見つけることになりますない小さすぎます
(3) 別のジョブで同じ制御パラメータhive.exec.parallel SQLを同時に実行することができるかどうか、ジョブを並行性を向上させます
2、サーバはささいなことをやろうとゴール最小限のリソース消費に最適なパスを見てみましょう
例えば:
(1)結合の使用に注意してください
小さなテーブルマップが参加しているものを使用した場合、ハイブ参加ロード・テーブル・データ・メモリの前に注意を払うだろう、軽減または従来のを使用して参加し、小さなテーブルそれほど大きなテーブルは、従来のメモリリソースの消費量を削減します
(2)小さなファイルの問題に注意を払います
ハイブの2つの一般的なアプローチがあります
最初はCombinefileinputformatを使用することで、複数の小さいファイルはタスクマップの数を減らし、全体inputsplitとしてパッケージ化されています
mapred.max.split.size = 256000000を設定します。
設定mapred.min.split.size.per.node = 256000000
設定Mapred.min.split.size.per.rack = 256000000
設定hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
二番目のパラメータは、ハイブを設定して、追加のMR仕事を小型パッケージファイルを開始します
出力ファイルを削減マージするかどうかをhive.merge.mapredfiles = falseの場合、デフォルトはFalseです
hive.merge.size.per.task =マージファイルのサイズ256×1000×1000
(3)データが傾いていることに注意してください
ハイブより一般的なアプローチで
最初の2つのMRジョブ制御hive.groupby.skewindataを生成することにより= trueの場合、第1のMRジョブマップの出力は、いくつかのキーの個数を介して特定のキー値の過剰な数を減らすか、予め集計ビューを低減するために無作為傾きデータによって引き起こされる小さな問題
真= hive.map.aggr行って、第二の端に地図コンバイナ(デフォルトはtrueにある)マップは、データの実質的に異なる部分でない場合は、重合は、コンバイナを行うには意味がありませんが、中に考慮されるべき余分な、思慮深いハイブハイブパラメータ.groupby.mapaggr.checkinterval = 100000(デフォルト)hive.map.aggr.hash.min.reduction = 0.5(デフォルト)100,000プリフェッチされたデータ・アグリゲーション、番号の後/100000>0.5重合は、重合がもはや場合
(4)良い使用マルチ挿入、労働組合のすべて
適切なマルチソーススキャンテーブルの数を減らす、ジョブ番号変わらないので、唯一のソース・テーブルをスキャンする必要がある、別のテーブルを挿入異なる論理処理異なるサイズで同じソーステーブルに基づいてシーンを挿入
全ての組合と、計算によってスキャンテーブル、ジョブの数を減らすため、組合後にすべてのクエリロジックは、典型的には、異なる条件で異なる以前に生成され、次いで均一な基、複数の入力に対応する組合すべての異なるテーブル、同一の数を減らすことができ労働組合のすべてのテーブル、複数の出力一度かなりマップ
(5)パラメータのチューニング
例えばようなパラメータのクラスタ広範囲
提供されるスレッドのコピー数(高速マップため、大きな出力)を減少させる、そのようなJVMの再利用などの特定のジョブ固有のパラメータを設定してもよいです
タスクの数は、消費電力を削減するために、タスク初期化タスクの数を減らし、多くの、小さな、完了するために分未満のようなものである場合。あなたは、JVMの設定オプションを再利用することで、消費のタスクを減らすことができます