Apache Hadoop MapReduce的高​​级功能是什么?

总览

基本的MapReduce编程说明了工作流程的详细信息。 但这并未涵盖MapReduce编程框架内的实际工作细节。 本文将说明通过MapReduce体系结构进行的数据移动以及用于进行实际处理的API调用。 我们还将讨论针对特定应用需求的定制技术和功能覆盖。

介绍

先进的MapReduce功能描述了执行和较低级别的细节。 在普通的MapReduce编程中,仅知道API及其用法就足以编写应用程序。 但是必须了解MapReduce的内部细节,才能了解实际的工作细节并获得信心。

现在,让我们在以下各节中讨论高级功能。

自定义类型(数据)

对于用户提供的Mapper和Reducer,Hadoop MapReduce框架始终使用类型化数据。 通过Mappers和Reducers传递的数据存储在Java对象中。

  • 可写接口:可写接口是最重要的接口之一。 可以与文件进行封送和通过网络封送的对象使用此接口。 Hadoop还使用此接口以序列化形式传输数据。 下面提到一些实现Writable接口的类
  1. 文本类(存储字符串数据)
  2. 可写
  3. 浮动可写
  4. 可写
  5. 布尔可写

还可以通过实现Writable接口来创建自定义数据类型。 Hadoop能够传输实现可写接口的任何自定义数据类型(符合您的要求)。

以下是可写接口,它具有两个方法readFields和write。 第一种方法(readFields)从“ in”二进制流中包含的数据中初始化对象的数据。 第二种方法(写入)用于将对象重构为二进制流“输出”。 整个过程中最重要的约定是对二进制流的读取和写入顺序相同。

清单1:显示可写界面

public interface Writable {

void readFields(DataInput in);

void write(DataOutput out);

}

自定义类型(键)

在上一节中,我们讨论了有关自定义数据类型以满足特定于应用程序的数据需求的情况。 它仅管理价值部分。 现在,我们还将讨论有关自定义键类型的信息。 在Hadoop MapReduce中,Reducer按排序顺序处理密钥。 因此,自定义键类型需要实现称为WritableComparable的接口。 键类型还应该实现hashCode()。

以下是显示WritableComparable接口。 它代表一个可写的 ,也是可比较的。

清单2:显示WritableComparable接口

public interface WritableComparable<T>

extends Writable, Comparable<T>

如何使用自定义类型

我们已经讨论了可以由Hadoop处理的自定义值和键类型。 现在,我们将讨论该机制,以便Hadoop可以理解它。 JobConf对象(定义作业)有两个方法,分别称为setOutputKeyClass()setOutputValueClass() ,这些方法用于控制值和键数据类型。 如果Mapper产生与Reducer不匹配的其他类型,则可以使用JobConf的setMapOutputKeyClass()setMapOutputValueClass()方法来设置Reducer期望的输入类型。

更快的性能

默认的排序过程要慢一些,因为它首先从流中读取键类型,然后解析字节流(使用readFields()方法),然后最终调用键类的compareTo()方法。 更快的方法是通过检查字节流而不解析整个数据集来确定键之间的顺序。 为了实现这种更快的比较机制,可以使用特定于您的数据类型的比较器来扩展WritableComparator类。 以下是类声明。  

清单3:显示WritableComparator

public class WritableComparator

extends Object

implements RawComparator

因此,自定义数据和键类型允许在Hadoop框架中使用更高级别的数据结构。 在实际的Hadoop应用程序中,自定义数据类型是最重要的要求之一。 因此,此功能允许使用自定义可写类型,并显着提高了性能。

输入格式

InputFormat是最重要的接口之一,用于定义MapReduce作业的输入规范。 Hadoop提供了不同类型的InputFormat来解释各种类型的输入数据。 最常见和默认的是TextInputFormat ,用于从文本文件读取行。 同样, SequenceFileInputFormat用于读取二进制文件格式。

InputFormat的基本任务是从输入文件中读取数据。 根据您的应用程序需求,也可以实现自定义InputFormat 。 对于默认的TextInputFormat实现,键是行的字节偏移量,值是以'\ n'字符结尾的行的内容。 对于自定义实现,分隔符可以是任何字符,并且InputFormat将相应地进行解析。

InputFormat的另一项工作是将输入文件(数据源)拆分为片段,这些片段是映射任务的输入。 这些片段/拆分被封装在InputSplit接口的实例中。 输入数据源可以是数据库表,xml文件或其他文件之类的任何东西。 因此,将根据应用程序要求进行拆分。 最重要的一点是,拆分操作应该快速且便宜。

分割文件后,从各个分割中读取操作非常重要。 RecordReader负责从拆分读取数据。 RecordReader应该足够有效,以处理以下事实:拆分并不总是在行尾整齐地结束。 即使RecordReader越过了拆分的理论末尾,它也始终会读取到行尾。 此功能对于避免丢失可能已经超过InputSplit边界的记录非常重要。

  • 自定义InputFormat:在基本应用程序中,直接使用InputFormat 。 但是对于自定义读取,最好的方法是将FileInputFormat子类化。 这个抽象类提供了根据应用程序需求来操作文件的功能。 对于自定义分析,必须重写getRecordReader ()方法,该方法返回RecordReader的实例。 该RecordReader负责读取和解析。
  • 备用源(数据): InputFormat描述了两件事,首先是将数据呈现给Mapper,其次是数据源。 大多数实现基于FileInputFormat ,其中数据源是HDFS(Hadoop分布式文件系统)的本地文件系统。但是对于其他类型的数据源,需要自定义实现InputFormat。 例如,像HBase这样的NoSQL数据库提供TableInputFormat来从数据库表中读取数据。 因此,数据源可以是可以通过自定义实现处理的任何数据。

输出格式

OutputFormat负责写操作。 我们已经讨论了InputFormatRecordReader接口负责将数据读入MapReduce程序。 处理完数据后,对永久存储的写操作由OutputFormatRecordWriter接口管理。 默认格式为TextOutputFormat ,它将键/值对作为字符串写入输出文件。 另一种输出格式是SequenceFileOutputFormat ,它将数据保留为二进制形式。 所有这些类都使用Writable类的write()readFields()方法。

需要自定义OutputFormat实现,以自定义格式写入数据。 必须扩展FileOutputFormat抽象类以进行自定义。 必须将JobConf.setOutputFormat()方法修改为使用其他自定义格式。

资料分割

分区可以定义为确定哪个Reducer实例将接收哪个中间键/值对的过程。 每个映射器都应为其所有输出键/值对确定目标Reducer。 最重要的一点是,对于任何键,无论其Mapper实例如何,目标分区都是相同的。 出于性能原因,映射器从不相互通信特定键的分区。

Hadoop系统使用Partitioner接口来确定键/值对的目标分区。 分区数应与reduce任务数相匹配。 MapReduce框架确定作业开始时的分区数。

以下是Partitioner接口的签名。

清单4:显示Partitioner界面

public interface Partitioner<K2,V2>

extends JobConfigurable

结论

在此讨论中,我们介绍了最重要的Hadoop MapReduce功能。 这些功能有助于自定义。 在实际的MapReduce应用程序中,API的默认实现使用很少。 相反,自定义功能(基于公开的API)具有重大影响。 一旦概念清晰,所有这些定制都可以轻松完成。 希望本文对理解高级功能及其实现有所帮助。

翻译自: https://www.javacodegeeks.com/2015/07/what-are-the-advanced-apache-hadoop-mapreduce-features.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值