【问题标题】:Creating Many Small XML files in Hadoop在 Hadoop 中创建许多小型 XML 文件
【发布时间】:2015-05-15 17:14:29
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: xml hadoop


    【解决方案1】:

    据我所知,使用MapFile 作为存储可能会很好地解决您的问题。 MapFile 是一个已排序的 SequenceFile,其中还维护了一个索引文件,用于更快地从地图中查找键。

    您可以从您的工作中编写一个 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

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

    【讨论】:

    • 感谢您的信息。 MapFiles 听起来可能非常有用 - 我将不得不对它们进行试验,看看如何使用它们来解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多