MapReduce用户接口和数据流Word格式.docx
- 文档编号:20847114
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:25
- 大小:302.45KB
MapReduce用户接口和数据流Word格式.docx
《MapReduce用户接口和数据流Word格式.docx》由会员分享,可在线阅读,更多相关《MapReduce用户接口和数据流Word格式.docx(25页珍藏版)》请在冰豆网上搜索。
然后,框架为这个任务的InputSplit中每个键值对调用一次map(WritableComparable,Writable,OutputCollector,Reporter)操作。
应用程序可以通过重写Closeable.close()方法来执行相应的清理工作。
输出键值对不需要与输入键值对的类型一致。
通过调用OutputCollector.collect(WritableComparable,Writable)可以收集输出的键值对。
应用程序可以使用Reporter报告进度,设定应用级别的状态消息,更新Counters(计数器),或者仅是表明自己运行正常。
框架随后会把与一个特定key关联的所有中间过程的值(value)分成组,然后把它们传给Reducer以产出最终的结果。
用户可以通过JobConf.setOutputKeyComparatorClass(Class)来指定具体负责分组的Comparator。
Mapper的输出被排序后,就被划分给每个Reducer。
分块的总数目和一个作业的reduce任务的数目是一样的。
用户可以通过实现自定义的Partitioner来控制哪个key被分配给哪个Reducer。
用户可选择通过JobConf.setCombinerClass(Class)指定一个combiner,它负责对中间过程的输出进行本地的聚集,这会有助于降低从Mapper到Reducer数据传输量。
这些被排好序的中间过程的输出结果保存的格式是(key-len,key,value-len,value),应用程序可以通过JobConf控制对这些中间结果是否进行压缩以及怎么压缩,使用哪种CompressionCodec。
那么需要多少个Map?
Map的数目通常是由输入数据的大小决定的,一般就是所有输入文件的总块(block)数。
Map正常的并行规模大致是每个节点(node)大约10到100个map,对于CPU消耗较小的map任务可以设到300个左右。
由于每个任务初始化需要一定的时间,因此,比较合理的情况是map执行的时间至少超过1分钟。
这样,如果你输入10TB的数据,每个块(block)的大小是128MB,你将需要大约82,000个map来完成任务,除非使用setNumMapTasks(int)
2Reducer
Reducer将与一个key关联的一组中间数值集归约(reduce)为一个更小的数值集。
用户可以通过JobConf.setNumReduceTasks(int)设定一个作业中reduce任务的数目。
概括地说,对Reducer的实现者需要重写JobConfigurable.configure(JobConf)方法,这个方法需要传递一个JobConf参数,目的是完成Reducer的初始化工作。
然后,框架为成组的输入数据中的每个<
key,(listofvalues)>
对调用一次reduce(WritableComparable,Iterator,OutputCollector,Reporter)方法。
之后,应用程序可以通过重写Closeable.close()来执行相应的清理工作。
Reducer有3个主要阶段:
shuffle、sort和reduce。
Shuffle
Reducer的输入就是Mapper已经排好序的输出。
在这个阶段,框架通过HTTP为每个Reducer获得所有Mapper输出中与之相关的分块。
Sort
这个阶段,框架将按照key的值对Reducer的输入进行分组(因为不同mapper的输出中可能会有相同的key)。
Shuffle和Sort两个阶段是同时进行的;
map的输出也是一边被取回一边被合并的。
SecondarySort
如果需要中间过程对key的分组规则和reduce前对key的分组规则不同,那么可以通过JobConf.setOutputValueGroupingComparator(Class)来指定一个Comparator。
再加上JobConf.setOutputKeyComparatorClass(Class)可用于控制中间过程的key如何被分组,所以结合两者可以实现按值的二次排序。
Reduce
在这个阶段,框架为已分组的输入数据中的每个<
Reduce任务的输出通常是通过调用OutputCollector.collect(WritableComparable,Writable)写入文件系统的。
应用程序可以使用Reporter报告进度,设定应用程序级别的状态消息,更新Counters(计数器),或者仅是表明自己运行正常。
Reducer的输出是没有排序的。
那么需要多少个Reduce?
Reduce的数目建议是0.95或1.75乘以(<
no.ofnodes>
*mapred.tasktracker.reduce.tasks.
maximum)。
用0.95,所有reduce可以在maps一完成时就立刻启动,开始传输map的输出结果。
用1.75,速度快的节点可以在完成第一轮reduce任务后,可以开始第二轮,这样可以得到比较好的负载均衡的效果。
增加reduce的数目会增加整个框架的开销,但可以改善负载均衡,降低由于执行失败带来的负面影响。
上述比例因子比整体数目稍小一些是为了给框架中的推测性任务(speculative-tasks)或失败的任务预留一些reduce的资源。
无Reducer情况
如果没有归约要进行,那么设置reduce任务的数目为零是合法的。
这种情况下,map任务的输出会直接被写入由setOutputPath(Path)指定的输出路径。
框架在把它们写入FileSystem之前没有对它们进行排序。
3Partitioner
Partitioner用于划分键值空间(keyspace)。
Partitioner负责控制map输出结果key的分割。
Key(或者一个key子集)被用于产生分区,通常使用的是Hash函数。
分区的数目与一个作业的reduce任务的数目是一样的。
因此,它控制将中间过程的key(也就是这条记录)应该发送给m个reduce任务中的哪一个来进行reduce操作。
HashPartitioner是默认的Partitioner。
4Reporter
Reporter是用于Map/Reduce应用程序报告进度,设定应用级别的状态消息,更新Counters(计数器)的机制。
Mapper和Reducer的实现可以利用Reporter来报告进度,或者仅是表明自己运行正常。
在那种应用程序需要花很长时间处理个别键值对的场景中,这种机制是很关键的,因为框架可能会以为这个任务超时了,从而将它强行杀死。
另一个避免这种情况发生的方式是,将配置参数mapred.task.timeout设置为一个足够高的值(或者干脆设置为零,则没有超时限制了)。
应用程序可以用Reporter来更新Counter(计数器)。
5OutputCollector
OutputCollector是一个Map/Reduce框架提供的用于收集Mapper或Reducer输出数据的通用机制(包括中间输出结果和作业的输出结果)。
HadoopMap/Reduce框架附带了一个包含许多实用型的mapper、reducer和partitioner的类库。
1.2作业配置
JobConf代表一个Map/Reduce作业的配置。
JobConf是用户向Hadoop框架描述一个Map/Reduce作业如何执行的主要接口。
框架会按照JobConf描述的信息忠实地去尝试完成这个作业,然而:
∙一些参数可能会被管理者标记为final,这意味它们不能被更改。
∙一些作业的参数可以被直截了当地进行设置(例如:
setNumReduceTasks(int)),而另一些参数则与框架或者作业的其他参数之间微妙地相互影响,并且设置起来比较复杂(例如:
setNumMapTasks(int))。
通常,JobConf会指明Mapper、Combiner(如果有的话)、Partitioner、Reducer、InputFormat和OutputFormat的具体实现。
JobConf还能指定一组输入文件(setInputPaths(JobConf,Path...)/addInputPath(JobConf,Path))和(setInputPaths(JobConf,String)/addInputPaths(JobConf,String))以及输出文件应该写在哪儿(setOutputPath(Path))。
JobConf可选择地对作业设置一些高级选项,例如:
设置Comparator;
放到DistributedCache上的文件;
中间结果或者作业输出结果是否需要压缩以及怎么压缩;
利用用户提供的脚本(setMapDebugScript(String)/setReduceDebugScript(String))进行调试;
作业是否允许预防性(speculative)任务的执行(setMapSpeculativeExecution(boolean))/(setReduceSpeculativeExecution(boolean));
每个任务最大的尝试次数(setMaxMapAttempts(int)/setMaxReduceAttempts(int));
一个作业能容忍的任务失败的百分比(setMaxMapTaskFailuresPercent(int)/setMaxReduceTaskFailuresPercent(int));
等等。
当然,用户能使用set(String,String)/get(String,String)来设置或者取得应用程序需要的任意参数。
然而,DistributedCache的使用是面向大规模只读数据的。
1.3任务的执行和环境
TaskTracker是在一个单独的jvm上以子进程的形式执行Mapper/Reducer任务(Task)的。
子任务会继承父TaskTracker的环境。
用户可以通过JobConf中的mapred.child.java.opts配置参数来设定子jvm上的附加选项,例如:
通过-Djava.library.path=<
>
将一个非标准路径设为运行时的链接用以搜索共享库,等等。
如果mapred.child.java.opts包含一个符号@taskid@,它会被替换成map/reduce的taskid的值。
下面是一个包含多个参数和替换的例子,其中包括:
记录jvmGC日志;
JVMJMX代理程序以无密码的方式启动,这样它就能连接到jconsole上,从而可以查看子进程的内存和线程,得到线程的dump;
还把子jvm的最大堆尺寸设置为512MB,并为子jvm的java.library.path添加了一个附加路径。
<
property>
name>
mapred.child.java.opts<
/name>
value>
-Xmx512M-Djava.library.path=/home/mycompany/lib-verbose:
gc-Xloggc:
/tmp/@taskid@.gc
-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false
/value>
/property>
用户或管理员也可以使用mapred.child.ulimit设定运行的子任务的最大虚拟内存。
mapred.child.ulimit的值以(KB)为单位,并且必须大于或等于-Xmx参数传给JavaVM的值,否则VM会无法启动。
注意:
mapred.child.java.opts只用于设置tasktracker启动的子任务。
为守护进程设置内存选项请查看第三章Hadoop部署中集群部署相关内容。
${mapred.local.dir}/taskTracker/是tasktracker的本地目录,用于创建本地缓存和job。
它可以指定多个目录(跨越多个磁盘),文件会半随机的保存到本地路径下的某个目录。
当job启动时,tasktracker根据配置文档创建本地job目录,目录结构如以下所示:
∙${mapred.local.dir}/taskTracker/archive/:
分布式缓存。
这个目录保存本地的分布式缓存。
因此本地分布式缓存是在所有task和job间共享的。
∙${mapred.local.dir}/taskTracker/jobcache/$jobid/:
本地job目录。
o
${mapred.local.dir}/taskTracker/jobcache/$jobid/work/:
job指定的共享目录。
各个任务可以使用这个空间做为暂存空间,用于它们之间共享文件。
这个目录通过job.local.dir参数暴露给用户。
这个路径可以通过APIJobConf.getJobLocalDir()来访问。
它也可以被做为系统属性获得。
因此,用户(比如运行streaming)可以调用System.getProperty("
job.local.dir"
)获得该目录。
${mapred.local.dir}/taskTracker/jobcache/$jobid/jars/:
存放jar包的路径,用于存放作业的jar文件和展开的jar。
job.jar是应用程序的jar文件,它会被自动分发到各台机器,在task启动前会被自动展开。
使用apiJobConf.getJar()函数可以得到job.jar的位置。
使用JobConf.getJar().getParent()可以访问存放展开的jar包的目录。
${mapred.local.dir}/taskTracker/jobcache/$jobid/job.xml:
一个job.xml文件,本地的通用的作业配置文件。
${mapred.local.dir}/taskTracker/jobcache/$jobid/$taskid:
每个任务有一个目录task-id,它里面有如下的目录结构:
▪${mapred.local.dir}/taskTracker/jobcache/$jobid/$taskid/job.xml:
一个job.xml文件,本地化的任务作业配置文件。
任务本地化是指为该task设定特定的属性值。
这些值会在下面具体说明。
▪${mapred.local.dir}/taskTracker/jobcache/$jobid/$taskid/output一个存放中间过程的输出文件的目录。
它保存了由framwork产生的临时mapreduce数据,比如map的输出文件等。
▪${mapred.local.dir}/taskTracker/jobcache/$jobid/$taskid/work:
task的当前工作目录。
${mapred.local.dir}/taskTracker/jobcache/$jobid/$taskid/work/tmp:
task的临时目录。
(用户可以设定属性mapred.child.tmp来为map和reducetask设定临时目录。
缺省值是./tmp。
如果这个值不是绝对路径,它会把task的工作路径加到该路径前面作为task的临时文件路径。
如果这个值是绝对路径则直接使用这个值。
如果指定的目录不存在,会自动创建该目录。
之后,按照选项-Djava.io.tmpdir='
临时文件的绝对路径'
执行java子任务。
pipes和streaming的临时文件路径是通过环境变量TMPDIR='
theabsolutepathofthetmpdir'
设定的)。
如果mapred.child.tmp有./tmp值,这个目录会被创建。
1.4作业的提交与监控
JobClient是用户提交的作业与JobTracker交互的主要接口。
JobClient提供提交作业,追踪进程,访问子任务的日志记录,获得Map/Reduce集群状态信息等功能。
1作业提交过程包括:
1.检查作业输入输出样式细节
2.为作业计算InputSplit值。
3.如果需要的话,为作业的DistributedCache建立必须的统计信息。
4.拷贝作业的jar包和配置文件到FileSystem上的Map/Reduce系统目录下。
5.提交作业到JobTracker并且监控它的状态。
作业的历史文件记录到指定目录的"
_logs/history/"
子目录下。
这个指定目录由hadoop.job.history.user.location设定,默认是作业输出的目录。
因此默认情况下,文件会存放在mapred.output.dir/_logs/history目录下。
用户可以设置hadoop.job.history.user.location为none来停止日志记录。
用户使用下面的命令可以看到在指定目录下的历史日志记录的摘要。
$bin/hadoopjob-historyoutput-dir
这个命令会打印出作业的细节,以及失败的和被杀死的任务细节。
要查看有关作业的更多细节例如成功的任务、每个任务尝试的次数(taskattempt)等,可以使用下面的命令
$bin/hadoopjob-historyalloutput-dir
用户可以使用OutputLogFilter从输出目录列表中筛选日志文件。
一般情况,用户利用JobConf创建应用程序并配置作业属性,然后用JobClient提交作业并监视它的进程。
2作业的控制
有时候,用一个单独的Map/Reduce作业并不能完成一个复杂的任务,用户也许要链接多个Map/Reduce作业才行。
这是容易实现的,因为作业通常输出到分布式文件系统上的,所以可以把这个作业的输出作为下一个作业的输入实现串联。
然而,这也意味着,确保每一作业完成(成功或失败)的责任就直接落在了客户身上。
在这种情况下,可以用的控制作业的选项有:
∙runJob(JobConf):
提交作业,仅当作业完成时返回。
∙submitJob(JobConf):
只提交作业,之后需要你轮询它返回的RunningJob句柄的状态,并根据情况调度。
∙JobConf.setJobEndNotificationURI(String):
设置一个作业完成通知,可避免轮询。
Venus神庙
Theflyingflyisflyinginthehighandbigsky...
分布式基础学习【二】——分布式计算系统(Map/Reduce)
二.分布式计算(Map/Reduce)
分布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按GoogleMap/Reduce框架所设计的分布式框架。
在Hadoop中,分布式文件系统,很大程度上,是为各种分布式计算需求所服务的。
我们说分布式文件系统就是加了分布式的文件系统,类似的定义推广到分布式计算上,我们可以将其视为增加了分布式支持的计算函数。
从计算的角度上看,Map/Reduce框架接受各种格式的键值对文件作为输入,读取计算后,最终生成自定义格式的输出文件。
而从分布式的角度上看,分布式计算的输入文件往往规模巨大,且分布在多个机器上,单机计算完全不可支撑且效率低下,因此Map/Reduce框架需要提供一套机制,将此计算扩展到无限规模的机器集群上进行。
依照这样的定义,我们对整个Map/Reduce的理解,也可以分别沿着这两个流程去看。
。
在Map/Reduce框架中,每一次计算请求,被称为作业。
在分布式计算Map/Reduce框架中,为了完成这个作业,它进行两步走的战略,首先是将其拆分成若干个Map任务,分配到不同的机器上去执行,每一个Map任务拿输入文件的一部分作为自己的输入,经过一些计算,生成某种格式的中间文件,这种格式,与最终所需的文件格式完全一致,但是仅仅包含一部分数据。
因此,等到所有Map任务完成后,它会进入下一个步骤,用以合并这些中间文件获得最后的输出文件。
此时,系统会生成若干个Reduce任务,同样也是分配到不同的机器去执行,它的目标,就是将若干个Map任务生成的中间文件为汇总到最后的输出文件中去。
当然,这个汇总不总会像1+1=2那么直接了当,这也就是Reduce任务的价值所在。
经过如上步骤,最终,作业完成,所需的目标文件生成。
整个算法的关键,就在于增加了一个中间文件生成的流程,大大提高了灵活性,使其分布式扩展性得到了保证。
I.术语对照
和分布式文件系统一样,Google、Hadoop和....我,各执一种方式表述统一概念,为了保证其统一性,特有下表。
文中翻译
Hadoop术语
Google术语
相关解释
作业
Job
用户的每一个计算请求,就称为一个作业。
作业服务器
JobTracker
Master
用户提交作业的服务器,同时,它还负责各个作业任务的分配,管理所有的任
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MapReduce 用户 接口 数据流