`
shidan66
  • 浏览: 65319 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hadoop中Map的数量是如何确定的

阅读更多

        我们知道,在Hadoop中作业运行的时候,Map的数量是由输入分片的数量决定的,但是分片的数量,并不是简单的按照文件的大小和blockSize的大小来切分的,分片的数量其实也是经过一系列的计算得到的,我们常用的InputFormat很多都是继承自FileInputFormat,该类时个抽象类,但是其中的getSplits方法是有完整的实现的,如果我们没有刻意去覆盖的话,也是会按照该方法中的逻辑来得到分片的,下面对该方法中的代码进行分析:

  public List<InputSplit> getSplits(JobContext job) throws IOException {
    //得到分片的最小值
    //其中getFormatMinSplitSize()默认返回值为1
    //getMinSplitSize(job)会返回mapred.min.split.size的值,默认值为0
    long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
    //该值不做设置的话会返回Long.MAX_VALUE
    long maxSize = getMaxSplitSize(job);

    List<InputSplit> splits = new ArrayList<InputSplit>();
    List<FileStatus>files = listStatus(job);
    //对每个文件做分片
    for (FileStatus file: files) {
      Path path = file.getPath();
      FileSystem fs = path.getFileSystem(job.getConfiguration());
      //文件的大小
      long length = file.getLen();
      BlockLocation[] blkLocations = fs.getFileBlockLocations(file, 0, length);
      //如果文件大小不为0,并且文件时可分割的
      if ((length != 0) && isSplitable(job, path)) {
        //blockSize 默认为64M
        long blockSize = file.getBlockSize();
        /*computeSplitSize()的源码:
          Math.max(minSize, Math.min(maxSize, blockSize))
          也就是说默认的splitSize=blockSize
        */
        long splitSize = computeSplitSize(blockSize, minSize, maxSize);
        
        long bytesRemaining = length;
        //注意这里的条件,并不是大小超过splitSize就一定会切分,还需要超过splitSize 10%,
        //这里的SPLIT_SLOP值为1.1
        while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
          int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
          splits.add(new FileSplit(path, length-bytesRemaining, splitSize, 
                                   blkLocations[blkIndex].getHosts()));
          bytesRemaining -= splitSize;
        }
        
        //经过上面的循环切分后,剩下的部分,单独作为一个切片
        if (bytesRemaining != 0) {
          splits.add(new FileSplit(path, length-bytesRemaining, bytesRemaining, 
                     blkLocations[blkLocations.length-1].getHosts()));
        }
      } else if (length != 0) {//如果文件不支持切分
        splits.add(new FileSplit(path, 0, length, blkLocations[0].getHosts()));
      } else { //如果文件大小为0
        //Create empty hosts array for zero length files
        splits.add(new FileSplit(path, 0, length, new String[0]));
      }
    }
    
    // Save the number of input files in the job-conf
    job.getConfiguration().setLong(NUM_INPUT_FILES, files.size());

    LOG.debug("Total # of splits: " + splits.size());
    return splits;
  }

 

 

分享到:
评论

相关推荐

    hadoop map-reduce turorial

    在Hadoop Map-Reduce中,输入数据被划分为小块,每个块被分配给不同的Map任务处理。Map任务将处理后的结果输出,这些输出会被排序后分配给Reduce任务进一步处理。最终,Reduce任务将整合的数据写回到文件系统中,...

    Hadoop Map-Reduce教程

    在 Hadoop Map-Reduce 中,数据处理过程主要分为两个阶段:**Map 阶段** 和 **Reduce 阶段**。 ##### Map 阶段 Map 函数接收输入数据块,并将其转换为一系列键值对。这一阶段的主要任务是对输入数据进行预处理,...

    Hadoop 2.7.1 中文文档

    3. **YARN(Yet Another Resource Negotiator)**:在Hadoop 2.x版本中引入,作为资源管理器,负责集群中的任务调度和资源分配,将原本在MapReduce中的资源管理和计算任务分离,提高了系统的灵活性和效率。...

    hadoop中文文档

    5. **Hadoop集群设置**:部署Hadoop集群涉及配置多个节点,包括设置HDFS和MapReduce的配置参数,如副本数量、内存分配等。集群中的节点可以通过Hadoop的ResourceManager和NodeManager进行管理和监控。 6. **Hadoop...

    Hadoop mapreduce实现wordcount

    【描述】在 Hadoop 环境中,WordCount 的实现主要涉及两个关键阶段:Map 阶段和 Reduce 阶段。Map 阶段将原始输入数据(通常是文本文件)拆分成小块,并对每一块进行独立处理;Reduce 阶段则负责聚合 Map 阶段产生的...

    实战hadoop中的源码

    《实战Hadoop中的源码》一书,由刘鹏撰写,是通往云计算领域的宝贵资源。Hadoop作为开源的大数据处理框架,其源码解析对于理解其工作原理、优化系统性能以及进行二次开发至关重要。本篇将深入探讨Hadoop源码中的关键...

    Hadoop Streaming 官方中文文档

    在文档的部分内容中,我们看到一系列的段落和代码示例,这些示例主要涵盖了Hadoop Streaming的基本使用方法,包括如何设置环境、编写map和reduce脚本、提交作业以及一些高级用法和优化技巧。 #### 环境配置 文档中...

    hadoop核心技术

    比如,在日志分析案例中,Hadoop可以从大量服务器日志中提取关键信息,如用户行为、系统状态等,然后通过MapReduce进行统计分析,找出访问热点或异常行为,帮助运营者优化服务。 总之,“Hadoop核心技术”涵盖了从...

    hadoop官方文档中文档

    8. **Hadoop优化**:为了提升性能,Hadoop允许用户调整各种参数,如副本数量、Block大小、Map和Reduce任务的数量等。理解这些参数的作用并进行合理配置,是提高Hadoop集群效率的关键。 通过阅读这份“Hadoop官方...

    词频统计,利用Hadoop中mappereduce进行单词的计数

    【标题】:“词频统计,利用Hadoop中mapper/reduce进行单词的计数” 在大数据处理领域,Hadoop是一个至关重要的框架,它以其分布式、容错性和可扩展性而受到广泛应用。本主题聚焦于如何利用Hadoop的MapReduce模型...

    hadoop-2.7.3.tar.gz 下载 hadoop tar 包下载

    在Hadoop的配置中,需要修改`core-site.xml`来定义HDFS的默认FS(文件系统),`hdfs-site.xml`来设置HDFS的相关参数,如副本数量和数据节点位置,以及`mapred-site.xml`来配置MapReduce的相关参数。此外,还需要确保...

    提高hadoop的mapreduce job效率笔记

    例如,避免在 Map 或 Reduce 函数中进行不必要的计算,减少对象创建,以及利用缓存和批处理。 通过综合运用这些优化策略,可以显著提升 Hadoop MapReduce Job 的处理效率,同时确保数据处理的准确性和可扩展性。...

    Hadoop任务调度器

    Slot是Hadoop集群中资源分配的基本单位,分为mapslot和reduceslot两种。一个TaskTracker可以有多个mapslot和reduceslot,具体数量由参数mapred.tasktracker.[map|reduce].tasks.maximum配置。这些slot资源被调度器...

    hadoop的默认配置文件

    在Hadoop的运行中,配置文件扮演着至关重要的角色,它们定义了系统的行为和性能参数。接下来,我们将详细探讨这四个默认配置文件——hdfs-default.xml、yarn-default.xml、core-default.xml和mapred-default.xml,...

    Hive及Hadoop作业调优

    此外,文档也介绍了old-mr-api和new-mr-api中影响切割大小的参数,以及如何通过调整这些参数来优化Map任务数量。 通过深入学习和应用文档中提到的调优方法,开发者可以大幅提升Hive及Hadoop作业的效率和性能,...

    hadoop实验+作业.zip

    4. 性能优化:实验可能包括如何调整Hadoop参数以优化性能,如修改Map和Reduce的任务数量,设置内存大小等。 三、Hadoop作业 作业通常涉及解决特定的问题或实现特定的功能,可能涵盖以下内容: 1. 数据分析:使用...

    Hadoop MapReduce实现tfidf源码

    在Hadoop MapReduce中,我们通常将这个过程分为两个阶段:Map阶段和Reduce阶段。 Map阶段的主要任务是对输入的文档进行切分,生成词频键值对。对于每个文档,我们需要读取内容,将文档拆分成单词,并为每个单词计算...

    hadoop-2.7.4.tar.gz

    它将复杂任务分解为“映射”(map)和“化简”(reduce)两个阶段,使得数据处理能够在集群中的多台机器上并行执行。 3. **YARN(Yet Another Resource Negotiator)**:在Hadoop 2.x版本中引入,YARN作为资源管理...

    hadoop-3.1.0-windows依赖文件.7z

    Hadoop 3.1.0是Hadoop发展过程中的一个重要版本,它在Hadoop 3.0的基础上进行了多项改进和优化,提升了系统的稳定性和性能。这个"hadop-3.1.0-windows"压缩包是专为在Windows环境下运行Hadoop设计的,包含了所有必要...

    Hadoop源代码分析

    9. **Hadoop配置与调优**:理解和调整Hadoop的配置参数对于优化性能至关重要,如Map和Reduce任务的数量、内存分配、磁盘I/O等。 10. **实战案例**:书中可能会包含实际项目中的应用示例,帮助读者理解如何在实际...

Global site tag (gtag.js) - Google Analytics