1.一般的なシナリオでのHivesqlの最適化
1.列のトリミング
データウェアハウスの下部ストレージのほとんどは、ORC / PARQUETなどの列ストレージを採用しているため、列クリッピングを使用してスキャンされるフィールドを減らすことができます。
2.パーティションのトリミング
つまり、データテーブルをクエリするときにパーティション条件を追加します。データウェアハウスは通常、グループレベルのデータストレージであり、データ量が非常に多いため、ほとんどのデータウェアハウスはパーティションを使用してデータ統計の効率を高めます。そのため、パーティションの調整が不可欠です。
フィルタリングが早ければ早いほど、ダウンストリームで処理されるデータの量を減らすのに適しています。
データフィルタリング
関連する2つのテーブルのデータを減らします
select t1.dim1,t1.measure1,t2.measure2 from (select dim1,measure1 from a where dt = '2019-01-01') t1 join (select dim1,measure2 from b where dt = '2019-01-01') t2 on t1.dim1 = t2.dim1
重複排除の最適化
重複を削除するためにdistinctを使用することは一般に禁止されています。ただし、データの量が非常に少なく、単一のサーバーを使用して重複を削除でき、プレッシャーなしで使用できる場合を除きます。Group byを使用すると、大規模な時計のシナリオで重複を取り除くことができます
Sort byは、特定のフィールドに従って結果をグローバルに並べ替えるためにorder by order byを置き換えます。これにより、すべてのマップ側データがレデューサー
ortに入力され、状況に応じて並べ替えるために複数のレデューサーが開始され、それぞれが確実になります。レデューサーにはローカル
がありますマップ側データのレデューサーに割り当てられたキーを制御するために、それは多くの場合、配布元と組み合わせて使用されます。
配布方法を追加しない場合、マップ側のデータはランダムにレデューサーに配布されます。
前に小さな時計、後ろに大きな時計
削減フェーズでは、結合演算子の左側のテーブルがメモリにロードされ、操作効率を向上させることができます。
マップ結合を使用する
https://mp.csdn.net/editor/html/113359842を参照してください。
マップ結合は、大小のテーブル結合および等しくない値の関連付けに特に適しています。Hiveは、マップ側でビルドテーブルとプローブテーブルの結合プロセスを直接完了し、
reduceを排除し、効率が非常に高くなります。set hive.auto.convert.join = true; // MapJoin最適化を自動的にオンに
設定し、デフォルトではオンに設定しますset hive.mapjoin.smalltable.filesize = 25000000 //小さなテーブルがのサイズを超えないように設定します25Mであるオープンmapjoin最適化#
続き行查询select t1.a、t1.b
from table t1
join table2 t2
on(t1.a = t2.a and f.ftime = 20110802)
2.データ傾斜下でのSQL最適化
1)nullまたは無意味な値の
ファクトテーブルがログデータの場合、記録されない項目が多いことがあります。状況に応じてnullに設定します。
不足している項目が多い場合は、これらのnull値が追加されます。参加を行うとき非常に集中し、進行が遅くなります。
nullデータが必要ない場合は、事前にwhereステートメントを記述してフィルターで除外します。
それを保持する必要がある場合は、nullキーをランダムに分割できます。たとえば、ユーザーIDがnullのレコードをランダムに負の値に変更します:
`` `sqlselect a.uid,a.event_type,b.nickname,b.age from ( select (case when uid is null then cast(rand()*-10240 as int) else uid end) as uid, event_type from calendar_record_log where pt_date >= 20190201 ) a left outer join ( select uid,nickname,age from user_info where status = 4 ) b on a.uid = b.uid;
2)さまざまなタイプの関連付けによって引き起こされるデータの偏り
結合の2つの主要なデータ型が異なる場合は、同じ型に変換する必要があります。これは、デフォルトのハッシュがint型に従ってreduceに送信され、非int型のすべてのレコードが発生するためです。 1つのreduceに送信されます。
3)関連付けられたキーの特定の値についてより多くのデータがあります
乱数集計方法の結合に使用できます
select key,sum(pv) as pv from ( select key,round(rand()*1000) as rnd,sum(pv) as pv from a group by key,round(rand()*1000) ) t group by key
4)count(distinct)はデータスキューを生成します
select count(distinct user_id) from a 可替换为 select count(1) from(select user_id from a group by user_id) t
ハイブの最適化
Hiveの最適化
マップまたはリデュースタスクの起動および初期化時間は、ロジック処理時間よりもはるかに長く、リソースの浪費が多く発生します。マップステージの最適化
により、単一のマップタスクで適切な量のデータを処理できます。マップパラメータ設定
mapred.min.split.size:データの最小分割単位。minのデフォルト値は1KBです。
mapred.max.split.size:データの最大分割単位。maxのデフォルト値は256Mです。
maxを調整することでマップの数を調整でき、maxを減らすとマップの数を増やすことができ、minを増やすとマップの数を減らすことができます。マップのセグメンテーション
入力ディレクトリに780Mのサイズのファイルaがあるとする
と、マップのデフォルトパラメータはaを7つのブロック(6128Mと112M)に分割し、7つのマップになります。入力ディレクトリにそれぞれ10M、20M、130Mのサイズの3つのファイルa、b、cがあるとすると
、hadoopはファイルを4つのブロック(10M、20M、128M、2M)に分割して、4つのマップ番号を生成します。 。解決策
次の方法を使用して、マップの実行前に小さなファイルをマージし、マップの数を減らします
。setmapred.max.split.size = 128000000; //分割できる最大ブロックサイズ
setmapred.min.split.size.per .node = 100000000; //各ノード
セットによって処理される最小分割mapred.min.split.size.per.rack = 100000000; //各ラックによって処理される最小分割
***最初の3つのパラメーターはサイズを決定します結合されたファイルブロックファイルブロックサイズが
128mより大きい場合、128mで区切られます。128mより小さい場合、100mで分離されます。100mより小さいもの(小さいファイルと分離された大きいファイルを含む)が
結合されます。。set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; //ファイルを結合する
***このパラメーターは、実行前に小さなファイルをマージすることを意味します。削減段階
では、削減設定が大きすぎると、多数の小さなファイルが生成されます
。hive.exec.reducers.bytes.per.reducer(各削減タスクによって処理されるデータの量。デフォルトは1000 ^ 3です。 = 1G)
hive.exec。reducers.max(各タスクのレデューサーの最大数。デフォルトは999)小さいファイル
をマージするマップ出力ファイルをマージするかどうか:hive.merge.mapfiles = true(デフォルト値はtrue)
マージするかどうか出力ファイルを減らす:hive.merge.mapredfiles = false(デフォルト値はfalse)
マージされるファイルのサイズ:hive .merge .size.per.task = 25610001000(デフォルト値は256000000)