hadoop随手笔记(2)--mapreduce的运行机理

来源:互联网 发布:英文软件翻译工具 编辑:程序博客网 时间:2024/06/03 15:01
(1)InputFormat输入格式:
里面定义了getSplits方法,主要将输入的文件分割成逻辑上的多个分片InputSplit,这里面的分片不是真正意义上的分片,只是逻辑上的分片,每个分片同伙输入文件的路径、开始时为止和偏移量三个信息来唯一标识。
使用createRecordReader方法去创建一个RecorReader记录读取器,分别读取输入分片中的键值对,交给Map处理:在MapReduce作业的时候会做以下工作:1.检查作业的输入是否有效。2.将输入文件分割成多个分片,并交给单独的Map进行处理,就是说map的个数是由分片的数量决定的。3.RecordReader作为传递的载体,将每个分片传递给map。
(2)CombineFileInputFormat组合文件输入格式
会将来自不同问价的分片打包成一个更大的输入分片,但是不会将来自不同机架中的文件放入到同一个输入分片中。当用户致电maxSpliteSize属性时,会将同一个数据节点的数据块组成一个输入分片,剩余的数据会与在同一个机架上其他手节点上的数据块组成一个分片。
(数据本地化:将数据即时的在计算节点上进行计算,而不是将数据放到计算节点在进行计算)


MR基本的文件输入格式:FileInputFormat文件输入格式、TextInputFormat文本文件输入格式、KeyValueTextInputFormat键值对文件输入格式、CombineFileInputFormat组合文件输入格式,SequenceFileInputFormat序列文件输入格式、DBInputFormat数据库输入格式
sequenceFile序列文件
是一个由二进制形式key/value的字节流组成的存储文件,类似于log文件,但是log文件存储的是纯文本文件。SequenceFile可压缩可切分,适合hadoop文件存储特性,SequenceFile分别提供了Writer、Reade、Sorter来实现对数据的读、写和排序,sequecefile是hdfs的一种文件类型,提倡一次写入多次读取,但是并不提倡多一个文件进行追加或者修改,其中该文件的三种压缩处理方式:
1.不压缩数据直接存储的方式。2压缩value值而不压缩key值存储的存储方式,使用enum.RECORD来标识。3key/value值都压缩的方式存储,使用enum.BLOCK来标识。
三种不同的压缩方式共用一个数据头,流方式的读取会先读取头字节去判断是那种方式的压缩,根据压缩方式去解压缩并反序列化字节流数据,得到可识别的数据。
MapFile映射文件
这类代表是一个基于从key到value的map文件,这里的一个map是一个目录,该目录下面包含两个文件,一个数据文件,数据文件中包含了map中的所有key姐value的值;另一个是一个比较小的索引文件,包含了key的一个fraction。
(3)DBInputFormata数据库输入格式:
hadoop存储开始的设计主要是针对于非结构化或者半结构化的数据进行存储与分析。主要以数据库记录作为输入格式,然后将记录交个Map函数进行处理。其中主要是在getspilite()方法使用例如SQL语句来获取结果集,并将结果集填充到输入分片中,在这里与M/R进行建立联系。避免资源的浪费,提高系统的性能,通过finally来保证在尽心数据操作的过程中是否出现了异常,当我们使用完数据库资源的以后都将它们成功释放掉。最后在createRecordReader方法会返回一个针对不同数据库产品来进行读取操作的RecordReader。
(4)MultipleInput多种输入格式
它并没有继承InputFormat类,也就是说不能直接作为Map输入来处理。只要是为下面的DelegatingInputFormat输入格式提供辅助作用。M/R作业可以有不同的输入路径,并且不同的输入路径对应着不用的InputFormat,同时也有可能不同的输入路径对应着不同的Map函数。
(5)DelegatingInputFormat授权输入格式
该类的主要作用是将不同的输入路径的处理授权给不同的InputFormat,而且每一个路径对应一个单独Mapper处理程序,在该类内部主要通过MultipleInput来获得Path与InputFormat、Mapper的对应关系。
(6)输入分片
输入分片InputSplite是一个单独的Map要处理的数据单元。输入分片的数据类型一般都是字节类型的。输入分片经过相应的RecordReader处理后,转化成记录试图的形式,然后交给Map处理。FileSplite类默认的是InputSplite,CombineFileSplite与CombineFileInputFormat输入格式相对应,对于前者是一个文件的一个输入分片,而厚重是代表来自多个文件的输入分片组成的一个输入分片,其中的每个CombineFileSplite会包含来自不同文件的数据块,但是在同一个分片中的所有数据块都是在同一个机架上。
(7)记录读取器RecordReader
初始化方法(只是执行一次)->取得输入分片中的下一个键值对->取得当前读取到的键值对中的键对象->取得键值对中的值对象->取得当前数据读取的进度,该方法会返回一个0.0--1.0之间的浮点数。
(8)输出格式OutputFormat
OutputFormat类描述了M/R作业的输出规范,决定了该作业的输出结果保存到哪里以及如何对输出结果进行持久化操作,完成以下的工作:1.检查作业的输出是否有效,比如目录是否存在,hadoop在运行作业之前是不允许输出目录存在的。2.提供一个RecordWrite类,将M/R作业的处理结果报错到指定文件系统的文件中。
(9)RecordWriter记录写入器
OutputFormat提供了RecordWriter用于将M/R作业的键值对结果写入到指定的输出中。
(10)输出提交器OutputCommitter
主要是控制M/R作业的输出环境,主要用来完成以下工作:1.在OutputCommitter初始化的时候启动job。比如会创建job的临时输出目录。2.在作业完成之后会清楚job申请的资源。比如会删除job的临时输出目录。3.为Mapper或者Reducer任务创建临时的输出目录。4.检查Mapper或者Reducer任务是否需要提交。5提交或者丢弃MapReucer任务的输出。
(11)Context与ID
hadoop中的每一个job以及组成的job的Map与Reduce任务都有一个唯一的标识,其中,JobID是系统分配给作业的唯一标识,他的字符串形式为job_<jobtrackerID>_<jobNumber>。TaskID是系统分配给任务的唯一标识,TaskID包含了它所属的作业ID,同时也有任务ID,同时还保持了这是否是一个Map任务。TaskID是字符串标识为task_<jobtrackerID>_<jobNumber>_[m|r]_<taskNumber>.
(12)OutputCommitter类
主要作用是在作业启动的时候在作业的输出目录下创建相应的临时目录,Mapper与Reducer的输出首先会写入到这些临时目录当中,当他们都成功完成后,临时目录的内容会转移到输出目录,之后临时目录会被删除。
(13)jobID
用来定位到job、杀死该job、查询该job运行情况。在执行一个job的时候会分成若干个Task,TaskAttemptID主要是在Mapper或者Reducer任务失败的时候重新执行该任务,为了标识同一个任务的多次尝试,使用该ID.
(14)Map处理过程
Mapper函数的最核心作用就是对输入的key/value进行处理,然后输出一系列的key/value集合。M/R框架会为由InputFormat生成的每一个输入分片InputSplit创建一个相应的Mapper处理函数,但是一个输入key/value键值对可能对应着0个或者多个输出key/value对。然后将具有相同输出的key的key/value键值对放在一起,然后将它们分发给相同的Reducer来处理,用户可以通过指定特定的RawComparator实现类来控制分组过程的执行,也可以通过制定Partitioner实现类来控制Mapper的输出被分发给哪个具体的Reducer进行处理。由于Reducer和Mapper一般会运行在不同的主机上,所以Reducer必须通过网络来获取Mapper的输出结果作为输入。
为了减少网络上的数据传输量,我们可以为作业指定相应的Combiner。该类一般会采用已经实现的Reducer来代替。Combiner会在Mapper端对Mapper的输出结果进行本地的聚集处理,从而减少发送给Reducer的数据量。另外一种减少Mapper发送给Reducer的数据的方法是采用想用的压缩机只对Mapper的输出进行压缩处理,这同时也减少了Mapper输出的key/value所占的存储空间的大小。此外,并不是所有的hadoop作业都有Reducer处理函数,当没有Reducer时,Mapper的处理结果会直接通过制定的OutputFormat写入到输出目录中。
在Mapper类中,setup()方法会在mapper任务开始的时候被调用一次,cleanup方法也只会在任务结束的时候被调用一次,
分类:InverseMapper反转Mapper、TokenCounterMapper标记计数Mapper、MultithreadedMapper多线程Mapper(主要工作原理就是启动多个线程来执行另一个Mapper中的map方法,这种方式可以有效的提供系统处理作业的能力,默认为10个线程)
(15)FiledSelectionMapper字段选择Mapper
将输入数据看做由用户指定的分隔符分隔的不同字段组成,默认的分隔符是tab。FiledSelectionMapper可以选择输入字段列表中的若干个字段作为输出的key和value。
(16)DelegatingMapper授权Mapper
(17)Reducer的数量是可以通过job的setNumReduceTasks来进行设置,
1.shuffle阶段:首先利用http网络协议将所有的Mapper的输出中与该Rducer相关的数据复制到Reducer的主机上。
2.sort阶段:M/R框架会将来自不同Mapper的具有相同key的输出key/value键值对按照key进行排列。
3.Reduce阶段:M/R框架会为已经分好组的每一个<key,(list of values)>调用一次reduce方法,Reducer的输出键值对是通过TaskInputOutputContext.write方法写入到RecordWrite中,然后由RecordWrite写入到真正的文件系统中。其中Reducer的输出并不是排好序的。
(18)Partitioner分区处理
主要是将Mapper处理之后的数据按照key分发给不同的Reducer任务进行处理
1.平均分布:即每个Reducer处理的Record数量应该尽可能相等
2.高效:由于在分发给不同的reducer之前都要经过partition进行处理,所以这个部分需要高效的算法实现。
(19)TotalOrderPartitioner全排序分区
每个mapper的输出是排好序的,但是不同的mapper的输出之间是没有顺序的,为了实现最终的Reducer的输出是排好序的,此时可以使用该类。为了排序,首先利用InputSample数据采样器来确定数据的分布情况。
(20)JobClient的执行过程分析

job的waitForCompletion方法内部实际上是依靠JobClient来向JobTracker来提交作业的,当JobTracker接收到JobClient的提交作业的请求后,会将作业加入到队列中,之后会返回给JobClient一个用于唯一标识作业的JobID对象。JobTracker作业队列中的作业会有TaskTracker来执行。TaskTracker会定期向JobTracker发送心跳,查询JobTracker是否有任务需要进行。如果有,JobTracker会将任务通过心跳响应分配给TaskTracker来执行。当TaskTracker接收到任务之后,会在本地启动一个Task来执行任务。


(21)其中job的设置在内部实现的时候也是对其conf进行设置,也可以对JVM进行设置。
(22)JobSunbmissionProtocol作业提交接口
这个协议借口是JobClient和JobTracker进行通信所需要的协议借口,在该接口总定义了JobClient用于向JobTracker提交作业、获取作业的执行信息等方法。该接口的实现类是JobTracker与LocalJobRunner。
(23)RunningJob正在运行的Job作业的接口,可以运行该实例去查询正在运行的job的相关信息。RunningJob中很多方法名和Job以及提到的JobSubmissionProtocol中的方法名一样,当客户端调用Job对象中的一个方法时,比如killJob方法,此时在reduceProgress内部调用的是Job中的JobClient返回的RunningJob对象中相对应的方法来完成相应的功能。而JobClient返回的RunningJob对象实例内部调用的是JobSubmissonProtocol接口实现类中所对应的方法,从而我们可以看出真正为我们提供功能的是JobSubmissionProtocol实现类JobTracker或者LocalJobRunner。
(24)JobStatus对象代表的是Job当前运行状态信息,这些信息无时无刻在改变,例如进度信息。JobProfile对象代表的是Job添加到M/R框架之后所携带的注册信息,这些信息是不会进行改变的。
(25)JobClient提交作业流程
1.向JobTracker请求一个新的作业ID对象JobID。2.检查Job的输入输出。hadoop不允许MR作业的输入为空,而且用户可以为MR作业指定多个输入目录。但是在运行作业前,输出目录是不能存在的,它是有MR框架为我们创建的。3.计算出作业的所有InputSplit输入分片数即需要的Mapper任务的数量。如果无法对输入文件进行划分,MR框架会抛出异常。4.启动与Job相关的分布式缓存DistributedCache。5.将作业运行需要的资源包括jar包、配置文件等从hadoop的分布式文件复制到JobTracker的文件系统的指定目录中。6.最后,将作业提交到JobTracker的作业队列中,并监控作业的运行状况。
(26)Job队形的submit或者waitForCompletion(内部也是调用的submit)来进行作业的提交,但是该方法的内部对象JobClient调用submitJobInternal方法来真正执行的,其实Job就是JobClient进行了包装。JobClient是用户作业与JobTracker进行交互的接口。
(27)用户指定的文件系统与JobTracker的文件系统。

当hadoop启动的时候,JobTracker是作为单独的一个JVM来运行的,包含有一个main方法是jobTracker的入口函数。JobTracker会一直等待JobClient通过RPC来提交作业,它调度JobClient提交的作业中的每一个任务,并监控他们的运行。当发现有失败的任务的时,JobTracker会重新执行它。并且每一个TaskTracker会一直向JobTracker发送心跳,询问JobTracker是否有任务需要进行处理,如果有任务要执行,JobTracker会将任务分配给TaskTracker来执行。

(28)Queue job队列对象,JobTracker是以队列的方式来管理用户提交的job的,Queue代表JobTracker中的一个Job队列,当用户提交Job的时候,会将job添加到用户指定的队列中。使用QueueManager Job队列管理对象管理所有的job队列,MR框架可以根据不同的作业调度器来定义一个或者多个作业队列。一些调度器只能在一个队列上面进行工作,而一些调度器可以在多个队列上进行工作。

(29)线程池中的线程重用,可以降低内存资源的利用度。

(30)JobTracker中的作业回去管理器RecoveryManager的主要作业就是在JobTracker宕机或者重启的时候,回复执行那些还有完成的job。JobTracker管理着一个系统目录,在JobClient向JobTracker提交job之前,会为提交的Job在系统的目录下面创建一个以Job的id命名的子目录,然后会把Job所需要的一切文件复制到它的目录下面,系统目录是由mapred.systerm.dir配置项所指定的。当一个job完成的时候,job会将系统目录下的子目录删除,JobTracker节点在重启的时候也会检查系统目录下有没有子目录。

(31)JobTracker作为一个单独的java进程来协调整个Job的运行,JobTracker负责调度处理JobClient提交的作业中的每一个任务,JobTracker会将Job分割成单独Task,然后提交到TaskTracker来执行。

(32)hadoop作业调度器概述

1.JobQueueTaskScheduler(FIFO调度器)

在hadoop早期的版本中,JobTracker是按照用户提交作业的顺序即先进先出调度算法来运行作业的。用户提交的所有作业会被添加到一个运行队列中,然后JobTracker首先会按照作业的优先级的高低,再按照作业提交的先后顺序来选择需要执行的作业。当使用这种算法时候,如果先提交的作业的执行时间很长的话,改作业之后的作业会迟迟得不到解决,从而影响用户的体验。

2.LimitTasksPerJobTaskScheduler

该调度器继承自JobQueueTaskScheduler,它在JobQueueTaskScheduler的基础上增加了对每个Job总的任务数的限制。

3.CapacityTaskScheduler(计算能力调度器)

支持多个队列,每个队列可配置一定的资源量,在每个对垒内部采用FIFO调度策略。默认情况下该调度器内部不支持优先级,但是可以在配置文件中开启此选项。如果支持优先级,那么调度算法就是带有优先级的FIFO算法。但是该调度器不支持优先级抢占,一旦一个作业开始执行,在执行完之前它的资源不会被高优先级作业所抢占。为了防止同一个用户的作业独占队列的资源,该调度器会对同一用户提交的作业所占资源量进行限定。该调度器执行调度时候,首先会计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,选择一个该比值最小的队列;选择了一个队列之后,然后按照队列中的作业优先级和提交时间顺序来选择一个作业,同时需要考虑用户组员量限制和内存限制。

4.FairScheduler(公平调度器)

发明于facebook,作用的对象与计算能力调度器一样。公平调度器保证了小弟任务能够快速的相应,同时也保证了最大任务的服务水平。

在hadoop,JobQueueTaskScheduler与LimitTasksPerJobTaskScheduler被加载在hadoop中,但是CapacityTaskScheduler与FairScheduler调度器作为hadoop的扩展模块,需要进行配置。

0 0
原创粉丝点击