2013-02-12 12 views
5

Ich versuche, etwas Einfaches in Hadoop zu tun und festgestellt, dass beim Schreiben von Mapper und Reducer als statisch überall definiert sind. Meine Aufgabe wird in mehrere map Teile und eine endgültige reduce zerlegt werden. Was ist, wenn ich einen meiner Mapper in einem anderen Job wiederverwenden möchte? Wenn ich meine Mapper-Klasse als innere static definiert habe, kann ich sie in anderen Jobs verwenden? Auch nicht-triviale Probleme können viel mehr und kompliziertere Mapper erfordern, also wird es schrecklich, wenn man sie alle in einer riesigen Datei speichert.Müssen Mapper und Reducer in Hadoop statische Klassen sein?

Gibt es eine Möglichkeit, Mapper und Reducer als normale Klassen (möglicherweise sogar in separaten Jar) als den Job selbst zu haben?

Antwort

8

Ist Ihre Frage, ob die Klasse statisch sein muss, statisch sein kann, oder innerlich sein kann, oder sollte innerlich sein?

Hadoop muss in der Lage sein, Ihre oder Reducer durch Reflexion zu initiieren, vorausgesetzt, die Klassenreferenz/der Name wurde in Ihrer Job konfiguriert. Dies wird fehlschlagen, wenn es sich um eine nicht statische innere Klasse handelt, da eine Instanz nur im Kontext einiger anderer Klassen erstellt werden kann, von denen Hadoop vermutlich nichts weiß. (Es sei denn, die innere Klasse erweitert ihre einschließende Klasse, nehme ich an.)

So um die erste Frage zu beantworten: Es sollte nicht nicht statisch sein, da dies fast sicher unbrauchbar macht. Um das zweite und dritte zu beantworten: und es kann eine statische (innere) Klasse sein.

Für mich ist ein oder Reducer einfach ein Top-Level-Konzept und verdient eine erstklassige Klasse. Einige mögen es, sie statisch zu machen, um sie mit einer "Runner" -Klasse zu paaren. Ich mag das nicht, denn es ist wirklich, wozu Subpakete gehören. Sie beachten einen anderen Entwurfsgrund, um dies zu vermeiden. Zur vierten Frage: Nein, ich glaube, innere Klassen sind keine gute Übung.

Endgültige Frage: ja die Klassen und Reducer können in einer separaten JAR-Datei sein. Sie teilen Hadoop mit, welche JAR-Dateien den gesamten Code enthalten, und dieser wird an die Mitarbeiter gesendet. Die Arbeiter brauchen Ihre Job nicht. Sie benötigen jedoch alles, was die und Reducer in derselben JAR abhängt.

1

Ich fühle die obige Antwort ist sehr präzise und erfüllt die Begründung. Außer, ich fühle, dass innere Klassen genutzt werden sollten, während die Karte erstellt und reduziert wird. IMO, der gesamte Code sollte an einem Ort sein.

Und Generika können durchdacht in der einzelnen Klasse verwendet werden, wodurch sichergestellt wird, dass keine Typisierungsfehler auftreten.

+0

Es ist keine Antwort. Sie können einen Kommentar hinterlassen, wenn Sie genügend Ansehen haben. – songyuanyao

Verwandte Themen