1. /** Splits files returned by {@link #listStatus(JobConf)} when
  2. * they're too big.*/
  3. public InputSplit[] getSplits(JobConf job, int numSplits)
  4. throws IOException {
  5. //计时器,
  6. StopWatch sw = new StopWatch().start();
  7. //
  8. FileStatus[] files = listStatus(job);
  9.  
  10. // Save the number of input files for metrics/loadgen
  11. //设置配置中文件个数mapreduce.input.fileinputformat.numinputfiles
  12. job.setLong(NUM_INPUT_FILES, files.length);
  13. // 计算所有文件的大小总和
  14. long totalSize = 0; // compute total size
  15. for (FileStatus file: files) { // check we have valid files
  16. if (file.isDirectory()) {
  17. throw new IOException("Not a file: "+ file.getPath());
  18. }
  19. totalSize += file.getLen();
  20. }
  21. // 每个split目标大小,用总的文件大小 / (max(设置的split个数,1)),
  22. long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);
  23. // 每个split大小的最小值,读取mapreduce.input.fileinputformat.split.minsize配置,如果没有配置的话那么
  24. // 取minSplitSize =1
  25. long minSize = Math.max(job.getLong(org.apache.hadoop.mapreduce.lib.input.
  26. FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize);
  27.  
  28. // 生成 splits
  29. ArrayList<FileSplit> splits = new ArrayList<FileSplit>(numSplits);
  30. NetworkTopology clusterMap = new NetworkTopology();
  31. //遍历文件列表
  32. for (FileStatus file: files) {
  33. //获取一个文件路径
  34. Path path = file.getPath();
  35. //获取文件大小
  36. long length = file.getLen();
  37. if (length != 0) {
  38. FileSystem fs = path.getFileSystem(job);
  39. BlockLocation[] blkLocations;
  40. //判断file是否包含file的location,也就是,是否包含BlockLocation等信息,
  41. if (file instanceof LocatedFileStatus) {
  42. blkLocations = ((LocatedFileStatus) file).getBlockLocations();
  43. } else {
  44. //去构造BlockLocation信息
  45. blkLocations = fs.getFileBlockLocations(file, 0, length);
  46. }
  47. //判断文件是否可以切分
  48. if (isSplitable(fs, path)) {
  49. //获取文件的BlockSize大小
  50. long blockSize = file.getBlockSize();
  51. //splitSize最终由 goalSize(设置的每个split大小的目标值),minSize(设置的每个split大小的最小值),blockSize(file的block数量)三个值所决定,逻辑关系如下:
  52. // Math.max(minSize, Math.min(goalSize, blockSize))
  53. // Math.max(minSize, Math.min((totalSize / (numSplits == 0 ? 1 : numSplits)), blockSize))
  54. // numSplits这个设置,只有在totalSize/numSplits < blockSize才会生效
  55. // minSize 只有在大于blockSize的时候才会生效
  56. long splitSize = computeSplitSize(goalSize, minSize, blockSize);
  57. //文件为读取长度
  58. long bytesRemaining = length;
  59. //如果剩余的大小/split的大小大雨1.1,那么就商城生成一个split
  60. while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
  61. String[][] splitHosts = getSplitHostsAndCachedHosts(blkLocations,
  62. length-bytesRemaining, splitSize, clusterMap);
  63. splits.add(makeSplit(path, length-bytesRemaining, splitSize,
  64. splitHosts[0], splitHosts[1]));
  65. bytesRemaining -= splitSize;
  66. }
  67. //剩余的一点点数据也要生成一个split,
  68. if (bytesRemaining != 0) {
  69. String[][] splitHosts = getSplitHostsAndCachedHosts(blkLocations, length
  70. - bytesRemaining, bytesRemaining, clusterMap);
  71. splits.add(makeSplit(path, length - bytesRemaining, bytesRemaining,
  72. splitHosts[0], splitHosts[1]));
  73. }
  74. } else {
  75. String[][] splitHosts = getSplitHostsAndCachedHosts(blkLocations,0,length,clusterMap);
  76. splits.add(makeSplit(path, 0, length, splitHosts[0], splitHosts[1]));
  77. }
  78. } else {
  79. //Create empty hosts array for zero length files
  80. splits.add(makeSplit(path, 0, length, new String[0]));
  81. }
  82. }
  83. sw.stop();
  84. if (LOG.isDebugEnabled()) {
  85. LOG.debug("Total # of splits generated by getSplits: " + splits.size()
  86. + ", TimeTaken: " + sw.now(TimeUnit.MILLISECONDS));
  87. }
  88. return splits.toArray(new FileSplit[splits.size()]);
  89. }

hadoop InputFormat getSplits的更多相关文章

  1. Hadoop InputFormat浅析

    本文转载:http://hi.baidu.com/_kouu/item/dc8d727b530f40346dc37cd1 在执行一个Job的时候,Hadoop会将输入数据划分成N个Split,然后启动 ...

  2. Hadoop InputFormat

    Hadoop可以处理不同数据格式(数据源)的数据,从文本文件到(非)关系型数据库,这很大程度上得益于Hadoop InputFormat的可扩展性设计,InputFormat层次结构图如下:  

  3. Hadoop InputFormat详解

    InputFormat是MapReduce编程模型包括5个可编程组件之一,其余4个是Mapper.Partitioner.Reducer和OutputFormat. 新版Hadoop InputFor ...

  4. Hadoop InputFormat 输入文件分片

    1. Mapper 与 Reducer 数量 对于一个默认的MapReduce Job 来说,map任务的数量等于输入文件被划分成的分块数,这个取决于输入文件的大小以及文件块的大小(如果此文件在 HD ...

  5. Hadoop InputFormat OutputFormat

    InputFormat有两个抽象方法: getSplits     createRecordReader   InputSplits 将数据按照Split进行切分,一个Split分给一个task执行. ...

  6. hadoop InputFormat 类别

    FileInputFormat是所有使用文件作为数据源的InputFormat的积累.它提供两个功能:一个是定义哪些文件包含在一个作业的输入中:一个为输入文件生成分片的实现.自动将作业分块 作业分块大 ...

  7. Hadoop开发相关问题

    总结自己在Hadoop开发中遇到的问题,主要在mapreduce代码执行方面.大部分来自日常代码执行错误的解决方法,还有一些是对Java.Hadoop剖析.对于问题,通过查询stackoverflow ...

  8. Hadoop与Spark比较

    先看这篇文章:http://www.huochai.mobi/p/d/3967708/?share_tid=86bc0ba46c64&fmid=0 直接比较Hadoop和Spark有难度,因为 ...

  9. Hadoop上结合opencv\javacv

    mac上安装opencv 1. 去 http://opencv.org 下载最新版OpenCV for Linux/Mac源文件,目前版本是2.4.3.下载后解压.2. 去 http://www.cm ...

随机推荐

  1. 我们用CloudStack做什么

    原文地址:http://www.sdfengxi.com/?p=376 我想很多同学会有类似的疑问,就是我配置好了CloudStack或者OpenStack之类的环境之后能够提供什么服务或者应用呢?下 ...

  2. python并发进程

    1 引言 2 创建进程 2.1 通过定义函数的方式创建进程 2.2 通过定义类的方式创建进程 3 Process中常用属性和方法 3.1 守护进程:daemon 3.2 进程终结于存活检查:termi ...

  3. 在Idea中使用Eclipse编译器

    Eclipse编译器对Javac编译器的优点如下: 1.Proceed on errors 如果使用Javac编译器,你除了在执行之前修复所有错误之外没有其它的选择.然而Eclipse编译器却可以不管 ...

  4. 【bzoj3926- [Zjoi2015]诸神眷顾的幻想乡】广义sam

    题意:给定一棵树,每个节点有一个颜色,问树上有多少种子串(定义子串为某两个点上的路径),保证叶子节点数<=20.n<=10^5 题解: 叶子节点小于等于20,考虑将每个叶子节点作为根把树给 ...

  5. 图论的复习/(ㄒoㄒ)/

    图论基本概念 完全图: 每对顶点之间有边并且只有唯一的一条边. 强连通分量:有向图中任意2点都联通的最大子图. 图的储存 邻接矩阵:也就是一个二维数组,a[i][j]的值代表是否相连. 适用范围: 1 ...

  6. java List排序 顺序 倒序 随机

    List list = new LinkedList(); for ( int i = 0 ; i < 9 ; i ++ ) { list.add( " a " + i); ...

  7. 正则表达式 re模块 collections模块

    根据手机号码一共11位并且是只以13.14.15.18开头的数字这些特点,我们用python写了如下代码: while True: phone_number = input('please input ...

  8. 编译opencv2.4.11时出现错误:error: ‘NppiGraphcutState’ has not been declared

    安装cuda之后再安装opencv时出现错误: /data/opencv-2.4.11/modules/gpu/src/graphcuts.cpp:120:54: error: ‘NppiGraphc ...

  9. Android的简单应用(四)——字符串处理

    在Java中,对字符串进行处理的方法很多,也可以通过导入相应的字符串处理的lib包来进行处理.不过今天要说的是Android中看到的两种处理字符串的方法. 一.正则表达式 其实正则表达式没有大家想象的 ...

  10. 生产环境安装centos时的磁盘规划

    一般来说,分区要按照公司领导的要求来执行.但是如果没有要求,一般按照下面的方法进行磁盘规划. /boot分区200M: swap分区分内存的2倍.如果内存大于等于8G,那么swap分8G即可: /分区 ...