MR框架的其他组件可用内存也是可配置的。map和reduce任务的性能可以通过从影响操作并发和数据磁盘IO次数的角度来调试。监控针对单个任务而设置的文件系统计数器,尤其是具体到map输出到reduce的数据字节量,对调试影响任务运行性能都是非常有用的。
如果内存管理特性启用的话,用户可以选择性的覆盖一些默认配置,比如虚拟内存,RAM。下面是一些对任务有效的参数:
名称 | 类型 | 特点 |
mapred.task.maxvmem | int | 以字节为单位指定单个map或reduce任务的最大虚拟内存。如果任务超过该值就被kill |
mapred.task.maxpmem | int | 以字节为单位指定单个map或reduce任务的最大RAM。这个值被调度器(Jobtracer)参考作为分配map\reduce任务的依据,避免让一个节点超RAM负载使用。 |
map读出的一条记录将被序列化到一个buffer,元数据存储在元数据buffer中。如上面所说,当序列化buffer或者元数据buffer超出了设置的阙值,buffer中内容将被排序并在后台写入到磁盘,这个过程同时map持续输出记录行。如果buffer被写满就会发生一个spill过程,spill中map线程被阻塞。当map完成后,buffer中剩余记录写入磁盘并和在磁盘的按段存储的记录合并到一个文件中。减少spill次数可以缩短map时间,但是较大的buffer也会降低可用内存。
名称 | 类型 | 特点 |
io.sort.mb | int | 默认100。以MB为单位设置序列化和元数据buffer的大小。 |
io.sort.record.percent | float | 默认0.05。map记录序列化后数据元数据buffer所占总buffer百分比值。为了加速排序,除了序列化后本身尺寸外每条序列化后的记录需要16字节的元数据。io.sort.mb值被占用的百分比值超过设定值机会发生spill。对输出记录较少的map,值越高越可降低spill发生的次数。 |
io.sort.spill.percent | float | 默认0.80。元数据和序列化数据buffer空间阀值。当两者任何一个buffer空间达到该阀值,数据将被spill到磁盘。假设io.sort.record.percent=r, io.sort.mb=x,io.sort.spill.percent=q,那么在map线程spill之前最大处理的记录量为r*x*q*2^16。注意:较大的值可能降低spill的次数甚至避免合并,但是也会增加map被阻塞的几率。通过精确估计map的输出尺寸和减少spill次数可有效缩短map处理时间。 |
其他注意事项:
如前面所说,每个reduce通过HTTP获取map输出后读入内存,并周期性合并这些输出到磁盘。如果map输出压缩打开的话,每个输出将会解压后读入内存。下面的配置参数影响reduce处理中的合并和内存分配过程。
名称 | 类型 | 特点 |
io.sort.factor | int | 默认值10。指定同时可合并的文件片段数目。参数限制了打开文件的数目,压缩解码器。如果文件数超过了该值,合并将分成多次。这个参数一般适用于map任务,大多数作业应该配置该项。 |
mapred.inmem.merge.threshold | int | 在内存中合并到磁盘前读取已排序map输出文件的数目。类似前面说的spill阙值,该值不是一个用来分区的单元而是一个触发器。通常该值较高(1000),或者不启用(0),毕竟内存内合并比磁盘上合并成本更低。这个阙值只影响shuffle过程的内存合并。 |
mapred.job.shuffle.merge.percent | float | 0.66。内存合并前供map输出享有的内存百分比值,超过该值就会合并数据到磁盘。过大的值会降低获取和合并的并行效率。相反如果输入恰好整个放到内存,则可以设置为1.0。该参数只影响shuffle过程的内存合并频率。 |
mapred.job.shuffle.input.buffer.percent | float | 默认值0.7。shuffle过程中缓存map输出数据的内存占整个子jvm进程堆最大尺寸(通过mapred.child.java.opts设置)的百分比。该值可以视情况设置较高的值来存储大的较多的map输出。 |
mapred.job.reduce.input.buffer.percent | float | 0.0 内存合并中从内存刷到磁盘,直到剩余的map输出占用的内存少于jvm最大堆的该百分比值。默认情况下,在reduce开始之前需要保证最大的内存可用,所有的内存中map输出都会被合并到磁盘。对内存不敏感的reduce任务,该值可以适当提高,来避免磁盘IO(一般不会有)。 |
其他注意事项:
可以通过指定mapred.job.reuse.jvm.num.tasks作业配置参数来启用jvm重用。默认是1,jvm不会被重用(每个jvm只处理1个任务)。如果设置为-1,那么一个jvm可以运行同一个作业的任意任务数目。用户可以通过JobConf.setNumTasksToExecutePerJvm(int)指定一个大于1的值。
下面是作业执行时的配置参数:
名称 | 类型 | 描述 |
mapred.job.id | string | 表示jobid |
mapred.jar | string | job.jar在job路径下的位置 |
job.local.dir | string | 作业共享路径 |
mapred.tip.id | string | taskid |
mapred.task.id | string | task尝试任务id |
mapred.task.is.map | boolean | 是否是map任务 |
mapred.task.partition | int | task在job中的id |
map.input.file | string | map输入文件路径 |
map.input.start | long | map输入split开始偏移量 |
map.input.length | long | map输入分片的字节数 |
mapred.work.output.dir | string | 任务临时输出路径 |
任务的标准输出和错误流日志由TaskTracker读入并写入${HADOOP LOGDIR}/userlogs路径。
DistributedCache可以被用来发布map或者reduce用到的jar包、本地共享库。子JVM进程通常可使用java.library.path和LD LIBRARYPATH指定其自身的工作路径。缓存库可以通过 System.loadLibrary或者 System.load加载。关于使用distributed cache 加载共享库详细信息可以查看 Loading native libraries through DistributedCache。
?
原文地址:Hadoop教程(三): MR重要运行参数, 感谢原作者分享。
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com