1

Scala / Hadoopシステムで並列処理するために複数のコアを最大限に活用するためのより良い方法は何ですか?

1億のドキュメントを処理する必要があるとしましょう。ドキュメントはそれほど大きくはありませんが、ドキュメントの処理には計算量が多くなります。それぞれ10コアの100台のマシンを備えたHadoopクラスターがある場合、次のいずれかを実行できます。

A)各マシンに1000のドキュメントを送信し、Hadoopに10個のコア(または利用可能な数)のそれぞれでマップを開始させます

また

B)各マシンに1000個のドキュメントを送信し(引き続きHadoopを使用)、Scalaの並列コレクションを使用して複数のコアを最大限に活用します。(すべてのドキュメントを並列コレクションに入れてから、コレクションを呼び出しますmap)。つまり、クラスターレベルでの配布にはHadoopを使用し、並列コレクションを使用して各マシン内のコアへの配布を管理します。

4

3 に答える 3

2

Hadoop は、単なる並列化以上のものを提供します。作業を分散するためのプラットフォーム、同時ジョブを処理するためのスケジューラ、分散ファイルシステム、分散リデュースを実行する機能、およびフォールト トレランスを提供します。とはいえ、これは複雑なシステムであり、操作が難しい場合があります。

複数のユーザーが多くの異なるジョブをサブミットすることを計画している場合は、Hadoop が最適です (2 つのオプションのうち)。ただし、クラスターが常に同じ関数を介してドキュメントを処理することに専念している場合は、それほど問題なく、マシン間通信用の Scala 並列コレクションとアクターを備えたシステムを開発できます。Scala ソリューションを使用すると、より多くの制御が可能になり、システムがリアルタイムで応答できるようになり、タスクに関係のない多くの Hadoop 構成を処理する必要がなくなります。

大量のデータ (単一ノードに収まるよりも大きい) に対してさまざまなジョブを実行する必要がある場合は、Hadoop を使用します。要件を詳しく説明していただければ、より詳しい情報を提供できます。

更新: 100 万はかなり小さい数字です。いくつかの計算を行い、並列コレクションを使用する 1 台のマシンでかかる時間を確認することをお勧めします。ここでの利点は、開発時間が最小限であるということです!

于 2012-03-16T01:27:23.413 に答える
1

Hadoopは、多くの小さなファイルを処理するのにはあまり適していませんが、少量の非常に大きなファイルを処理するのには適していません。ファイルを処理する前にファイルをマージする方法はありますか、それともすべて完全に異なりますか?Hadoopは分散と並列処理自体を処理するため、XドキュメントをYマシンに明示的に送信する必要はありません。また、Hadoopを配布メカニズムとしてのみ使用するべきではないと思います。それは、その目的ではありません。実際のmap/reduceを使用するか、実行しようとしていることに対して独自のシステムを構築する必要がありますが、Hadoopを思い通りに曲げようとしないでください。

于 2012-03-16T06:53:12.493 に答える
1

答えは次の質問によって異なります - あなたの Scala コードは利用可能なすべてのコアを完全に活用できますか? おそらく、処理するドキュメントの部分間に適切な固有の同期がある場合、またはロックの競合なしでアルゴリズムを並列化する他の方法がある場合は、「B」がその方法です。そうであれば、ノードごとに1つのマッパーを構成し、マッパーに利用させます並列化による利益があまり良くなく、処理にスレッド (コア
) を追加してもパフォーマンスが直線的に改善されない場合は、「A」の方が優れている可能性があります。また、RAM のサイズにも依存します。ノードあたり 10 マッパーに十分な RAM が必要です。
理想的な解決策は、その中間のどこかにあるのではないかと疑うことができます。したがって、私の提案は、パラメーターとして使用されるスレッド数を取るマッパーを開発し、マッパーごとのスレッド数を増やしてノードごとのマッパー数を減らしていくつかのテストを行うことです。

于 2012-03-17T11:24:26.047 に答える