`

InputFormat牛逼(7)抽象类FileInputFormat

 
阅读更多
@Public
@Stable

A base class for file-based InputFormats.

FileInputFormat is the base class for all file-based InputFormats. This provides a generic implementation of getSplits(JobContext). Subclasses of FileInputFormat can also override the isSplitable(JobContext, Path) method to ensure input-files are not split-up and are processed as a whole by Mappers.

类定义
public abstract class FileInputFormat<K, V> extends InputFormat<K, V> 

核心方法getSplits

  /** 
   * 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();
    long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
    long maxSize = getMaxSplitSize(job);

    // generate splits
    List<InputSplit> splits = new ArrayList<InputSplit>();
    List<FileStatus> files = listStatus(job);
    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)) {
          long blockSize = file.getBlockSize();
          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;
  }


构建FileSplit对象
  /**
   * A factory that makes the split for this class. It can be overridden
   * by sub-classes to make sub-types
   */
  protected FileSplit makeSplit(Path file, long start, long length, 
                                String[] hosts) {
    return new FileSplit(file, start, length, hosts);
  }

分享到:
评论

相关推荐

    自定义MapReduce的InputFormat

    1. **创建一个新的类**:首先,你需要创建一个继承自`org.apache.hadoop.mapreduce.InputFormat`的类。这个类将覆盖父类的方法来实现自定义的输入处理逻辑。 2. **实现`getSplits()`方法**:此方法用于将输入数据...

    Hadoop源码解析---MapReduce之InputFormat

    InputFormat是一个抽象类,它的主要职责是定义输入数据的分割方式和如何读取这些分割后的数据。每个具体的InputFormat实现都必须定义自己的getSplits()方法和RecordReader类。getSplits()方法负责将输入数据划分为多...

    hive inputformat

    这通常涉及到创建两个类:RecordReader和InputFormat。RecordReader负责读取数据文件并按需拆分记录,而InputFormat负责初始化RecordReader并确定数据分片(Splits)。 4. **实例代码:按照空格拆分日志文件** ...

    【MapReduce篇03】MapReduce之InputFormat数据输入1

    本文将深入讲解MapReduce的InputFormat,特别是默认的TextInputFormat以及几种常见的实现类。 FileInputFormat是所有输入格式的基类,它定义了如何将HDFS上的文件拆分成多个InputSplit,每个InputSplit进一步由...

    自定义inputFormat&&outputFormat1

    自定义inputFormat&&outputFormat1

    大数据平台-MapReduce介绍.pdf

    在输入阶段,InputFormat文件分割,读取。FileInputFormat从文件中读取数据。InputSplits定义了输入到单个Map任务的输入数据。RecordReader定义了如何从数据上转化为一个(key,value)对,从而输出到Mapper类中。 在...

    CustomInputFormatCollection:Hadoop Mapreduce InputFormat 集合

    Hadoop 代码使用方式 job.setInputFormatClass(SmallFileCombineTextInputFormat.class); 当前Maven提加如下依赖 讲无法从reposity中找到直接jar,需手动编译下载...-Dmapreduce.input.fileinputformat.split.maxsize=10

    json-mapreduce:可以分割多行JSON的InputFormat

    目前似乎没有任何可以支持多行 JSON 的 JSON InputFormat 类。 执照 Apache 许可。 用法 要开始,只需: 下载并运行ant 在您的环境中包含dist/lib/json-mapreduce-1.0.jar 使用MultiLineJsonInputFormat类作为您...

    SequenceFileKeyValueInputFormat:自定义 Hadoop InputFormat

    Apache Hive 的 InputFormat,在查询 SequenceFiles 时将返回 (Text) 键和 (Text) 值。 我需要在不拆分内容的情况下完整解析大量文本文件。 HDFS 在处理大型连续文件时提供最佳吞吐量,因此我使用 Apache Mahout 将...

    HadoopMR-CombineLocalFiles:它将目录中的所有本地文件合并为一个文件

    在Java中实现这个功能,我们需要编写一个自定义的InputFormat,继承自Hadoop的FileInputFormat类。这个InputFormat的职责是重写`getSplits()`方法,以便将多个小文件视为一个split,而不是分别对待。同时,我们需要...

    17_尚硅谷大数据之MapReduce框架原理1

    4. **数据读取**:TaskTracker上的Task进程通过InputFormat类解析输入数据,将其切分成多个逻辑记录,每个记录对应一个键值对(key-value pair)。 5. **映射阶段(map)**:map任务执行,map函数处理每个键值对,...

    MapReduce技术原理深入理解.pdf

    MapReduce提供了多种输入处理类,例如InputFormat、FileInputFormat等。这些类提供了不同的输入处理方式,例如读取文件、读取数据库等。 MapReduce序列化 MapReduce提供了序列化机制,可以将,v&gt;对序列化为byte数组...

    MapReduce技术深入理解.pdf

    - **FileInputFormat**:所有基于文件的InputFormat的基础类,定义输入文件的位置。 - **TextInputFormat**:默认的InputFormat,键是行的字节偏移量,值是行内容。 - **KeyValueTextInputFormat**:键和值由特定...

    couchbase-inputformat:将 Couchbase 集成到 Hadoop 等云项目的工具

    ##Couchbase InputFormat 提供什么? 在与 Couchbase Sqoop 连接器搏斗时,发现了一些错误,使其无法与 CDH3 版本正常工作。 从 Couchbase 中提取键/值的实际 InputFormat 存在于 Sqoop 连接器的基于代码中,但对 ...

    MapReduce技术深入理解.pptx

    - FileInputFormat:所有基于文件的InputFormat的基类,用于设置作业的输入文件位置。 - TextInputFormat:默认的InputFormat,key是行的字节偏移量,value是行内容(不包含行终止符)。 - KeyValueTextInputFormat...

    MapReduce类型及格式

    例如,JAVA中MapReduce的API通常包括Mapper和Reducer两个主要的抽象类。用户可以通过继承这些类并重写相应的方法来实现自己的MapReduce逻辑。Mapper类处理输入数据并产生中间键值对,而Reducer类则对这些中间键值对...

    XML_MR_Reader:使用 XML InputFormat Map Reduce

    使用 XML InputFormat 映射 Reduce。 这是一段代码,用于清理 Wiki XML 数据集并将其转换为带分隔符的文本。 从维基百科档案中提取电影数据进行分析。 提供了 Sample.xml。 如果您的 XML 结构发生变化,请查看 ...

    java 中自定义OutputFormat的实例详解

    OutputFormat 是一个抽象类,需要继承该类并实现其方法来实现自定义的输出格式。 在 Hadoop 中, OutputFormat 的实现类主要有两个:TextInputFormat 和 TextOutputFormat。 TextInputFormat 用于读取文本文件,而...

    hadoop工具包中的share包

    2. **接口和抽象类**:share包定义了许多接口和抽象类,比如`FileSystem`接口,它是所有Hadoop文件系统操作的基础,包括HDFS、本地文件系统和其他分布式文件系统。此外,还有`InputFormat`和`OutputFormat`接口,...

    01-02MapReduce深入

    InputFormat是MapReduce框架基础类之一,负责读取输入数据,将其分割成小块,称为split。InputFormat的主要任务是将输入数据分割成小块,以便于后续的处理。 Split Split是InputFormat的输出结果,每个split包含...

Global site tag (gtag.js) - Google Analytics