2.2Map任务

2.2 Map任务

  Map阶段的效率是由作业的输入数据的特点决定的。我们已经知道,过多的小文件会出现大量的分片,从而导致Map任务的激增。另一个需要特别注意的重要统计项是Map任务的平均运行时间。太多或者太少的Map任务都会对作业的性能产生不利影响。关键时让这两者达到一个平衡点,二这又取决于应用和数据本身。根据实践总结的一条经验法则是:单个Map任务的执行的时间大约保持在1至3分钟。

2.2.1 dfs.blocksize属性

回到前面计算InputSplit大小的公式:

InputSplitSize=Max( minSplitSize, Min(blocksize,maxSplitSize)

为了让Map任务处理更大的InputSplit。可以通过如下的方法:

  • 增加参数fileinputformat.split.minsize,使其大于块的容量
  • 增加文件存储在HDFS中的块的容量

  前者导致数据本地化的问题,例如InputSplit可能会包含其他主机的块;或者能够维持数据都在本地节点,但要求你重新加载HDFS文件。你可以使用下面的命令来完成这个操作。文件tiny.dat.txt以块容量512MB的方式上传到HDFS中,而默认的块容量是128MB(之前的版本是64MB)。

hadoop fs -D dfs.blocksize=536870912 -put tiny.dat.txt tiny.dat.newblock.txt

//512*1024*1024 = 536 870 912

2.2.2 中间输出结果的排序与溢出

[//MapReduce中默认的一次排序过程是在Map任务中]
  环形缓冲区的大小通过mapreduce.task.io.sort.mb属性配置的,这个参数的默认值为100,也就是100MB容量。这个属性会被mapred-default.xml或mapred-site.xml文件中设定的该属性值覆盖,被缓冲的键-值对记录已经被序列化,但是没有被排序。
  为实际输出记录而申请的缓存的使用率有一个软阈值,由mapreduce.task.io.sort.spill.percent属性设置。这个属性的默认值是0.8,也就是当输出记录占据了缓存的80%的空间时,就会被存储到磁盘中。
  当占用的环形缓存空间超出软阈值后,溢出行为会在一个后台线程执行。Map任务不会因为缓存溢出而阻塞。但是,如果环形缓冲的占用达到了硬限制,Map任务将会被阻塞,直到溢出行为结束为止。溢出行为所在的线程会将记录基于键进行分区,在内存中将每个分区的记录按键排序,然后写到一个文件中。每次溢出,都有一个独立的文件存储。按键排序的算法可以通过map.sort.class属性来指定。默认的算法时快速排序,在org.apache.hadoop.util.QuickSort中实现。分区算法的类是通过mapreduce.partitioner.class属性设置的。缓存溢出线程通过这个类的一个实例来决定这些分区分配给哪个Reduce任务。
 &emspp;一旦Map任务完成,缓存溢出的各个文件将会以按键排序后的状态合并到一个输出文件中。mapreduce.cluster.local.dir参数包含了这些输出文件应该放置的目录。在写入各个输出文件时,同时合并文件的流(stream)的数量是通过mapreduce.task.io.sort.factor参数指定的。它的默认值是10,也就是,这个步骤将会同时打开10个文件来执行合并。

2.2.3 本地reducer和Combiner

如果指定了Combiner,它可能在两个地方被调用:

  • 当缓存溢出线程将缓存存放到磁盘时
  • 当缓存溢出文件正在被合并到单一输出文件以便给Reducer任务消费时

  无论何时,当为作业设置Combiner类时,前者都将被调用;然而,后者仅有在缓存溢出的数量超过mapreduce.map.combine.minsplits属性配置的值时才会发生。这个上限的默认值为3,也就是说,只有缓存溢出的数量至少达到3时,才会在合并的时候调用Combiner。

2.2.4 获取中间输出结果——Map侧

  Reducer需要通过网络获取Map任务的输出结果,然后才能执行Reduce任务。因此,网络往往是一个分布式系统的瓶颈。可以通过下述Map侧的优化来减轻网络负载。

  • Map任务的中间输出结果使用一个合适的压缩编码进行压缩。为了能使用压缩,需要将mapreduce.map.output.compress属性设置为true,而压缩编码的类型可以通过mapreduce.map.output.compress.codec属性来指定。有很多压缩方法可以选择。
  • Reduce任务在获取Map任务的输出分片时,使用的时HTTP协议。可以使用mapreduce.tasktracker.http.threads属性指定Reduce任务执行HTTP请求的线程的数量。每个http读取请求需要一个独立的线程执行。如果这个属性设置很小的值,由于请求需要排队,会导致获取数据的请求延时增加。这个属性的默认值是40,也就是40个线程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值