xml - 解析数百万个小 XML 文件

标签 xml hadoop mapreduce hdfs

我有 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/

相关文章:

hadoop - 有没有办法批量重命名配置单元表?

python - MapReduce 如何允许 Mapper 读取 xml 文件进行查找

hadoop - 在 hadoop 中更改目录的复制因子

java - CXF WebService 测试期间 JAXB 中的 SAXParseException

python - lxml.etree,element.text 不会从元素返回整个文本

java - Hadoop MapReduce 错误不同的数据类型

要打开的 Hadoop 3.1.0 端口

amazon-web-services - Amazon EMR MapReduce 进度回滚?

android - 有没有办法从 Google Play 上的开发者那里获取所有应用程序

Java - Jersey GET 请求返回 null;等效 URL 在浏览器中产生正确的输出