【发布时间】: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>
...
...
现在,如果我理解正确,考虑每个完整的 <customer></customer> 标记进行处理的 MappReduce 作业的 Mapper 可能会失败,因为使用 -put 或 -copyFromLocal 将这种 XML 文件放入 HDFS 并不能保证每个拆分HDFS 中的块将在其中包含 n 完整的 <customer></customer> 标记数。一些拆分块可能会像下面这样结束。
...
...
<customer>
<id></id>
<name></name>
<age></age>
<address></address>
</customer>
<customer>
<id></id>
<name></name>
现在如果我们想确保每个区块必须有一个完整的客户标签'<customer></customer>',我们可以采用以下解决方案。
- Avro : 将每个客户的 XML 转换为 Avro 类型,如记录类型,并使用 Avro Serialize 将此文件作为“Avro 数据文件”放入 HDFS,支持拆分,可以保证完整的 Avro 记录在一个阻止。
-
序列文件:我不确定这个,但我认为我们可以在创建序列文件时标记同步点,在将文件拆分为块时使用这些同步点。在这里,我们可以将每个客户标签“
</customer>”的结尾标记为同步点,这将保证在同一块中没有客户开始标签“<customer>”最终会没有结束标签。
谁能确认我的理解是否正确?除了这两个之外,还有没有其他方法可以解决这个问题。
【问题讨论】: