【问题标题】:Parallel Processing Wikipedia's XML Data Dump with Storm使用 Storm 并行处理 Wikipedia 的 XML 数据转储
【发布时间】:2014-10-19 00:52:21
【问题描述】:

我正在尝试处理找到here 的维基百科转储。特别是文件 - enwiki-latest-pages-articles-multistream.xml.bz2。这大约是 46GB 未压缩。我目前在 Java (xerces) 中使用 STAX 解析器,并且能够每秒提取 15K 页面元素。然而,瓶颈似乎是解析器,我玩弄了 aalto-xml,但它没有帮助。

由于我在 Storm spout 中解析每个页面元素,因此这是一个瓶颈。但是,我认为我可以简单地在 ... 标签之间发出文本,并让几个螺栓并行处理每个页面元素。这将减少 Storm spout 必须执行的工作量。但是,我不确定在这里采取的具体方法。如果我使用解析器来提取标签之间的内容,那么这意味着它将解析从标签开头到结尾的每个元素。有没有办法在标准 SAX/STAX 解析器中消除这种开销?

【问题讨论】:

  • 我不知道怎么可能。为了知道你想要原始 XML 的标签已经关闭,我认为它需要解析里面的所有 XML 内容。否则,它遇到的结束标记可能与您实际想要的结束标记不明确,而另一个由于引入的命名空间而受到影响,例如似乎要实现这一点需要通常不安全的假设,这可能只能应用于特定情况。
  • Xerces 不是 Stax 解析器;也许您正在考虑 SAX?至于使用阿尔托;因为它的速度至少是 Xerces 的 2 倍,如果你没有观察到变化,你可能会错误地使用它(比如不重用 XMLInputFactory——创建这些是非常昂贵的),或者瓶颈可能不在 XML 解析中和/还是一代?

标签: java xml bigdata apache-storm


【解决方案1】:

我尝试了类似的方法来尝试并行化。

无论如何,由于我将维基百科数据用于许多任务,因此生成一篇文章每行转储更简单,然后我可以并行运行许多实验。 只需几分钟即可运行,然后我有一个转储,我可以很容易地将它提供给 Spark(在你的情况下是 Storm)。

如果您想使用我们的工具,请检查: https://github.com/idio/wiki2vec

【讨论】:

    【解决方案2】:

    没有办法对 XML 文档进行随机访问,但许多 Java XML 解析器在跳过未使用的内容时效率更高一些:例如 Aalto 和 Woodstox 推迟对字符串值的解码(以及 String 对象的构造),以便如果跳过令牌,则不需要分配。

    要确保使用 Stax 的一件事是不要使用 Event API,除非有特定的缓冲内容需要——它没有提供比基本 Streaming API (XMLStreamReader) 更多的功能,但确实增加了显着的分配开销因为每个XMLEvent 都是构造的,无论是否需要它。而 Streaming API 只指示 Event/Token 的类型,让调用者决定是否需要内容(属性、文本值),可以避免大部分的对象分配。

    【讨论】:

      猜你喜欢
      • 2019-11-15
      • 2012-10-21
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多