5

私はHadoopで簡単なことをしようとしていますが、マッパーとリデューサーを書くときにどこでも静的として定義されていることがわかりました。私のタスクは、いくつかのmap部分と 1 つの最終的なreduce. 自分のマッパーの 1 つを別のジョブで再利用したい場合はどうすればよいですか? マッパークラスをインナークラスとして定義したstatic場合、それを他のジョブで使用できますか? また、重要な問題には、より多くの複雑なマッパーが必要になる場合があるため、それらすべてを 1 つの巨大なファイルに入れると、メンテナンスが大変になります。

ジョブ自体よりもマッパーとレデューサーを通常のクラスとして (おそらく別の jar でも) 持つ方法はありますか?

4

2 に答える 2

8

クラスが静的である必要があるか、静的である可能性があるか、内部にある可能性があるか、または内部にある必要があるかという質問はありますか?

で構成されたクラス参照/名前を指定すると、Hadoop 自体がリフレクションによってMapperまたはをインスタンス化できる必要があります。おそらくHadoopが何も知らない他のクラスのコンテキストでのみインスタンスを作成できるため、非静的内部クラスの場合、これは失敗します。(内部クラスがそれを囲むクラスを拡張しない限り、私は推測します。)ReducerJob

したがって、最初の質問に答えるには、非静的であってはなりません。これにより、ほぼ確実に使用できなくなるためです。2番目と3番目に答えるには、静的(内部)クラスにすることができます。

私にとってMapperorReducerは明らかにトップレベルの概念であり、トップレベルのクラスに値します。それらを内部静的にして、「ランナー」クラスとペアにするのが好きな人もいます。これは本当にサブパッケージの目的であるため、好きではありません。これを回避する別の設計上の理由に注意してください。4 番目の質問: いいえ、内部クラスは適切な方法ではないと思います。

最後の質問: はい、クラスMapperReducerクラスを別の JAR ファイルに入れることができます。どの JAR ファイルにこのコードがすべて含まれているかを Hadoop に伝えると、それがワーカーに出荷されます。労働者はあなたを必要としませんJobMapperただし、同じ JAR 内でとReducerが依存するものはすべて必要です。

于 2013-02-12T08:19:43.130 に答える
1

上記の答えは非常に正確であり、理論的根拠を満たしていると思います。ただし、map と reduce の作成中に内部クラスを利用する必要があると思います。IMO、すべてのコードは 1 か所にある必要があります。

また、型キャスト エラーが発生しないように、1 つのクラスでジェネリクスを慎重に使用できます。

于 2014-04-30T14:20:18.830 に答える