通常の作業では、ハイブを使用してビジネス上の問題に対処すると、必然的にデータスキューの問題が発生します。データスキューの本質は、キーの不均一な分散であり、割り当てられるデータの量に大きなギャップまたは小さなギャップが生じます。さまざまなレデューサー。データギャップが大きすぎると、データスキューが発生し、特定のリデュースの負担が大きくなりすぎて、タスクの完了が遅れます。
主な理由
1.不均一な鍵の配布。
2.マップ側のデータが歪んでいて、入力ファイルが多すぎて、サイズが均一ではありません。
3.リデュース側のデータが歪んでおり、パーティショナーに問題があります。
4.ビジネスデータ自体の特性。
解決
1.ハイブのパラメーター
を次のように調整します。
set hive.map.aggr=true;
set hive.groupby.skewindata=true;
パラメータhive.map.aggr = TRUEを設定するために使用される部分集合上のマップに相当する側、コンバイナ
場合hive.groupby.skewindata = TRUE。このパラメータに設定されている真二MRジョブが時にデータスキュー生成されます生じる。第一MRジョブが最初であろうランダムに配布鍵を、そして別に配布減らすように均等にできるだけ。で各減らす、データが部分的に集約され、その後、データを処理する第二によってMRジョブ。このとき、データはすでに存在します結果データを部分的に集約した後、同じキーのデータを1つのリデュースに分割します。このとき、キー処理による統合グループは基本的に特定のリデュースの発生を回避します。
2.マップを最適化し、次のように削減
します。
set hive.merge.mapfiles=true;
set hive.mapred.map.tasks=number;
set hive.merge.mapfiles = trueは、非常に多くの小さなファイルを処理するために使用されます。これにより、マップに大きな負荷がかかります。このパラメーターを使用して小さなファイルをマージするか、このコマンドを使用できます。sethive.mapred.map.tasks =マッパーの数を調整するための数値、およびマップ側の圧力を均等に分割するための複数のマッパー。
set hive.mapred.reduce.tasks=number;
set hive.mapred.reduce.tasks = numberこのコマンドを使用してreduceの数を調整すると、これは通常、特定のビジネスシナリオのデータスキューの問題にのみ適しています。たとえば、大量のデータを含む80種類の商品があります。一つ減らす重合を行う、この時間が増加している減らす実行の数、ハッシュ生成物のこれらの80種類の異なるタイプに分配される可能性がある場合、パーティションを減らす増加、それらを減らすスキュー問題は、それが制限されている強力である処理されたデータの数を、および動作しない場合があります。
3. SQLの最適化
3.1 に起因するデータの偏りヌルに起因するデータの偏り値問題
ヌル値問題は、このようなトラフィックのドメイン内のユーザー行動ログデータとして、実際のビジネスに共通する問題であり、時にはUSER_IDデータの損失が発生します。これで、このとき、user_idは多くのnull値を生成します。このとき、ユーザー情報テーブルに関連付けられていると、データの偏りが発生します。解決策は次のとおりです。
-- 1.这种情况在join的时候直接过滤空值,最后给union all上
select
*
from a
join
b
on
a.id is not null and a.id = b.id
union all
select
*
from
a
where a.id is null;
-- 2.给空值字段取一个字符串常量+随机数
select
*
from a
left outer join
b
on
case
when a.id is null
then concat('常量字段',rand())
else a.id
end = b.id
2番目の方法は、IO時間とジョブが少ないため、最初の方法よりも優れています。最初の方法では、ユーザー行動ログテーブルが2回読み取られ、ジョブは2である必要があります。1つの方法は1です。この最適化は、無効なIDによって引き起こされるデータスキューに適しています。null値のキーを文字列と乱数に変換することで、データスキューの原因となるデータをさまざまなレデューサーに分割して、データスキューの問題を解決できます。すべてのレコードに自分自身を作るNULLと同じで混雑されることはありません作業を軽減し、複数に散乱されるタスクを減らすため、代替のランダムな文字列値に。ので、ヌル値は関係ありません、最終的な結果は、処理後に影響されることはありません。
3.2データを処理するときにhvie
を使用して大きなテーブルに関連付けられた小さなテーブル小さなテーブルに関しては、この問題に関連付けられた大きなテーブルは通常、問題を解決するのに適しています。ブロードキャスト変数のスパーク、実装は次のとおりです。
set hive.auto.convert.join=true; //设置 MapJoin 优化自动开启
set hive.mapjoin.smalltable.filesize=25000000 //可以根据情况设定具体值
3.2ラージテーブルとラージテーブルの
関連付け1.ラージテーブルがラージテーブルに関連付けられている場合、メモリへの過度のプレッシャーを防ぐためにラージテーブルがマップ側にブロードキャストされないため、マップ結合の設定は機能しなくなります。大きなテーブルによるメモリの浪費。現時点では、2つの大きなテーブルの役に立たない列と行をフィルタリングして関連付けることができます。役に立たないデータが多い場合は、ノードへの負荷を大幅に軽減し、データの偏りを回避できます。問題。
2. 2つの大きなテーブルに関連付けるデータが多すぎる場合は、次の方法を試すことができます。
set hive.optimize.skewjoin = true;
set hive.skewjoin.key = skew_key_threshold (default = 100000)
ハイブの実行中は、どのキーがどの程度のスキューを生成するかを判断する方法がないため、このパラメーターを使用してスキューしきい値を制御します。この値を超えると、新しい値がまだ到達していないリデュースに送信されます。