首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hadoop:如何将XML文件存储在HDFS中并由Mappers处理?

Hadoop:如何将XML文件存储在HDFS中并由Mappers处理?
EN

Stack Overflow用户
提问于 2015-03-07 13:45:14
回答 2查看 2K关注 0票数 2

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

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

代码语言:javascript
复制
    <?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号。一些分裂块可能会像下面这样结束。

代码语言:javascript
复制
   ...
   ...

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

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

  1. Avro :将每个客户XML转换为Avro类型,就像记录类型一样,并使用Avro序列化并将该文件作为HDFS中的“Avro数据文件”,这支持拆分性,并可以保证块中完整的Avro记录。
  2. 序列文件:--我不确定这一个,但我认为我们可以在创建序列文件时标记同步点,这是在将文件分割成块时使用的。在这里,我们可以将每个客户标签'</customer>‘的结尾标记为同步点,这将保证客户开始标记'<customer>’不会在同一块中没有结束标记。

有人能确认我的理解是否正确吗?除了这两个人,还有什么别的办法可以解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-07 16:25:07

记录不一定是映射器的本地记录,只是出于性能原因,它更可取。大多数MapReduce输入格式将在块结束后查找以完成块的最终记录。这会在进程中引入一些远程读取,但在读取总量中所占的比例通常非常低。

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

票数 1
EN

Stack Overflow用户

发布于 2016-07-01 15:00:08

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

因此,在存储XML文件时,它们将遵循序列化的概念,进入HDFS并在读取( SerDes )时反序列化--除了AVRO,还有其他的SerDes。比如节俭等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28915507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档