2012-04-11 10 views
0

Dies ist eine grundlegende Frage zu mapreduce-Ausgaben.Wie gebe ich ganze Dateien aus einem Kartenauftrag aus?

Ich versuche, eine Map-Funktion zu erstellen, die eine XML-Datei einnimmt und eine PDF-Datei mit Apache Fop erstellt. Allerdings bin ich ein wenig verwirrt, wie man es ausgibt, da ich weiß, dass es als (Schlüssel, Wert) Paar ausgeht.

Ich verwende auch nicht Streaming, um dies zu tun.

+1

Was haben Sie versucht? Einige Sprungpunkte, wie Sie mit Ihrem Code helfen können, wären gut. –

Antwort

0

Der Punkt von map-reduce ist, eine große Menge an Daten zu bewältigen, die normalerweise nicht in den Speicher passen würden - so würden Eingabe und Ausgabe normalerweise irgendwie auf Festplatten gespeichert werden (zB .a.k.a-Dateien). Input-Output muss in key-value format

(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output) 

angegeben werden Ich habe nicht versucht, aber das ist, was ich tun würde:

schreiben Ausgabe von Mapper auf diese Form: key ist der Dateiname in Text (halten Dateinamen einzigartig) und value ist die Ausgabe von fop in TextOutputFormat. Schreiben Sie es mit TextOutputFormat.

Vorschlag:

Ich gehe davon aus, dass Ihr Anwendungsfall Eingang xml nur das Lesen (vielleicht eine Operation auf seine Daten zu tun) und Schreiben von Daten in PDF-Dateien mit fop. Ich denke nicht, dass dies ein Hadoop-Anwendungsfall an erster Stelle ist ... becoz, was auch immer Sie tun möchten, kann durch ein Batch-Skript getan werden. Wie groß sind Ihre XML-Dateien? Wie viele XML-Dateien müssen Sie verarbeiten?

EDIT:

SequenceFileOutputFormat in einem SequenceFile schreiben. SequenceFile hat seine eigenen Header und andere Metadaten zusammen mit dem Text, der gespeichert wird. Außerdem speichert es Daten in Form von Schlüsselwerten.

SequenceFile Common Header 

    version - A byte array: 3 bytes of magic header 'SEQ', followed by 1 byte of actual version no. (e.g. SEQ4 or SEQ6) 
    keyClassName - String 
    valueClassName - String 
    compression - A boolean which specifies if compression is turned on for keys/values in this file. 
    blockCompression - A boolean which specifies if block compression is turned on for keys/values in this file.  
    compressor class - The classname of the CompressionCodec which is used to compress/decompress keys and/or values in this SequenceFile (if compression is enabled).  
    metadata - SequenceFile.Metadata for this file (key/value pairs) 
    sync - A sync marker to denote end of the header. 

Mit SequenceFile Ruine Ihrer Anwendung, wie Sie mit beschädigter Ausgabe von PDF-Dateien landen. Versuchen Sie this heraus und sehen Sie selbst.

Sie haben viele Eingabedateien ... und das ist, wo hadoop saugt. (read this). Dennoch habe ich das Gefühl, dass Sie Ihre gewünschte Operation mit einem Skript ausführen können, um fop für jedes Dokument nacheinander aufzurufen. Wenn Sie mehrere Knoten haben, führen Sie dasselbe Skript aus, aber auf einer anderen Teilmenge der Eingabedokumente. Vertrauen Sie mir, das wird SCHNELLER laufen als hadoop, wenn man den Overhead berücksichtigt, der mit der Erstellung von Karten verbunden ist, und reduziert (Sie brauchen keine Reduzierungen, ich weiß es).

+0

Nun, der Grund, warum wir versuchen, hadoop zu verwenden, ist, dass wir ungefähr 1.000.000 PDFs gleichzeitig auf einmal generieren müssen. Nun habe ich mir ein Tutorial angesehen, das ich unter [link] (http://developer.yahoo.com/hadoop/tutorial/module4.html) gefunden habe und etwas mehr über Ein- und Ausgänge erklärt. Für die Ausgabe denke ich vielleicht, dass ich SequenceFileOutputFormat verwenden könnte, aber ich bin mir nicht sicher, wie genau das ausgegeben würde, da es keinen Reducer gibt. Ich lief auch in ein anderes Beispiel, wo sie einen Nullwert für den Rückgabewert setzten und nur den Schlüssel zurückgaben, aber ich erinnere mich nicht, wo das – user1325360

+0

@ user1325360 war, sehe mein EDIT oben –

Verwandte Themen