これは、mapreduceの出力に関する基本的な質問です。
xmlファイルを取り込んでapachefopを使用してpdfを作成するマップ関数を作成しようとしています。ただし、(キー、値)ペアとして出力されることがわかっているため、出力方法について少し混乱しています。
また、これを行うためにストリーミングを使用していません。
map-reduce のポイントは、通常はメモリに収まらない大量のデータに取り組むことです。そのため、入力と出力は通常、何らかの方法でディスク (別名ファイル) に保存されます。入出力はキー値形式で指定する必要があります
(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output)
私はこれを試していませんが、これは私がすることです:
マッパーの出力を次の形式に書き込みます:key
はTextのファイル名 (一意のファイル名を保持) であり、 TextOutputFormat のfopvalue
の出力です。TextOutputFormatを使用して記述します。
提案:
あなたのユースケースは、入力xmlを読み取り(おそらくそのデータに対して何らかの操作を行っている)、fopを使用してPDFファイルにデータを書き込むだけであると想定しています。そもそもこれが Hadoop の使用例だとは思いません...なぜなら、やりたいことは何でもバッチ スクリプトで実行できるからです。あなたのxmlファイルの大きさは?いくつの xml ファイルを処理する必要がありますか?
編集:
SequenceFileOutputFormatはSequenceFileに書き込みます。SequenceFileには、保存されているテキストとともに、独自のヘッダーとその他のメタデータがあります。また、キー:値の形式でデータを保存します。
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.
SequenceFileを使用すると、出力 PDF ファイルが破損してしまうため、アプリケーションが台無しになります。これを試してみて、自分の目で確かめてください。
たくさんの入力ファイルがあります...そして、これがhadoopの最悪の場所です。(これを読んでください)。それでも、すべてのドキュメントでfopを 1 つずつ呼び出すスクリプトを使用して、目的の操作を実行できると思います。複数のノードがある場合は、同じスクリプトを実行しますが、入力ドキュメントの異なるサブセットに対して実行します。私を信じてください、これはマップとリデュースの作成に伴うオーバーヘッドを考慮すると、hadoop よりも高速に実行されます (リデュースは必要ありません..私は知っています)。