このMapReduce投機的実行の記事では、Hadoop投機的実行について詳しく説明します。投機的実行とは何か、その必要性は何か、それを有効または無効にする方法を学びます。
この記事では、それが有益かどうか、およびそれがどのように機能するかも説明しています。
Hadoopでの投機的実行とは何ですか?
HadoopフレームワークのMapReduceモデルは、ジョブを独立したタスクに分割し、これらのタスクを並行して実行して、全体的なジョブの実行時間を短縮します。
これにより、実行速度の遅いタスクのジョブ実行時間に敏感になります。これは、1つの低速タスクのみが、ジョブ実行時間全体を予想よりも長くする可能性があるためです。仕事が数千または数百のタスクで構成されている場合、いくつかの行き詰まったタスクの可能性は非常に現実的です。
ソフトウェアの設定ミスやハードウェアの劣化など、さまざまな理由でタスクが遅くなる可能性があります。ただし、予想よりも時間がかかりますが、タスクは引き続き正常に完了するため、ジョブの実行が遅くなる原因を特定するのは困難です。
Hadoopフレームワークは、実行速度の遅いタスクを診断または修正しようとはしません。フレームワークは、予想速度よりも低速で実行されているタスクを検出しようとし、バックアップと同等のタスクである別のタスクを起動します。
バックアップタスクは投機的タスクと呼ばれ、このプロセスはHadoopでの投機的実行と呼ばれます。
Hadoopでの投機的実行の必要性は何ですか?
Hadoopフレームワークでは、入力ファイルは複数のブロックに分割され、それらのブロックはHadoopクラスター内の異なるノードに保存されていました。
MapReduceジョブがクライアントによって送信されると、InputSplitの数が計算され、InputSplitの数と同じ数のマッパーが実行されます。これらのマッパー(マップタスク)は、分割されたデータが存在するDataNodeで並行して実行されます。
ここで、ハードウェア障害またはネットワークの問題のために、Hadoopクラスター内のいくつかのDataNodeが他のDataNodeほど速くタスクを実行していない場合はどうなりますか。
したがって、これらのDataNodeで実行されているマップタスクは、他のDataNodeで実行されているマップタスクと比較して遅くなります。レデューサーは、すべてのマッパーの中間出力が使用可能な場合にのみ実行を開始できます。
したがって、実行速度の遅いマップタスクが少なくなると、Reducerの実行が遅れます。
レデューサーが遅いノードで実行されている場合は、ジョブ全体の最終出力も遅延します。
そのため、このような実行速度の遅いタスクを防ぐために、Hadoopフレームワークは他のノードで同じタスクを開始します。 Hadoopフレームワークによるこの最適化は、タスクの投機的実行と呼ばれます。
Hadoopでの投機的実行の仕組み
投機的実行は、ジョブのすべての独立したタスクの2つの重複するタスクをほぼ同時に起動しないため、互いに競合する可能性があります。フレームワークがそうすると、クラスターリソースの浪費につながります。
その代わりに、スケジューラーはジョブ内の同じタイプのすべてのタスク(mapやreduceなど)の進行状況を追跡し、平均よりも実行速度が遅い小さな割合の投機的な複製のみを起動します。
タスクが正常に完了すると、実行中の重複タスクは不要になったため、強制終了されました。
したがって、元のタスクが投機的タスクの前に完了した場合、投機的タスクは強制終了されます。投機的タスクが元のタスクの前に終了した場合、元のタスクは強制終了されます。
投機的実行は最適化であることに注意してください。 MapReduceジョブをより確実に実行するための機能ではありません。
Hadoopで投機的実行を構成するにはどうすればよいですか?
デフォルトでは、投機的実行は、マップタスクとリデュースタスクで有効になっています。そのプロパティはmapred-site.xmlで設定されます 構成ファイル。
- mapreduce.map.speculative :このプロパティがtrueに設定されている場合、マップタスクの投機的実行が有効になります。デフォルトでは、これはtrueです。
- mapreduce.reduce.speculative :このプロパティがtrueに設定されている場合、reduceタスクの投機的実行が有効になります。デフォルトでは、これはtrueです。
投機的実行をオフにしたいのはなぜですか?
投機的実行の主な目標は、ジョブの実行時間を短縮することです。ただし、これにはHadoopクラスターの効率が犠牲になります。
ビジーなHadoopクラスターでは、単一のジョブの実行時間を短縮するために冗長タスクが実行されているため、全体的なスループットが低下する可能性があります。
このため、一部のクラスター管理者は、Hadoopクラスターでの投機的実行をオフにし、ユーザーに個々のジョブに対して明示的にオンにします。
重複するreduceタスクは、元のタスクと同じマッパー出力をフェッチする必要があるため、reduceタスクに対してオフにすることができます。これにより、クラスター上のネットワークトラフィックが大幅に増加します。
投機的実行は有益ですか?
数百または数千のノードを持つHadoopクラスターでは、ネットワークの輻輳やハードウェア障害などの問題が一般的であるため、Hadoopでの投機的実行が有益な場合があります。
したがって、並列タスクまたは重複タスクを実行する方が適切です。ただし、ジョブのすべての独立したタスクの2つの重複するタスクがほぼ同時に起動された場合、クラスターリソースの浪費になります。
概要
この記事を読んだ後、Hadoopでの投機的実行とは何か、なぜそれが必要なのかを明確に理解していただければ幸いです。また、マップタスクに対して無効にし、タスクを個別に削減する方法も確認しました。