Hadoop フレームワークは、利用可能な複数のコアを自動的に活用します。自分で並列プログラミングを行う必要はありません。これは、実際には Hadoop のセールス ポイントの 1 つです。スレッドの同期ロジックを気にせずにジョブを 1 回記述するだけで済みます。その後は、クラスターの構成に応じて、可能な限りすべてのコアを使用するようにしてください。
たとえば、数テラバイトのデータセットで実行されているジョブがあり、分割の計算後に 100 のタスクを実行する必要があるとします。ここで、10 個の m1.small ノード (コアが 1 つしかない) でジョブを実行する場合、クラスターには一度に 10 個のタスク (ノードごとに 1 個のタスク) の容量があります。ただし、たとえば 10 m1.large ノード (2 x 2 コア) で実行する場合、一度に 40 タスクの容量があるため、ジョブは同じものを使用していた場合よりも約 4 倍高速になります。追加のコアを利用するため、m1.small の数。
さらに、Hadoop で CUDA を使用している人の話を聞いたことがあります (一部の情報はこちら)。Amazon にはいくつかのクラスター GPU インスタンスがあるため、この場合はおそらく GPU も利用できます。
肝心なのは、Hadoop を使用する場合は、マシンの数ではなく、コアの数で推論する必要があるということです。適切なトレードオフを見つけたいと思うのは明らかです。私は過去に、各ノードに多数のコアがあるクラスタを見たことがありますが、ディスク I/O はあまり良くなかったので、クラスタ内で多くの競合が発生しました。ノードあたりのタスクの最大数を減らします (パラメーターmapred.tasktracker.map.tasks.maximum
とを介して Hadoop 構成で制御できますmapred.tasktracker.reduce.tasks.maximum
)。
m1.xlarge インスタンスが一部の Hadoop クラスターで非常にうまく機能することを個人的に発見しましたが、CPU の高いクラスターではディスクの競合が多すぎました。