0

我需要将几个 XML 解析为 TSV,XML 文件的大小约为 50 GB,我基本上怀疑我应该选择解析这个的实现我有两个选项

  1. 使用 SAXParser
  2. 使用 Hadoop

我对 SAXParser 实现有一些想法,但我认为可以访问 Hadoop 集群,我应该使用 Hadoop,因为这就是 hadoop 的用途,即大数据

有人可以提供一个提示/文档,说明如何在 Hadoop 中执行此操作,或者为如此大的文件提供有效的 SAXParser 实现,或者更确切地说,我应该为 Hadoop 或 SAXparser 做什么?

4

4 回答 4

2

我经常在 Hadoop 中处理大型 XML 文件。我发现它是最好的方法(不是唯一的方法……另一种是编写 SAX 代码),因为您仍然可以以类似 dom 的方式对记录进行操作。

对于这些大文件,要记住的一件事是,您绝对希望在映射器输出上启用压缩:Hadoop,如何压缩映射器输出而不是减速器输出......这将大大加快速度.

我已经写了一个关于我如何处理这一切的快速大纲,也许它会有所帮助:http ://davidvhill.com/article/processing-xml-with-hadoop-streaming 。我使用 Python 和 Etrees,这让事情变得非常简单......

于 2012-09-07T16:28:14.523 回答
0

我不知道 SAXparser。但是,如果您有一个具有足够数据节点的 hadoop 集群,Hadoop 肯定会完成您的工作。50Gb 不算什么,因为我在集群上对超过 300GB 的数据执行操作。用java写一个map reduce作业,hadoop的文档可以在http://hadoop.apache.org/找到

于 2012-02-24T11:14:50.547 回答
0

通过每个 XML 文件有一个映射器,在 hadoop 上处理 XML 相对简单。这种方法适用于大量相对较小的 XML

问题是,在您的情况下,文件很大,而且数量很小,因此不拆分 hadoop 的好处将受到限制。考虑到 hadoop 的开销,好处是负面的……在 hadoop 中,我们需要能够将输入文件拆分为逻辑部分(称为拆分)以有效地处理大文件。一般来说,XML 看起来不像“可拆分”格式,因为没有明确定义的块划分,可以独立处理。同时,如果 XML 包含某种“记录”,则可以实现拆分。
关于在 haoop 中拆分 XML 的好讨论在这里: http ://oobaloo.co.uk/articles/2010/1/20/processing-xml-in-hadoop.html 建议使用 Mahout 的 XML 输入格式。

关于您的情况-我认为只要您的文件数量不大于单个系统上的核心数量-hadoop 将不是有效的解决方案。
同时——如果你想随着时间的推移积累它们——你也可以从作为可扩展存储的 hadoop 中获益。

于 2012-02-24T12:08:50.000 回答
0

我认为 SAX 传统上被错误地与处理大型 XML 文件联系在一起......实际上,VTD-XML 通常是最好的选择,在性能、灵活性、代码可读性和可维护性方面远远优于 SAX......关于这个问题在内存方面,VTD-XML 的内存模型仅为对应 XML 文档大小的 1.3x~1.5X。

与 SAX 相比,VTD-XML 具有另一个显着优势:其无与伦比的 XPath 支持。正因为如此,VTD-XML 用户通常报告说,与 SAX 解析数百 MB XML 文件相比,性能提高了 10 到 60 倍。

http://www.infoq.com/articles/HIgh-Performance-Parsers-in-Java#anch104307

阅读这篇全面比较 Java 中现有 XML 解析框架的论文。

http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf

于 2016-04-30T06:25:30.393 回答