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

自媒体 自媒体

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

[原文来自:www.666j.com]

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

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文件。

解决方案

Elephant Bird LzoJsonInputFormat被用来作为创建输入格式类以使用JSON元素的基础,该方法可以使用多行JSON。

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

图3.7 使用JSON和多个输入拆分的问题示例

讨论

Elephant Bird(https://github.com/kevinweil/elephant-bird)是一个开源项目,包含用于处理LZOP压缩的有用程序,它有一个可读取JSON的LzoJsonInputFormat,尽管要求输入文件是LZOP-compressed。,但可以将Elephant Bird代码用作自己的JSON InputFormat模板,该模板不具有LZOP compression要求。

此解决方案假定每个JSON记录位于单独的行上。JsonRecordFormat很简单,除了构造和返回JsonRecordFormat之外什么也没做,所以我们将跳过该代码。JsonRecordFormat向映射器发出LongWritable,MapWritable key/value,其中MapWritable是JSON元素名称及其值的映射。

我们来看看RecordReader的工作原理,它使用LineRecordReader,这是一个内置的MapReduce读取器。要将该行转换为MapWritable,读取器使用json-simple解析器将该行解析为JSON对象,然后迭代JSON对象中的键并将它们与其关联值一起放到MapWritable。映射器在LongWritable中被赋予JSON数据,MapWritable pairs可以相应地处理数据。

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

以下显示了JSON对象示例:

MapReuce中对大数据处理最合适的数据格式是什么?
自媒体微信号:666j扫描二维码关注公众号
爱八卦,爱爆料。

Copyright2018.大树自媒体资讯站,让大家及时掌握各行各业第一手资讯新闻!