xml - 在 Hadoop 中创建许多小的 XML 文件

标签 xml hadoop

我在 Hadoop 中有一个大型数据集,其中包含许多不同客户的数据。

在此数据集中,每个客户都可以有许多订单商品,每天的订单数量从几百到几百万不等。

数据集有大约 50,000 个客户。

我需要做的是为每个客户创建一份每日 XML 报告,其中每个客户的数据都在其自己的文件中。这意味着一些文件会很小,但其他文件会很大(XML 表示非常冗长并且有很多字段)。

编写 Map Reduce 代码来生成 XML 是微不足道的,我解决这个问题的第一个方法是使用 Hadoop Multiple Outputs 在 reducer 中为每个客户编写一个文件。虽然这可行,但所有这些小文件都会给 Namenode 带来很大压力。此外,我需要将所有这些文件从 Hadoop 集群中导出,并将它们放在 Web 应用程序将为它们提供服务的标准文件系统中,因此像这样导出大量文件也可能会出现问题。

我想到的另一个想法是创建一个单独的序列文件,键等于客户,值包含单个交易的 XML,按照构成 XML 报告的顺序预先排序。然后我可以导出单个序列文件并编写一个简单的独立 Java 程序来读取序列文件并为每个客户写出一个文件。我已经在一个小数据集上对此进行了测试,希望性能可以。

有没有其他人遇到过这样的 Hadoop 问题并且对如何解决这个问题有任何其他想法?

序列文件方法听起来像是一种明智的处理方式吗?

最佳答案

据我所知,使用 MapFile因为存储可能会很好地解决您的问题。 MapFile 是一个排序的 SequenceFile,它另外维护一个索引文件,该文件将用于更快地从 map 中寻找键。

您可以从您的工作中组合一个 MapFile,其中键可以是客户 ID,值可以是 xml 内容,在后台 MapFile 创建一个索引文件,该文件将维护客户 ID 键的偏移量。

通过这种方式,您所有客户的 xml 文件都将组成一个 Mapfile,从而消除了小文件问题,这样您的 namenode 就可以轻松呼吸了:)。

在此之后您可以将 Mapfile 导出到任何应用程序,您将不需要将 MapFile 的内容写入磁盘,其中您可以很好地重用 MapFile 本身通过查找客户从中检索客户 xml 内容id 和 MapFile 将支持在索引文件的帮助下进行快速查找。请引用,

http://www.codeproject.com/Articles/887028/Implementing-Joins-in-Hadoop-Map-Reduce-using-MapF

BloomMapFile MapFile 的变体声称可以提供更快的 key 查找,这可能会更好地帮助您。希望这会有所帮助。

关于xml - 在 Hadoop 中创建许多小的 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30220460/

相关文章:

hadoop - 如果我得到 HiverServerException 我该怎么办

xml - 不匹配的子元素也出现在 XSL 模板下

xml - 我可以用命名空间注册 xsd 然后验证 xml 忽略命名空间吗

java - 为不同的 xml 子标签生成 xsd 和 Java 类 - JAXB

xml - 如何选择特定命名空间中的元素?

hadoop - Apache Nutch 在限制后刷新 gora 记录

hadoop - 难道真正的Hadoop框架不适合实时运行?

hadoop - 整合多个Hadoop集群

xml - 标准 XUnit 报告 XML 的引用源是什么

hadoop - 如何在 Hive 中编写子查询和使用 "In"子句