文档章节

通过inputSplit分片size控制map数目

仙剑奇侠
 仙剑奇侠
发布于 2014/12/05 15:31
字数 619
阅读 3K
收藏 5

前言:在具体执行Hadoop程序的时候,我们要根据不同的情况来设置Map的个数。除了设置固定的每个节点上可运行的最大map个数外,我们还需要控制真正执行Map操作的任务个数。
 1.如何控制实际运行的map任务个数
 我们知道,文件在上传到Hdfs文件系统的时候,被切分成不同的Block块(默认大小为64MB)。但是每个Map处理的分块有时候并不是系统的物理Block块大小。实际处理的输入分块的大小是根据InputSplit来设定的,那么InputSplit是怎么得到的呢?

 InputSplit=Math.max(minSize, Math.min(maxSize, blockSize)

 其中:minSize=mapred.min.split.size

     maxSize=mapred.max.split.size

我们通过改变InputFormat中分片的多少来控制实际使用的Map数量,而控制InputFormat中的分片多少就需要控制每个InputSplit分片的大小
 2.如何控制每个split分片的大小
 Hadoop默认的输入格式是TextInputFormat,他里边定义了文件读取的方式和分片的方式。我们打开他的源文件(org.apache.hadoop.mapreduce.lib.input包中):

package org.apache.hadoop.mapreduce.lib.input;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionCodecFactory;
import org.apache.hadoop.io.compress.SplittableCompressionCodec;
import org.apache.hadoop.mapreduce.InputFormat;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.JobContext;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
public class TextInputFormat extends FileInputFormat<LongWritable, Text> {
   @Override
   public RecordReader<LongWritable, Text> 
     createRecordReader(InputSplit split,
                       TaskAttemptContext context) {
     return new LineRecordReader();
   }
   @Override
   protected boolean isSplitable(JobContext context, Path file) {
     CompressionCodec codec = 
       new CompressionCodecFactory(context.getConfiguration()).getCodec(file);
     if (null == codec) {
       return true;
     }
     return codec instanceof SplittableCompressionCodec;
   }
}

通过源代码,我们发现TextInputFormat继承了FileInputFormat,而在TextInputFormat中,我们并没有发现具体的进行文件切分的部分,TextInputFormat应该是采用了FileInputFormat默认的InputSplit方法。因此,我们打开FileInputFormat的源代码,在其中发现:
 

 public static void setMinInputSplitSize(Job job,long size) {
     job.getConfiguration().setLong("mapred.min.split.size", size);
   }
   public static long getMinSplitSize(JobContext job) {
     return job.getConfiguration().getLong("mapred.min.split.size", 1L);
   }
   
 public static void setMaxInputSplitSize(Job job,long size) {
     job.getConfiguration().setLong("mapred.max.split.size", size);
   }
   public static long getMaxSplitSize(JobContext context) {
     return context.getConfiguration().getLong("mapred.max.split.size",Long.MAX_VALUE);
   }

如上我们可以看到,Hadoop在这里实现了对mapred.min.split.size和mapred.max.split.size的定义,且默认值分别为1和Long的最大。因此,我们在程序只需重新赋值给这两个值就可以控制InputSplit分片的大小了。
3.假如我们想要设置的分片大小为10MB
 则我们可以在MapReduce程序的驱动部分添加如下代码:

TextInputFormat.setMinInputSplitSize(job,1024L);//设置最小分片大小

TextInputFormat.setMaxInputSplitSize(job,1024×1024×10L);//设置最大分片大小

© 著作权归作者所有

仙剑奇侠
粉丝 2
博文 6
码字总数 3056
作品 0
成都
程序员
私信 提问
MapReduce Application中mapper的数目和分片的数目

问题 MapReduce Application中mapper的数目和分片的数目是一样的 默认情况下,分片和输入文件的分块数是相等的。也不完全相等,如果block size大小事128M,文件大小为128.1M,文件的block数目...

残风vs逝梦
2014/07/09
908
0
Spark中Task,Partition,RDD、节点数、Executor数、core数目的关系

梳理一下Spark中关于并发度涉及的几个概念File,Block,Split,Task,Partition,RDD以及节点数、Executor数、core数目的关系。 输入可能以多个文件的形式存储在HDFS上,每个File都包含了很多...

晴天哥
2018/03/07
0
0
在Spark集群中,集群的节点个数、RDD分区个数、​cpu内核个数三者与并行度的关系??

梳理一下Spark中关于并发度涉及的几个概念File,Block,Split,Task,Partition,RDD以及节点数、Executor数、core数目的关系。 输入可能以多个文件的形式存储在HDFS上,每个File都包含了很多...

Zero零_度
2016/07/18
250
0
Hadoop输入和输出的处理类(7)

hadoop输入的处理类 InputFormat InputFormat负责处理MR的输入部分。 作用: 1、验证作业的输入是否规范。 2、把输入文件切分成InputSplit。 3、提供RecordReader的实现类,把InputSplit读到...

肖鋭
2014/03/01
220
0
MapReduce编程job概念原理

  在Hadoop中,每个MapReduce任务都被初始化为一个job,每个job又可分为两个阶段:map阶段和reduce阶段。这两个阶段分别用两个函数来表示。Map函数接收一个形式的输入,然后同样产生一个形式...

雪童子
2016/05/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

0121 spring-boot-redis的使用

redis是什么呢?redis,属于NoSQL的一种,在互联网时代,起到加速系统的作用。 redis是一种内存数据库,支持7种数据类型的存储,性能1S 10w次读写; redis提供的简单的事务保证了高并发场景下...

李福春carter
21分钟前
28
0
redis的有序集合研究

假设执行下面的操作 jedis.zadd("myzset", System.currentTimeMillis(), "An error is returned when key exists but does not hold a sorted set.\r\n" + "\r\n" ......

强子大叔的码田
39分钟前
33
0
如何防止favicon.ico请求?

我没有favicon.ico,但IE总是提出请求。 是否可以阻止浏览器从我的网站请求favicon? 也许HTML标题中有一些META-TAG? #1楼 你不能。 您所能做的就是使该图像尽可能小,并在将来设置一些缓存...

技术盛宴
40分钟前
34
0
如何在Subversion中返回旧版本的代码?

我正和一位朋友一起开展一个项目,我想回到我们代码的旧版本并将其设置为当前版本。 我该怎么做? 我在vs08上使用“anksvn”。 我在我的电脑上有我想要的版本,但提交失败了; 我得到的消息是...

javail
55分钟前
62
0
全网最全RabbitMQ总结,别再说你不会RabbitMQ

RabbitMQ入门教程 当初我学RabbitMQ的时候,第一时间就上GitHub找相应的教程,但是令我很失望的是没有找到,Spring,Mybatis之类的教程很多,而RabbitMQ的教程几乎找不到,看的最多的就是朱小...

erlieStar
今天
52
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部