これが行われる広範なドキュメントと例を見つけましたが、分割が map() 関数で行われると、分散システムの力を活用できなくなると思います。
この分析で私は正しいですか?
入力ファイルは分割され、一連のサーバー全体に分散されるため、マップの並列実行が可能になります。また、マップされた出力のパーティション化を利用して、各単語のカウントを 1 つのサーバー (パーティション) に収集するために必要な並べ替えを実現することもできます。このようにして、単語の実際のカウントも並行して行われます。
WordCount の例では、やるべきことがいくつかあるという点であなたは正しいMapper
です: 彼が提供されたすべての行について、彼はそれを単語に分割し、これらを Key-Value-Pairs として発行する必要があります。
しかし、並列化の最初のステップが開始前に行われていることにも注意する必要がありますMapper
: TextInputFormat
(例で明示的に言及されています) 入力ファイルを行に分割します。これらのパッケージは、次に別のパッケージに配布されますMappers
- 並行して!
「Mappers
ビジネスロジック」を実装します。つまり、これらの行を単語に分割します。私にはそれでいいのです。別の方法として、入力を行ごとに分割するだけでなく、単語ごとに分割する独自のものを実装するFileInputFormat
(または を拡張する) こともできます。TextInputFormat
これも有効ですがMapper
、入力値を取得し、出力値として「1」とともに出力キーとして出力するだけです。後者の方が好きですか?
答えは次のとおりですInputFormat
。私が覚えている限り、 は並行して実行されません。しかし、Mappers
そうです。Mappers
そのため、単一のInputFormat
クラスではなく、多くの人がトークン化を処理する方が良いように思えます。
このチュートリアルでは、Hadoop と MapReduce の内部について説明しています。InputSplits
彼らは次のように述べています。
ファイルをチャンクで処理することにより、複数のマップ タスクを 1 つのファイルで並行して処理できます。ファイルが非常に大きい場合、並列処理によってパフォーマンスが大幅に向上します。
これがお役に立てば幸いです:-)