gpt4 book ai didi

xml - Hadoop:XML文件如何存储到HDFS并被Mappers处理?

转载 作者:可可西里 更新时间:2023-11-01 14:53:26 26 4
gpt4 key购买 nike

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

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

    <?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>
...
...

现在,如果我理解正确的话,MappReduce 作业的 Mapper 会考虑每个完整的 <customer></customer>用于处理的标记可能会失败,因为使用 -put 将这种 XML 文件放入 HDFS。或 -copyFromLocal不保证 HDFS 中的每个拆分块都会有 n完成数量<customer></customer>标签在里面。一些拆分块可能会像下面这样结束。

   ...
...

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

现在如果我们想确保每个 block 都必须有一个完整的客户标签'<customer></customer> ',我们可以寻求以下解决方案。

  1. Avro : 将每个客户的XML转化为Avro类型,如record类型,并使用Avro Serialize将此文件作为'Avro data file'放入HDFS,支持splittablity,保证完整的Avro记录在一个 block 中。
  2. 序列文件:我对此不太确定,但我认为我们可以在创建序列文件时标记同步点,这些文件在将文件拆分为 block 时使用。在这里我们可以标记每个客户标签的结尾'</customer> '作为同步点,这将保证没有客户开始标记'<customer> ' 最终将在同一 block 中没有结束标记。

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

最佳答案

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

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

关于xml - Hadoop:XML文件如何存储到HDFS并被Mappers处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28915507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com