加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

MapReuce中对大数据处理最合适的数据格式是什么?

发布时间:2018-09-21 00:04:19 所属栏目:教程 来源:赵钰莹
导读:【新品产上线啦】51CTO播客,随时随地,碎片化学习 在本章的第一章节介绍中,我们简单了解了Mapreduce数据序列化的概念,以及其对于XML和JSON格式并不友好。本节作为《Hadoop从入门到精通》大型专题的第三章第二节将教大家如何在Mapreduce中使用XML和JSON两
副标题[/!--empirenews.page--] 【新品产上线啦】51CTO播客,随时随地,碎片化学习

在本章的第一章节介绍中,我们简单了解了Mapreduce数据序列化的概念,以及其对于XML和JSON格式并不友好。本节作为《Hadoop从入门到精通》大型专题的第三章第二节将教大家如何在Mapreduce中使用XML和JSON两大常见格式,并分析比较最适合Mapreduce大数据处理的数据格式。

MapReuce中对大数据处理最合适的数据格式是什么?

3.2.1 XML

XML自1998年诞生以来就作为一种数据格式来表示机器和人类都可读的数据。它成为系统之间数据交换的通用语言,现在被许多标准所采用,例如SOAP和RSS,并且被用作Microsoft Office等产品的开放数据格式。

MapReduce和XML

MapReduce捆绑了与文本一起使用的InputFormat,但没有支持XML,也就是说,原生Mapreduce对XML十分不友好。在MapReduce中并行处理单个XML文件很棘手,因为XML不包含其数据格式的同步标记。

问题

希望在MapReduce中使用大型XML文件,并能够并行拆分和处理。

解决方案

Mahout的XMLInputFormat可用于MapReduce处理HDFS中的XML文件。 它读取由特定XML开始和结束标记分隔的记录,此技术还解释了如何在MapReduce中将XML作为输出发送。

MapReduce不包含对XML的内置支持,因此我们转向另一个Apache项目——Mahout,一个提供XML InputFormat的机器学习系统。 要了解XML InputFormat,你可以编写一个MapReduce作业,该作业使用Mahout的XML输入格式从Hadoop的配置文件(HDFS)中读取属性名称和值。

第一步是对作业进行配置:

MapReuce中对大数据处理最合适的数据格式是什么?

Mahout的XML输入格式很简陋,我们需要指定文件搜索的确切开始和结束XML标记,并使用以下方法拆分文件(并提取记录):

  • 文件沿着HDFS块边界分成不连续的部分,用于数据本地化。
  • 每个map任务都在特定的输入拆分上运行,map任务寻求输入拆分的开始,然后继续处理文件,直到第一个xmlinput.start。
  • 重复发出xmlinput.start和xmlinput.end之间的内容,直到输入拆分的末尾。

接下来,你需要编写一个映射器来使用Mahout的XML输入格式。Text表单已提供XML元素,因此需要使用XML解析器从XML中提取内容。

MapReuce中对大数据处理最合适的数据格式是什么?
表3.1 使用Java的STAX解析器提取内容

该map具有一个Text实例,该实例包含start和end标记之间数据的String表示。在此代码中,我们可以使用Java的内置Streaming API for XML(StAX)解析器提取每个属性的键和值并输出。

如果针对Cloudera的core-site.xml运行MapReduce作业并使用HDFS cat命令显示输出,将看到以下内容:

MapReuce中对大数据处理最合适的数据格式是什么?

此输出显示已成功使用XML作为MapReduce的输入序列化格式。不仅如此,还可以支持巨大的XML文件,因为输入格式支持拆分XML。

写XML

当可以正常读XML之后,我们要解决的就是如何写XML。 在reducer中,调用main reduce方法之前和之后都会发生回调,可以使用它来发出开始和结束标记,如下所示。

MapReuce中对大数据处理最合适的数据格式是什么?
MapReuce中对大数据处理最合适的数据格式是什么?
表3.2 用于发出开始和结束标记的reducer

这也可以嵌入到OutputFormat中。

Pig

如果想在Pig中使用XML,Piggy Bank library(用户贡献的Pig代码库)包含一个XMLLoader。其工作方式与此技术非常相似,可捕获开始和结束标记之间的所有内容,并将其作为Pig元组中的单字节数组字段提供。

Hive

目前没有办法在Hive中使用XML,必须写一个自定义SerDe。

总结

Mahout的XmlInputFormat可帮助使用XML,但它对开始和结束元素名称的精确字符串匹配很敏感。如果元素标记包含具有变量值的属性,无法控制元素生成或者可能导致使用XML命名空间限定符,则此方法不可用。

如果可以控制输入中的XML,则可以通过在每行使用单个XML元素来简化此练习。这允许使用内置的MapReduce基于文本的输入格式(例如TextInputFormat),它将每一行视为记录并拆分。

值得考虑的另一个选择是预处理步骤,可以将原始XML转换为每个XML元素的单独行,或者将其转换为完全不同的数据格式,例如SequenceFile或Avro,这两种格式都解决了拆分问题。

现在,你已经了解如何使用XML,让我们来处理另一种流行的序列化格式JSON。

3.2.2 JSON

JSON共享XML的机器和人类可读特征,并且自21世纪初以来就存在。它比XML简洁,但是没有XML中丰富的类型和验证功能。

如果有一些代码正在从流式REST服务中下载JSON数据,并且每小时都会将文件写入HDFS。由于下载的数据量很大,因此生成的每个文件大小为数千兆字节。

如果你被要求编写一个MapReduce作业,需要将大型JSON文件作为输入。你可以将问题分为两部分:首先,MapReduce没有与JSON一起使用的InputFormat; 其次,如何分割JSON?

图3.7显示了拆分JSON问题。 想象一下,MapReduce创建了一个拆分,如图所示。对此输入拆分进行操作的map任务将执行对输入拆分的搜索,以确定下一条记录的开始。对于诸如JSON和XML之类的文件格式,由于缺少同步标记或任何其他标识记录开头,因此知道下一条记录何时开始是很有挑战性的。

JSON比XML等格式更难分割成不同的段,因为JSON没有token(如XML中的结束标记)来表示记录的开头或结尾。

问题

希望在MapReduce中使用JSON输入,并确保可以为并发读取分区输入JSON文件。

解决方案

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读