文档章节

FileInputFormat导读getSplits

Zero零_度
 Zero零_度
发布于 2015/01/09 14:17
字数 395
阅读 160
收藏 1

/**
   * Generate the list of files and make them into FileSplits.
   * @param job the job context
   * @throws IOException
   */
  public List<InputSplit> getSplits(JobContext job) throws IOException {
    Stopwatch sw = new Stopwatch().start();
    //获得一个InputSplit能够包含的最小值
    long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
    //获得一个InputSplit能够包含的最大值
    long maxSize = getMaxSplitSize(job);

    // generate splits
    List<InputSplit> splits = new ArrayList<InputSplit>();
    List<FileStatus> files = listStatus(job);
    /*
     * 由此可知,如果有一百万个小文件,就会循环一百万次,并且至少生成一百万个InputSplit,就至少含有一百万个map任务
     * 如果一个InputSplit的默认大小是一个block大小,即64M
     * 一个20M的文件会产生一个InputSplit,一个Map任务
     * 一个80M的文件会产生两个InputSplit,两个Map任务
     * 两个分别为20M的文件总共产生两个InputSplit,两个Map任务
     * 一个20M、一个70M的文件总共会产生三个InputSplit,三个Map任务
     */
    for (FileStatus file: files) {
      Path path = file.getPath();
      long length = file.getLen();
      if (length != 0) {
        BlockLocation[] blkLocations;
        if (file instanceof LocatedFileStatus) {
          blkLocations = ((LocatedFileStatus) file).getBlockLocations();
        } else {
          FileSystem fs = path.getFileSystem(job.getConfiguration());
          blkLocations = fs.getFileBlockLocations(file, 0, length);
        } if (isSplitable(job, path)) {
          //拿到hdfs默认的block块大小
          long blockSize = file.getBlockSize();
          //计算一个InputSplit的大小
          long splitSize = computeSplitSize(blockSize, minSize, maxSize);

          long bytesRemaining = length;
          while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
            int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
            splits.add(makeSplit(path, length-bytesRemaining, splitSize,
                        blkLocations[blkIndex].getHosts(),
                        blkLocations[blkIndex].getCachedHosts()));
            bytesRemaining -= splitSize;
          }

          if (bytesRemaining != 0) {
            int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
            splits.add(makeSplit(path, length-bytesRemaining, bytesRemaining,
                       blkLocations[blkIndex].getHosts(),
                       blkLocations[blkIndex].getCachedHosts()));
          }
        } else { // not splitable
          splits.add(makeSplit(path, 0, length, blkLocations[0].getHosts(),
                      blkLocations[0].getCachedHosts()));
        }
      } else {
        //Create empty hosts array for zero length files
        splits.add(makeSplit(path, 0, length, new String[0]));
      }
    }
    // Save the number of input files for metrics/loadgen
    job.getConfiguration().setLong(NUM_INPUT_FILES, files.size());
    sw.stop();
    if (LOG.isDebugEnabled()) {
      LOG.debug("Total # of splits generated by getSplits: " + splits.size() + ", TimeTaken: " + sw.elapsedMillis());
    }
    return splits;
  }

© 著作权归作者所有

共有 人打赏支持
Zero零_度
粉丝 69
博文 1253
码字总数 256245
作品 0
程序员
私信 提问
MapReducer之Mapper中的Split切片原理(即影响MapTask数目的原因)

今天看到有朋友问到了MapTask的相关问题,我觉得有必要发个博客结合源码整个解析一下. 一、首先,我们看到Map运行的时候不同文件启动了不同数量的map任务,但是JOB中又没有设置map数量的配置,...

ProgrammerJiang
2016/03/18
379
2
MapReduce源码之FileInputFormat

FileInputFormat是所有基于文件的InputFormat的基类。这个基类提供了getSplits的通用性实现。FileInputFormat的子类需要覆写isSplitable方法来确保input-files不能被切分,并且被作为一个整体...

Yulong_
2017/08/11
0
0
Hadoop源代码分析(包mapreduce.lib.input)

接下来我们按照MapReduce过程中数据流动的顺序,来分解org.apache.hadoop.mapreduce.lib.*的相关内容,并介绍对应的基类的功能。首先是input部分,它实现了MapReduce的数据输入部分。类图如下...

超人学院
2015/05/22
0
0
InputFormat加载数据

InputFormat是一个抽象类,其定义如下: InputFormat会对数据进行两方面的处理: 对输入数据进行逻辑切分,形成一个个split 针对每个split,新建一个RecorReader读取split里面的数据,形成一...

Jason_typ
06/13
0
0
自定义 hadoop MapReduce InputFormat 切分输入文件

在上一篇中,我们实现了按 cookieId 和 time 进行二次排序,现在又有新问题:假如我需要按 cookieId 和 cookieId&time 的组合进行分析呢?此时最好的办法是自定义 InputFormat,让 mapreduc...

大数据之路
2013/05/26
0
16

没有更多内容

加载失败,请刷新页面

加载更多

我的Linux系统九阴真经

我的Linux系统九阴真经 在今天,互联网的迅猛发展,科技技术也日新月异,各种编程技术也如雨后春笋一样,冒出尖来了。各种创业公司也百花齐放百家争鸣,特别是针对服务行业,新型互联网服务行...

linuxCool
10分钟前
0
0
Python程序员需要知道的30个技巧

1 直接交换两个数字位置 1x, y = 10, 202print(x, y)3x, y = y, x4print(x, y)5#1 (10, 20)6#2 (20, 10) 2 比较运算符的链接 1n = 102result = 1 < n < 203print(result)4# True5result = 1 ......

糖宝lsh
10分钟前
0
0
[LintCode] Linked List Cycle(带环链表)

描述 给定一个链表,判断它是否有环。 样例 给出 -21->10->4->5, tail connects to node index 1,返回 true。 这里解释下,题目的意思,在英文原题中,tail connects to node index 1 表示的...

honeymose
21分钟前
3
0
Android :报错Your project path contains non-ASCII characters.

报错内容如下 Your project path contains non-ASCII characters. This will most likely cause the build to fail on Windows. Please move your project to a different directory. See ht......

lanyu96
32分钟前
3
0
Nginx平滑添加模块

Nginx已经编译安装并运行了一段时间, 然后某一天, 发现需要用到某个模块但当初没有编译, 这个时候怎么办呢? 卸载重新安装肯定可以的, 如果Nginx版本没有变更的话, 则有一个相对平滑的方法来添...

老菜鸟0217
37分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部