我有 1000 万个小 XML 文件 (300KB-500KB)。我在 Mapreduce 中使用 Mahaout 的 XML 输入格式来读取数据,并使用 SAX 解析器进行解析。但是处理速度非常慢。使用输入文件的压缩(lzo)是否有助于提高性能?每个文件夹包含 80-90k xml 文件,当我启动该过程时,它会为每个文件运行映射器。有什么方法可以减少映射器的数量?
最佳答案
Hadoop 不能很好地处理大量小文件。它旨在处理一些非常大的文件。
压缩文件无济于事,因为您已经注意到问题是您的工作需要实例化大量容器来执行映射(每个文件一个)。实例化容器花费的时间可能超过处理输入所需的时间(以及大量资源,如内存和 CPU)。
我不熟悉 Mahaout 的输入格式,但在 hadoop 中有一个类可以最大限度地减少在一个 Mapper 中组合多个输入的问题。该类是 CombineTextInputFormat。要使用 XML,您可能需要创建自己的扩展 CombineFileInputFormat 的 XMLInputFormat。
另一种改进较少的替代方法是在容器中重用 JVM:reuse JVM in Hadoop mapreduce jobs
重用 JVM 可以节省创建每个 JVM 所需的时间,但您仍然需要为每个文件创建一个容器。
关于xml - 解析数百万个小 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32616324/