如何从地图作业输出整个文件



这是关于mapreduce输出的基本问题。

我正在尝试创建一个地图函数,该函数接收 xml 文件并使用 apache fop 制作 pdf。但是,我对如何输出它有点困惑,因为我知道它作为一个(键,值)对出去。

我也没有使用流媒体来做到这一点。

map-reduce 的要点是处理通常不适合内存的大量数据 - 因此输入和输出通常会以某种方式存储在磁盘上(也称为文件)。输入输出必须以键值格式指定

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

我没有尝试过这个,但这就是我会做的:

将映射器的输出写入此形式:key是文本中的文件名(保持文件名唯一),value是文本输出格式中fop的输出。使用 TextOutputFormat 编写它。

建议:

我假设您的用例只是读取输入 xml(可能对其数据进行一些操作)并使用 fop 将数据写入 PDF 文件。我不认为这首先是一个 hadoop 用例......因为无论您想做什么都可以通过批处理脚本来完成。您的 xml 文件有多大?您必须处理多少个 xml 文件?

编辑:

SequenceFileOutputFormat 将写入 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. 

使用序列文件会破坏您的应用程序,因为您最终会得到损坏的输出PDF文件。试试这个,自己看看。

您有很多输入文件...这就是Hadoop很糟糕的地方。(阅读此内容)。我仍然觉得您可以使用脚本在每个文档上逐个调用fop来执行所需的操作。如果您有多个节点,请在不同的输入文档子集上运行相同的脚本。相信我,考虑到创建地图和减少所涉及的开销,这将比 hadoop 运行得更快(你不需要减少。我知道)。

相关内容

  • 没有找到相关文章