HIVE-小さなファイルのマージ



Hive Small File Merge



HDFSは、大きなデータファイルを非常に簡単に保存できます。 Hiveに小さなファイルが多すぎると、名前コードに大きなパフォーマンスのプレッシャーがかかります。同時に、小さいファイルが多すぎると、JOBの実行に影響します。 Hadoopは、ジョブを複数のタスクに変換します。小さなファイルごとに、個別に処理するタスクが必要です。独立したjvmインスタンスとして、タスクが開始および停止されます。実際のタスク処理時間を大幅に超える場合があります。

同時に、ハイブの出力は最終的にmrの出力、つまりレデューサー(またはマッパー)の出力であることがわかります。レデューサー(マッパー)出力の数によって、出力ファイルの数が生成されます。シャッフル/ソートの原則に従って、各ファイルは特定の値に基づいています。シャッフル後の結果。



あまりにも多くの小さなファイルが生成されるのを防ぐために、hiveは構成パラメーターを介してmrプロセスで小さなファイルをマージできます。また、SQLを実行する前に、すべての小さなファイルがマージされます。これにより、プログラムのパフォーマンスも向上します。 2つの側面から最適化できます。1つは、マップの実行によってパフォーマンスが向上する前に小さなファイルをマージすること、もう1つは、出力中にマージして圧縮してIOの負荷を軽減することです。

1.小さなファイルによって引き起こされる問題
場所、サイズ、ブロック情報などを含むHDFSファイルのメタ情報は、NameNodeのメモリに保存されます。各オブジェクトは約150バイトを占有するため、1,000万個のファイルとブロックが約3Gのメモリスペースを占有します。この規模に近づくと、NameNodeのパフォーマンスは低下し始めます。さらに、HDFSは、NameNodeからメタ情報を取得し、対応するDataNodeとの接続を確立する必要があるため、小さなファイルの読み取りと書き込みに時間がかかります。 MapReduceプログラムの場合、ファイルが小さいとマッパーの数も増えます。各スクリプトはごくわずかなデータしか処理しないため、多くのスケジューリング時間が無駄になります。もちろん、この問題は、CombinedInputFileとJVMの再利用を使用することで解決できます。



2.Hiveの小さなファイルの理由

集約されたデータの量は通常、ソースデータよりもはるかに少なくなります。計算速度を上げるために、レデューサーの数を増やし、Hive自体も同様の最適化を行います。レデューサーの数は、ソースデータの量をhive.exec.reducers.bytesで構成された量で割ったものに等しくなります。 .per.reducer(デフォルトは1G)。レデューサーの数の増加は、結果ファイルの増加も意味し、小さなファイルの問題を引き起こします。

3.小さなファイルを組み合わせる

マージを入力します。それはマップの前に小さなファイルをマージすることです
出力がマージされます。つまり、結果を出力するときに小さなファイルをマージします

入力マージ:



set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat //Merge small files before executing Map set mapred.max.split.size=256000000 //Maximum input size of each Map set mapred.min.split.size.per.node=100000000 //The minimum size of split on a node set mapred.min.split.size.per.rack=100000000 //The minimum size of split under a switch

出力マージ

set hive.merge.mapfiles = true //Merge small files at the end of the Map-only task set hive.merge.tezfiles=true set hive.merge.mapredfiles = true //Merge small files at the end of the Map-Reduce task set hive.merge.size.per.task = 256*1000*1000 //The size of the combined file set hive.merge.smallfiles.avgsize=16000000 //When the average size of the output file is less than this value, start an independent map-reduce task for file merge