【问题标题】:Hadoop:how XML files can be stored in HDFS and processed by Mappers?Hadoop:如何将 XML 文件存储在 HDFS 中并由 Mappers 处理?
【发布时间】:2016-07-01 23:00:08
【问题描述】:

我刚刚开始学习 Hadoop,我想确认我对“如何将 XML 文件存储在 HDFS 中并由 Mappers 处理”的理解。

我有一个 XML 格式的 XML 文件,如下所示。它的简单 customerlist XML 示例。此文件的大小为 1 GB。现在,如果我将此文件移动到 HDFS 中,它将被拆分为 16 个块(如果我们将每个拆分的默认块大小保持为 64 MB)。因此将执行 16 个映射器来处理此文件,每个块一个。

    <?xml version="1.0"?>
    <customerList>
       <customer>
        <id></id>
        <name></name>
        <age></age>
        <address></address>
       </customer>
       <customer>
        <id></id>
        <name></name>
        <age></age>
        <address></address>
       </customer>
...
...

现在,如果我理解正确,考虑每个完整的 &lt;customer&gt;&lt;/customer&gt; 标记进行处理的 MappReduce 作业的 Mapper 可能会失败,因为使用 -put-copyFromLocal 将这种 XML 文件放入 HDFS 并不能保证每个拆分HDFS 中的块将在其中包含 n 完整的 &lt;customer&gt;&lt;/customer&gt; 标记数。一些拆分块可能会像下面这样结束。

   ...
   ...

       <customer>
        <id></id>
        <name></name>
        <age></age>
        <address></address>
       </customer>
       <customer>
        <id></id>
        <name></name>

现在如果我们想确保每个区块必须有一个完整的客户标签'&lt;customer&gt;&lt;/customer&gt;',我们可以采用以下解决方案。

  1. Avro : 将每个客户的 XML 转换为 Avro 类型,如记录类型,并使用 Avro Serialize 将此文件作为“Avro 数据文件”放入 HDFS,支持拆分,可以保证完整的 Avro 记录在一个阻止。
  2. 序列文件:我不确定这个,但我认为我们可以在创建序列文件时标记同步点,在将文件拆分为块时使用这些同步点。在这里,我们可以将每个客户标签“&lt;/customer&gt;”的结尾标记为同步点,这将保证在同一块中没有客户开始标签“&lt;customer&gt;”最终会没有结束标签。

谁能确认我的理解是否正确?除了这两个之外,还有没有其他方法可以解决这个问题。

【问题讨论】:

    标签: xml hadoop hdfs


    【解决方案1】:

    记录不必是映射器的本地记录,出于性能原因,它更可取。大多数 MapReduce 输入格式将寻找超过块的末尾以完成块的最终记录。这会在进程中引入一些远程读取,但作为总读取的比例,它通常非常低。

    Mahout XmlInputFormat 就是这样做的。每次它运行next() 来创建一条新记录时,它都会从最后一个完成的点开始扫描,并且只有在确定下一条记录完全超出分配给映射器的分割范围时才会拒绝返回。

    【讨论】:

      【解决方案2】:

      您的理解是正确的,期望映射器在从块而不是完整块派生的拆分上运行。所以映射器肯定会更多。

      所以来到XML文件的存储,他们会按照序列化的概念进入HDFS,边读边反序列化(SerDes) 除了 AVRO,还引入了其他 SerDes。比如节俭等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-28
        • 1970-01-01
        • 2018-03-31
        • 2015-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多