博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过inputSplit分片size控制map数目
阅读量:6694 次
发布时间:2019-06-25

本文共 2757 字,大约阅读时间需要 9 分钟。

hot3.png

前言:在具体执行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
 {   @Override   public RecordReader
      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);//设置最大分片大小

转载于:https://my.oschina.net/u/1451042/blog/352810

你可能感兴趣的文章
javascript之cookie, localstorage, sessionstorge
查看>>
面试总结1
查看>>
Python pymysql数据库之建库建表、增删改查
查看>>
webpack打包多页面的方式
查看>>
DOM元素动态监控
查看>>
如何学习游戏开发?游戏开发如何入门?Unity3D好学吗?怎么学习,学习路线是什么?...
查看>>
SpringBoot实战历程视频教程横空出世啦!
查看>>
2018/12/29
查看>>
电脑蓝屏代码含义
查看>>
大三现在,大四第一学期就要实习
查看>>
最基础的一些入门级Android源码例子整理
查看>>
转载来的ubuntu 12.04 安装qq
查看>>
C#.NET中的 sender Tag 功能在支持多语言的通用权限管理系统组件中的实际应用范例...
查看>>
Swift 的 结构体
查看>>
以太网通道
查看>>
exercise_1
查看>>
Java设计模式之建造者模式
查看>>
Spring 与Hibernate 整合
查看>>
Scala编译器安装
查看>>
BGP中COMMUNITY属性
查看>>