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).
Was haben Sie versucht? Einige Sprungpunkte, wie Sie mit Ihrem Code helfen können, wären gut. –