我刚刚开始学习Hadoop,我想确认我对“如何将XML文件存储在HDFS中并由Mappers处理”的理解。
我有一个XML文件,其XML格式如下所示。它的简单customerlist XML示例。此文件的大小为1GB。现在,如果我将该文件移动到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>
...
...
现在,如果我正确理解的话,MappReduce作业的映射程序可能会失败,因为使用-put或-copyFromLocal将这种XML文件放入HDFS中并不能保证HDFS中的每个拆分块中都有完整<customer></customer>标记的n号。一些分裂块可能会像下面这样结束。
...
...
<customer>
<id></id>
<name></name>
<age></age>
<address></address>
</customer>
<customer>
<id></id>
<name></name>现在,如果我们想确保每个块都必须有一个完整的客户标签'<customer></customer>',我们可以使用下面的解决方案。
</customer>‘的结尾标记为同步点,这将保证客户开始标记'<customer>’不会在同一块中没有结束标记。有人能确认我的理解是否正确吗?除了这两个人,还有什么别的办法可以解决这个问题吗?
发布于 2015-03-07 16:25:07
记录不一定是映射器的本地记录,只是出于性能原因,它更可取。大多数MapReduce输入格式将在块结束后查找以完成块的最终记录。这会在进程中引入一些远程读取,但在读取总量中所占的比例通常非常低。
Mahout就是这样做的。每次它运行next()来创建一个新记录时,它都会从最后一个完成点开始扫描,并且只有当它确定它完全跨越分配给映射器的拆分时,它才拒绝返回下一个记录。
发布于 2016-07-01 15:00:08
您的理解是正确的,期望映射器运行在从块而不是完整块派生的分块上。所以地图绘制者肯定会更多。
因此,在存储XML文件时,它们将遵循序列化的概念,进入HDFS并在读取( SerDes )时反序列化--除了AVRO,还有其他的SerDes。比如节俭等。
https://stackoverflow.com/questions/28915507
复制相似问题