hadoop之MapReduce

概览

mapreduce总概览


Hadoop MapReduce是一个软件框架容易写处理大量数据的并行应用程序运行在大的集群之上。
MapReduce作业通常将输入数据集拆分为独立的块,这些块由map任务以完全并行的方式处理。框架对map的输出进行排序,然后输入到reduce任务。通常输入和输出都存储在文件系统之中。这个框架只关心tasks 调度,管理他们,以及重新执行失败的tasks。
通常,计算阶段和存储节点是一个,这是因为MapReduce框架和Hadoop Distributed File System(HDFS)都运行在相同的节点集上面。此配置允许框架有效地在已存在数据的节点上调度任务,从而在集群中产生非常高的聚合带宽。
MapReduce框架由一个主节点ResourceManager,一个从节点NodeManager(每个集群节点上)和一个MRAppMaster(每个application)组成。
我们编写一个MapReduce最少需要实现:应用程序通过适当的接口和/或抽象类的实现来指定输入/输出位置并提供map和reduce功能。这些和其他job参数包括在job configuration中
Hadoop job客户端提交job(jar/executable etc.),和configuration 给ResourceManager ResourceManager负责分发软件和配置给各个从节点,调度tasks并且管理他们,提供状态和诊断信息给客户端.
虽然Hadoop框架是用Java™实现的,但MapReduce应用程序不需要用Java编写。
Hadoop Streaming是一个实用程序,它允许用户使用任何可执行文件(例如shell实用程序)作为map和reducer创建和运行作业。
Hadoop Pipes是一个SWIG兼容的C ++ API,用于实现MapReduce应用程序(非基于JNI™).


输入和输出


MapReduce框架专门在<key,value>对上运行,也就是说,框架将作为一组<key,value>对的job输入视图,并生成一组<key,value>对作为输出,键值对可以是不同类型。
这个key和value class必须是基于框架可序列化的,于是他们必须实现Writable接口。额外的,key class必须实现WritableComparable接口去实现排序功能

MapReduce作业的输入和输出类型:
(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output)

 

MapReduce - User Interfaces


Mapper

 

Hadoop MapReduce框架为job的InputFormat生成的每个InputSplit生成一个map任务。

总的来说,Mapper的实现类通过Job.setMapperClass(Class)方法传递作业的Job。然后,框架为InputSplit中的每个键/值对调用该job的map(WritableComparable,Writable,Context)。然后,应用程序可以覆盖clean(Context)方法以执行任何所需的清理。
输出对不需要与输入对具有相同的类型。给定的输入对可以映射到零个或多个输出对。通过调用context.write(WritableComparable,Writable)来收集输出对。
应用程序可以使用计数器报告其统计信息.
随后将与给定输出键关联的所有中间值按框架分组,并传递给Reducer以确定最终输出。用户可以通过Job.setGroupingComparatorClass(Class)指定Comparator来控制分组。
对Mapper输出进行排序,然后根据Reducer进行分区。分区总数与作业的reduce任务数相同。用户可以通过实现自定义分区程序来控制哪些键(以及因此记录)转到哪个Reducer。
用户可以选择通过Job.setCombinerClass(Class)指定combiner来执行中间输出的本地聚合,这有助于减少从Mapper传输到Reducer的数据量。
中间排序的输出始终以简单(key-len,key,value-len,value)格式存储。应用程序可以控制是否以及如何压缩中间输出,以及通过配置使用CompressionCodec。


Reducer


Reducer减少中间集的值通过共享key。

作业的Reducer个数由用户通过Job.setNumReduceTasks(int)设置。

Reducer有3个主要阶段:shuffle,sort和reduce。

Shuffle


Reducer的输入是mappers排序后的输出,在这一步中框架抽取相应的分区数据到对应的reducer中通过http交换数据


Sort(分拣即分组)


框架在此阶段按键(因为不同的mapper可能输出相同的键)对Reducer输入进行分组。 Shuffle和Sort阶段同时发生;在获取map-outputs时,它们被合并。


Secondary Sort(二级排序)


如果要求对中间key进行分组的等价规则与在reducer之前对key进行分组的等价规则不同,则可以通过Job.setSortComparatorClass(Class)指定比较器。由于Job.setGroupingComparatorClass(Class)可用于控制中间键的分组方式,因此可以结合使用这些键来模拟值的二级排序。


Reduce


Reduce任务的输出通常通过Context.write(WritableComparable,Writable)写入FileSystem。 应用程序可以使用计数器报告其统计信息。
Reducer的输出是未排序。

Reducer NONE


如果不需要Reduce,将Reduce任务的数量设置为零是合法的。 在这种情况下,map-tasks的输出直接进入FileSystem,进入FileOutputFormat.setOutputPath(Job,Path)设置的输出路径。在将映射输出写入FileSystem之前,框架不会对mapper输出进行排序。


Partitioner


分区程序对key空间进行分区。
分区程序控制中间mapper输出的键key的分区。key(或key的子集)用于通常通过散列函数来导出分区。分区总数与作业的reduce任务数相同。因此,这控制m个reduce任务中的哪个中间key(以及因此记录)被发送以进行reduce。
HashPartitioner是默认的分区程序


Job Configuration

job通常用于指定Mapper,combiner(如果有),Partitioner,Reducer,InputFormat,OutputFormat实现。 FileInputFormat指示输入文件集(FileInputFormat.setInputPaths(作业,路径...)/ FileInputFormat.addInputPath(作业,路径))和(FileInputFormat.setInputPaths(作业,字符串...)/ FileInputFormat.addInputPaths(作业,字符串))和其中应该写入输出文件(FileOutputFormat.setOutputPath(Path))。
Job Control
Job.submit() : Submit the job to the cluster and return immediately.

Job.waitForCompletion(boolean) : Submit the job to the cluster and wait for it to finish.


Job Input


InputFormat

描述了MapReduce作业的输入规范。
MapReduce框架依赖于作业的InputFormat:
1 验证作业的输入规范。
2 将输入文件拆分为逻辑InputSplit实例,然后将每个实例分配给单个Mapper。
3 提供RecordReader实现,用于从逻辑InputSplit收集输入记录以供Mapper处理。

基于文件的InputFormat实现(通常是FileInputFormat的子类)的默认行为是根据输入文件的总大小(以字节为单位)将输入拆分为逻辑InputSplit实例。但是,输入文件的FileSystem块大小被视为输入拆分的上限。可以通过mapreduce.input.fileinputformat.split.minsize设置拆分大小的下限。
显然,基于输入大小的逻辑分割对于许多应用来说是不够的,因为必须标记记录边界。在这种情况下,应用程序应该实现一个RecordReader,它负责标记记录边界,并向单个任务提供逻辑InputSplit的面向记录的视图。
TextInputFormat 是默认的InputFormat。


InputSplit

InputSplit表示由单个Mapper处理的数据。 
通常,InputSplit提供面向字节的输入视图,RecordReader负责处理和呈现面向记录的视图。 FileSplit是默认的InputSplit。
RecordReader
RecordReader从InputSplit读取<key,value>对。 
通常,RecordReader转换由InputSplit提供的输入的面向字节的视图,并向Mapper实现呈现面向记录的视图以进行处理。因此,RecordReader承担处理记录边界的责任,并使用键和值显示任务。


Job Output

OutputFormat


OutputFormat描述了MapReduce作业的输出规范。
MapReduce框架依赖于作业的OutputFormat:
1 验证作业的输出规范;例如,检查输出目录是否已存在。 
2 提供用于写入作业输出文件的RecordWriter实现。输出文件存储在FileSystem中。
TextOutputFormat是默认的OutputFormat


RecordWriter


RecordWriter将输出<key,value>对写入输出文件。 RecordWriter实现将作业输出写入FileSystem。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值