2012-03-26 20 views
1

Ein bestimmter Job, den ich ausführe, muss einige Metadaten aus einer Datenbank sammeln (MySQL, obwohl dies nicht so relevant ist), bevor einige große HDFS-Dateien verarbeitet werden. Diese Metadaten werden den Daten in den Dateien hinzugefügt und an die späteren Stufen map/combine/reduce weitergeleitet.Kombinieren von Hadoop MapReduce und Datenbankabfragen

Ich fragte mich, wo der "richtige" Ort, um diese Abfrage setzen könnte. Ich brauche die Metadaten, die verfügbar sind, wenn der Mapper beginnt, aber es dort zu platzieren, scheint redundant zu sein, da jeder Mapper dieselbe Abfrage ausführt. Wie kann ich (wenn überhaupt) diese Abfrage einmal durchführen und ihre Ergebnisse über alle Mapper verteilen? Gibt es eine allgemeine Möglichkeit, Daten zwischen allen Knoten, die eine Aufgabe ausführen, zu teilen (außer dem Schreiben in HDFS)? Vielen Dank.

Antwort

3

Sie können Ihre MYSQL-Abfrage in Ihrer Hauptfunktion haben, und das Ergebnis der Abfrage kann in einer Zeichenfolge gespeichert werden. Anschließend können Sie die Variable auf das Hadoop Job Configuration-Objekt festlegen. Auf die Variablen, die im Konfigurationsobjekt festgelegt sind, kann von allen Mappern zugegriffen werden.

Ihre Hauptklasse wie folgt aussieht ....
JobConf conf = new JobConf(Driver.class);
String metainfo = <You metadata Info goes here>;
conf.set("metadata",metainfo);



So in Sie Map-Klasse können Sie den Metadatenwert wie folgt zugreifen

publi class Map(...){

String sMetaInfo="";

public void configure(JobConf job) {

sMetaInfo= job.get("metadata"); // Getting the metadata value from Job Configureation Object

}
public void map(....){

// Map Function
}

}

+3

Wenn Ihre Metadaten zu groß sind, um in der Konfiguration gespeichert zu werden, sollten Sie darüber hinaus den DistributedCache verwenden. Erwerben Sie die Metadaten aus der DB in Ihrem Treiber, speichern Sie in Datei und fügen Sie dann die Datei zum DistributedCache hinzu - die Datei wird dann in jedem Mapper für Sie in den Speicher laden und bei Bedarf anhängen –

+0

Beide Antworten sind ausgezeichnet, danke! – sa125

0

Ich würde Swoop verwenden, wenn Sie die cloude haben ra Verteilung für die Leichtigkeit. Ich programmiere normalerweise mit cascading in Java und für db Quellen verwenden dbmigrate als Quelle "tippen" machen dbs zu einem erstklassigen Bürger. Bei Verwendung von PKs mit dbmigrate war die Leistung angemessen.

+0

https://github.com/Cascading/cascading-dbmigrate –

Verwandte Themen