MapReuce中对大数据处理最合适的数据格式是什么?
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可以相应地处理数据。 以下显示了JSON对象示例: 该技巧假设每行一个JSON对象,以下代码显示了在此示例中使用的JSON文件: 现在将JSON文件复制到HDFS并运行MapReduce代码。MapReduce代码写入每个JSON key/value对并输出: 写JSON 类似于3.2.1节,编写XML的方法也可用于编写JSON。 Pig Elephant Bird包含一个JsonLoader和LzoJsonLoader,可以使用它来处理Pig中的JSON,这些加载器使用基于行的JSON。每个Pig元组都包含该行中每个JSON元素的chararray字段。 Hive Hive包含一个可以序列化JSON的DelimitedJSONSerDe类,但遗憾的是无法对其进行反序列化,因此无法使用此SerDe将数据加载到Hive中。 总结 此解决方案假定JSON输入的结构为每个JSON对象一行。那么,如何使用跨多行的JSON对象?GitHub上有一个项目( https://github.com/alexholmes/json-mapreduce)可以在单个JSON文件上进行多个输入拆分,此方法可搜索特定的JSON成员并检索包含的对象。 你可以查看名为hive-json-serde的Google项目,该项目可以同时支持序列化和反序列化。 正如你所看到的,在MapReduce中使用XML和JSON是非常糟糕的,并且对如何布局数据有严格要求。MapReduce对这两种格式的支持也很复杂且容易出错,因为它们不适合拆分。显然,需要查看具有内部支持且可拆分的替代文件格式。 下一步是研究更适合MapReduce的复杂文件格式,例如Avro和SequenceFile。 3.3 大数据序列化格式 当使用scalar或tabular数据时,非结构化文本格式很有效。诸如XML和JSON之类的半结构化文本格式可以对包括复合字段或分层数据的复杂数据结构进行建模。但是,当处理较大数据量时,我们更需要具有紧凑序列化表单的序列化格式,这些格式本身支持分区并具有模式演变功能。 在本节中,我们将比较最适合MapReduce大数据处理的序列化格式,并跟进如何将它们与MapReduce一起使用。 3.3.1 比较SequenceFile,Protocol Buffers,Thrift和Avro 根据经验,在选择数据序列化格式时,以下特征非常重要:
表3.1比较了流行的数据序列化框架,以了解它们如何相互叠加。以下讨论提供了有关这些技术的其他背景知识。 表3.1数据序列化框架的功能比较 让我们更详细地看一下这些格式。 SequenceFile 创建SequenceFile格式是为了与MapReduce、Pig和Hive一起使用,因此可以很好地与所有工具集成。缺点主要是缺乏代码生成和版本控制支持,以及有限的语言支持。 Protocol Buffers (编辑:辽源站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |