MapReuce中对大数据处理赏罚最吻合的数据名目是什么?
副问题[/!--empirenews.page--]
【新品产上线啦】51CTO播客,随时随地,碎片化进修
在本章的第一章节先容中,我们简朴相识了Mapreduce数据序列化的观念,以及其对付XML和JSON名目并不友爱。本节作为《Hadoop从入门到能干》大型专题的第三章第二节将教各人如安在Mapreduce中行使XML和JSON两大常见名目,并说明较量最得当Mapreduce大数据处理赏罚的数据名目。 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)中读取属性名称和值。 第一步是对功课举办设置: ![]() Mahout的XML输入名目很简略,我们必要指定文件搜刮简直切开始和竣事XML标志,并行使以下要领拆分文件(并提取记录):
接下来,你必要编写一个映射器来行使Mahout的XML输入名目。Text表单已提供XML元素,因此必要行使XML理会器从XML中提取内容。 ![]() 表3.1 行使Java的STAX理会器提取内容 该map具有一个Text实例,该实例包括start和end标志之间数据的String暗示。在此代码中,我们可以行使Java的内置Streaming API for XML(StAX)理会器提取每个属性的键和值并输出。 假如针对Cloudera的core-site.xml运行MapReduce功课并行使HDFS cat呼吁表现输出,将看到以下内容: ![]() 此输出表现已乐成行使XML作为MapReduce的输入序列化名目。不只云云,还可以支持庞大的XML文件,由于输入名目支持拆分XML。 写XML 当可以正常读XML之后,我们要办理的就是怎样写XML。 在reducer中,挪用main reduce要领之前和之后城市产生回调,可以行使它来发出开始和竣事标志,如下所示。 ![]() ![]() 表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文件。 办理方案 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |