パフォーマンスの調整は、 Hadoopの最適化に役立ちます パフォーマンス。このブログでは、MapReduceジョブの最適化のためのこれらすべての手法について説明します。
このMapReduceチュートリアルでは、クラスターの適切な構成、LZO圧縮の使用、MapReduceタスク数の適切な調整など、MapReduceジョブの最適化に関する6つの重要なヒントを提供します。
MapReduceジョブ最適化のヒント
以下は、MapReduceジョブのパフォーマンスを最適化するのに役立つMapReduceジョブ最適化手法の一部です。
1。クラスタの適切な構成
- -noatime オプションDfsとMapReduceストレージがマウントされています。これにより、アクセス時間が無効になります。したがって、I/Oパフォーマンスが向上します。
- TaskTrackerおよびデータノードマシンではRAIDを回避するようにしてください。これにより、通常、パフォーマンスが低下します。
- mapred.local.dirが構成されていることを確認してください およびdfs.data.dir 各ディスク上の1つのディレクトリを指すようにします。これは、すべてのI/O容量が使用されるようにするためです。
- ソフトウェアを使用して、スワップ使用量とネットワーク使用量のグラフを監視する必要があります。スワップが使用されていることがわかった場合は、 mapred.child.java.optsの各タスクに割り当てられるRAMの量を減らす必要があります。 。
- ディスクドライブのヘルスステータスをスマートに監視する必要があることを確認してください。これは、MapReduceのパフォーマンスチューニングの重要なプラクティスの1つです。
2。 LZO圧縮の使用法
中間データの場合、これは常に良い考えです。無視できない量のマップ出力を生成するすべてのHadoopジョブは、LZOを使用した中間データ圧縮の恩恵を受けます。
LZOはCPUに少しオーバーヘッドを追加しますが、シャッフル中のディスクIOの量を減らすことで時間を節約します。
mapred.compress.map.outputを設定します trueにすると、LZO圧縮が有効になります
3。 MapReduceタスクの数の適切な調整
- MapReduceジョブでは、各タスクに30〜40秒以上かかる場合、タスクの数が減ります。 マッパー またはレデューサー プロセスには次のことが含まれます。最初に、JVM(メモリにロードされたJVM)を起動する必要があります。次に、JVMを初期化する必要があります。そして、処理(マッパー/リデューサー)後、JVMを非初期化する必要があります。そして、これらのJVMタスクは非常にコストがかかります。マッパーが20〜30秒間だけタスクを実行する場合を想定します。このためには、JVMを開始/初期化/停止する必要があります。これにはかなりの時間がかかる場合があります。したがって、タスクを少なくとも1分間実行することを強くお勧めします。
- ジョブに1TBを超える入力がある場合。次に、入力データセットのブロックサイズを256Mまたは512Mに増やすことを検討する必要があります。したがって、タスクの数は少なくなります。コマンドHadoopdistcp –Hdfs.block.size =$ [256 * 1024 * 1024] / path / to / inputdata / path / to / inputdata-with-largeblocks を使用して、ブロックサイズを変更できます。
- 各タスクは少なくとも30〜40秒間実行されることがわかっています。マッパータスクの数を、クラスター内のマッパースロットの数の数倍に増やす必要があります。
- ほとんどのジョブで、あまり多くの削減タスクを実行しないでください。クラスタ内のreduceスロットの数と同じかそれより少し少ないreduceタスクの数。
4。マッパーとレデューサーのコンバイナー
アルゴリズムに何らかの集計の計算が含まれる場合は、コンバイナーを使用する必要があります。 コンバイナーは、データがレデューサーに到達する前に集計を実行します。
Hadoop MapReduceフレームワークの実行はインテリジェントに組み合わされて、ディスクに書き込まれるデータの量を削減します。そして、そのデータは、計算のMapステージとReduceステージの間で転送する必要があります。
5。データに最も適切でコンパクトな書き込み可能なタイプの使用
ビッグデータユーザーは、テキスト書き込み可能タイプを不必要に使用して、HadoopストリーミングからJavaMapReduceに切り替えます。テキストは便利です。数値データをUTF8文字列との間で変換するのは非効率的です。そして実際にはCPU時間のかなりの部分を占める可能性があります。
6。書き込み可能物の再利用
多くのMapReduceユーザーは、マッパー/リデューサーからのすべての出力に新しいWritableオブジェクトを割り当てるという非常によくある間違いを犯しています。たとえば、単語数マッパーの実装を次のように想定します。
public void map(...) { ... for (String word: words) { output.collect(new Text(word), new IntWritable(1)); }
この実装により、数千の短期間のオブジェクトが割り当てられます。 Javaガベージコレクターはこれに対処する上で合理的な仕事をしますが、次のように書く方が効率的です。
class MyMapper ... { Text wordText = new Text(); IntWritable one = new IntWritable(1); public void map(...) { ... for (String word: words) { wordText.set(word); output.collect(word, one); } } }
結論
したがって、MapReduceジョブの最適化に役立つさまざまなMapReduceジョブ最適化手法があります。マッパーとレデューサーの間でコンバイナーを使用するのと同じように、LZO圧縮の使用、MapReduceタスクの数の適切な調整、書き込み可能な再利用。
MapReduceジョブの最適化に関する他の手法を見つけた場合は、以下のコメントセクションでお知らせください。