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

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

发布时间:2018-09-21 00:04:19 所属栏目:教程 来源:赵钰莹
导读:【新品产上线啦】51CTO播客,随时随地,碎片化学习 在本章的第一章节介绍中,我们简单了解了Mapreduce数据序列化的概念,以及其对于XML和JSON格式并不友好。本节作为《Hadoop从入门到精通》大型专题的第三章第二节将教大家如何在Mapreduce中使用XML和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中对大数据处理最合适的数据格式是什么?
MapReuce中对大数据处理最合适的数据格式是什么?

该技巧假设每行一个JSON对象,以下代码显示了在此示例中使用的JSON文件:

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

现在将JSON文件复制到HDFS并运行MapReduce代码。MapReduce代码写入每个JSON key/value对并输出:

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

写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

根据经验,在选择数据序列化格式时,以下特征非常重要:

  • 代码生成——某些序列化格式具有代码生成作用的库,允许生成丰富的对象,使更容易与数据交互。生成的代码还提供了类似安全性等额外好处,以确保消费者和生产者使用正确的数据类型。
  • 架构演变 - 数据模型随着时间的推移而发展,重要的是数据格式支持修改数据模型的需求。模式演变功能允许你添加、修改并在某些情况下删除属性,同时为读和写提供向后和向前兼容性。
  • 语言支持 - 可能需要使用多种编程语言访问数据,主流语言支持数据格式非常重要。
  • 数据压缩 - 数据压缩非常重要,因为可以使用大量数据。并且,理想的数据格式能够在写入和读取时内部压缩和解压缩数据。如果数据格式不支持压缩,那么对于程序员而言,这是一个很大的问题,因为这意味着必须将压缩和解压缩作为数据管道的一部分进行管理(就像使用基于文本的文件格式一样)。
  • 可拆分性 - 较新的数据格式支持多个并行读取器,可读取和处理大型文件的不同块。文件格式包含同步标记至关重要(可随机搜索和扫描到下一条记录开头)。
  • 支持MapReduce和Hadoop生态系统 - 选择的数据格式必须支持MapReduce和其他Hadoop生态系统关键项目,例如Hive。如果没有这种支持,你将负责编写代码以使文件格式适用于这些系统。

表3.1比较了流行的数据序列化框架,以了解它们如何相互叠加。以下讨论提供了有关这些技术的其他背景知识。

MapReuce中对大数据处理最合适的数据格式是什么?
表3.1数据序列化框架的功能比较

让我们更详细地看一下这些格式。

SequenceFile

创建SequenceFile格式是为了与MapReduce、Pig和Hive一起使用,因此可以很好地与所有工具集成。缺点主要是缺乏代码生成和版本控制支持,以及有限的语言支持。

Protocol Buffers

(编辑:核心网)

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

热点阅读