MapReduce框架要处理数据的文件类型 FileInputFormat这个类决定。
TextInputFormat是框架默认的文件类型,可以处理Text文件类型,如果你要处理的文件类型不是Text,
譬如说是Xml或DB,你就需要自己实现或用库中已有的类型。
FileInputFormat的主要方法之一getSplits完成的功能是获取job要处理的路径文件所在的block信息。
数据结构:FileInputSplit 存储了文件的位置信息,如Host,所属文件信息,开始offset,还有长度信息。
  1. public class FileSplit extends InputSplit implements Writable {
  2. private Path file;
  3. private long start;
  4. private long length;
  5. private String[] hosts;
  6. private SplitLocationInfo[] hostInfos;

  7. }
方法介绍:
blockSize:块大小
minSize:最小分片大小,由参数mapred.min.split.size设置,默认为1
maxSize:最大分片大小,由参数mapred.max.split.size设置,默认Long.MAX-VALUE
计算splitsize的方法:Math.max(minSize,Math.min(maxSize,blockSize)
FileInputFormat的另一个重要方法是CreateRecordReader.在这个方法里面会用到前面方法所获取到的InpustSplit.这个RecordReader会用来去读取数据,传递给maptask去执行处理。

当InputSplit尺寸大于block并且其对应的所有block(包含副本)不在同一个节点上时,Map Task不可能完全实现数据的本地化,

也就是说,总有一部分数据需要从远程节点上读取,因此得出,当使用基于FileInputFormat实现InputFormat时,为了提高数据本地性,应该尽量使InputSplit大小与block大小一致。

因为不同的文件,在上传的时候可以具体指定blocksize,若不指定则使用系统默认的blocksize,所以在代码中它使用的是file.getblocksize().

若文件的blocksize是32M,我们的文件是70M,而且文件是可以切分的,则系统是如何分片的呢?(根据源代码进行分析)

如果我们的minsize=1,maxsize=128,则计算得到的splitsize=32M,每一个block一个inputsplit.

如果我们的minsize=64,maxsize=128,则计算得到的splitsize=64M, 但因为不满足70/64>1.1的情况,所以还是只会分成一个fileinputsplit,这一个inputsplit包含了两个block的信息。

试想一下,如果还拆分成两个inputsplit让两个map task去做,第二个maptask只获取一点点的数据,利用率不高。

若我们的文件是xml文件类型,不管我们的文件是多大,都只能分给一个InputSplit去处理,因为它的isSplitable=false,xml不能切开处理,那样数据就会乱掉。

  1. /**
  2. * Generate the list of files and make them into FileSplits.
  3. * @param job the job context
  4. * @throws IOException
  5. */
  6. public List<InputSplit> getSplits(JobContext job) throws IOException {
  7. Stopwatch sw = new Stopwatch().start();
  8. long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
  9. long maxSize = getMaxSplitSize(job);
  10.  
  11. // generate splits
  12. List<InputSplit> splits = new ArrayList<InputSplit>();
  13. List<FileStatus> files = listStatus(job);
  14. for (FileStatus file: files) {
  15. Path path = file.getPath();
  16. long length = file.getLen();
  17. if (length != 0) {
  18. BlockLocation[] blkLocations;
  19. if (file instanceof LocatedFileStatus) {
  20. blkLocations = ((LocatedFileStatus) file).getBlockLocations();
  21. } else {
  22. FileSystem fs = path.getFileSystem(job.getConfiguration());
  23. blkLocations = fs.getFileBlockLocations(file, 0, length);
  24. }
  25. if (isSplitable(job, path)) {
  26. long blockSize = file.getBlockSize();
  27. long splitSize = computeSplitSize(blockSize, minSize, maxSize);
  28.  
  29. long bytesRemaining = length;
  30. while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
  31. int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
  32. splits.add(makeSplit(path, length-bytesRemaining, splitSize,
  33. blkLocations[blkIndex].getHosts(),
  34. blkLocations[blkIndex].getCachedHosts()));
  35. bytesRemaining -= splitSize;
  36. }
  37.  
  38. if (bytesRemaining != 0) {
  39. int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
  40. splits.add(makeSplit(path, length-bytesRemaining, bytesRemaining,
  41. blkLocations[blkIndex].getHosts(),
  42. blkLocations[blkIndex].getCachedHosts()));
  43. }
  44. } else { // not splitable
  45. splits.add(makeSplit(path, 0, length, blkLocations[0].getHosts(),
  46. blkLocations[0].getCachedHosts()));
  47. }
  48. } else {
  49. //Create empty hosts array for zero length files
  50. splits.add(makeSplit(path, 0, length, new String[0]));
  51. }
  52. }
  53. // Save the number of input files for metrics/loadgen
  54. job.getConfiguration().setLong(NUM_INPUT_FILES, files.size());
  55. sw.stop();
  56. if (LOG.isDebugEnabled()) {
  57. LOG.debug("Total # of splits generated by getSplits: " + splits.size()
  58. + ", TimeTaken: " + sw.elapsedMillis());
  59. }
  60. return splits;
  61. }

FileInputFormat的更多相关文章

  1. Hadoop2.6.0的FileInputFormat的任务切分原理分析(即如何控制FileInputFormat的map任务数量)

    前言 首先确保已经搭建好Hadoop集群环境,可以参考<Linux下Hadoop集群环境的搭建>一文的内容.我在测试mapreduce任务时,发现相比于使用Job.setNumReduce ...

  2. Hadoop FileInputFormat实现原理及源码分析

    FileInputFormat(org.apache.hadoop.mapreduce.lib.input.FileInputFormat)是专门针对文件类型的数据源而设计的,也是一个抽象类,它提供两 ...

  3. MapReduce :基于 FileInputFormat 的 mapper 数量控制

    本篇分两部分,第一部分分析使用 java 提交 mapreduce 任务时对 mapper 数量的控制,第二部分分析使用 streaming 形式提交 mapreduce 任务时对 mapper 数量 ...

  4. FileInputFormat看这一段源码

    这是FileInputFormat中的一个方法,看一下它的功能,多看源码,理解hadoop,同时提高自己的java编程能力: private static String[] getPathString ...

  5. MapReduce的map个数调节 与 Hadoop的FileInputFormat的任务切分原理

    在对日志等大表数据进行处理的时候需要人为地设置任务的map数,防止因map数过小导致集群资源被耗光.可根据大表的数据量大小设置每个split的大小. 例如设置每个split为500M: set map ...

  6. Hadoop(16)-MapReduce框架原理-自定义FileInputFormat

    1. 需求 将多个小文件合并成一个SequenceFile文件(SequenceFile文件是Hadoop用来存储二进制形式的key-value对的文件格式),SequenceFile里面存储着多个文 ...

  7. 在Hadoop中重写FileInputFormat类以处理二进制格式存储的整数

    近期開始使用MapReduce,发现网上大部分样例都是对文本数据进行处理的,也就是说在读取输入数据时直接使用默认的TextInputFormat进行处理就可以.对于文本数据处理,这个类还是能满足一部分 ...

  8. 继承FileInputFormat类来理解 FileInputFormat类

    import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.had ...

  9. WordCount作业提交到FileInputFormat类中split切分算法和host选择算法过程源码分析

    参考 FileInputFormat类中split切分算法和host选择算法介绍  以及 Hadoop2.6.0的FileInputFormat的任务切分原理分析(即如何控制FileInputForm ...

随机推荐

  1. 用javascript去掉字符串空格的办法

    今天遇到了以关于JavaScript 中怎么去掉 字符串中前后两段的空格 ,我只好向就得js中也后Trim() 函数,后来试试了不 行,就网上找了下解决方法,其中用到了正则表达式 ,整理了下: < ...

  2. 关于迭代器中IEnumerable与IEnumerator的区别

    首先是IEnumerable与IEnumerator的定义: 1.IEnumerable接口允许使用foreach循环,包含GetEnumerator()方法,可以迭代集合中的项. 2.IEnumer ...

  3. 【jQuery基础学习】02 jQuery的DOM操作

    DOM操作分为3个方面: DOM Core    任何一种支持DOM Core的语言都可以使用它,比如getElementById就是DOM Core操作 HTML-DOM  只能用来处理web文档 ...

  4. unity3d拓展编辑器MenuItem的使用

    MenuItem是自定义菜单栏显示 比如:[MenuItem("new/My Window")] 这样就会显示菜单new/My Window 把这个放在一个静态方法上就可以了.记住 ...

  5. C# 循环语句 for循环

    循环:反复执行某段代码. 循环四要素:初始条件,循环条件,循环体,状态改变.for(初始条件;循环条件;状态改变){ 循环体} 给出初始条件,先判断是否满足循环条件,如果不满足条件则跳过for语句,如 ...

  6. CSS层次选择器温故-2

    1.层次选择器 通过HTML的DOM元素间的层次关系获取元素,层次关系包括后代.父子.相邻兄弟和通用兄弟,通过其中某类关系可以方便快捷地选定需要的元素 2.语法 3.兼容性 IE7以及以上版本 4.后 ...

  7. inherit与auto

    大家是不是和我一样,在刚开始学习css的时候,在css文件开头是不是经常看到这样的代码: * {margin:0 px; padding:0 px;}  . 在接下来设置颜色字体时在body元素的cs ...

  8. Atitit.jsou html转换纯文本 java c# php

    Atitit.jsou html转换纯文本 java c# php 1. 原理<p> <h> <li><div> 等lable转换为回车1 2. 调用2 ...

  9. 由于无法在数据库 'TestNonContainedDB' 上放置锁 ALTER DATABASE 失败

    Error: 消息5601,级别16,状态1,第1行,由于无法在数据库 'TestNonContainedDB' 上放置锁,ALTER DATABASE 失败.请稍后再试.消息5069,级别16,状态 ...

  10. GTD桌面2.0

    在以前实践了一个GTD桌面,当时称为1.0版本,当时的效果是这样的: 2015年更换一点设备,把GTD桌面升级一下,就称为2.0吧.直接上图: 可以发现显示器由以前的1台又变回2台,原以为1台大显示器 ...