我们知道,在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中,输入数据被划分为小块,每个块被分配给不同的Map任务处理。Map任务将处理后的结果输出,这些输出会被排序后分配给Reduce任务进一步处理。最终,Reduce任务将整合的数据写回到文件系统中,...
在 Hadoop Map-Reduce 中,数据处理过程主要分为两个阶段:**Map 阶段** 和 **Reduce 阶段**。 ##### Map 阶段 Map 函数接收输入数据块,并将其转换为一系列键值对。这一阶段的主要任务是对输入数据进行预处理,...
3. **YARN(Yet Another Resource Negotiator)**:在Hadoop 2.x版本中引入,作为资源管理器,负责集群中的任务调度和资源分配,将原本在MapReduce中的资源管理和计算任务分离,提高了系统的灵活性和效率。...
5. **Hadoop集群设置**:部署Hadoop集群涉及配置多个节点,包括设置HDFS和MapReduce的配置参数,如副本数量、内存分配等。集群中的节点可以通过Hadoop的ResourceManager和NodeManager进行管理和监控。 6. **Hadoop...
【描述】在 Hadoop 环境中,WordCount 的实现主要涉及两个关键阶段:Map 阶段和 Reduce 阶段。Map 阶段将原始输入数据(通常是文本文件)拆分成小块,并对每一块进行独立处理;Reduce 阶段则负责聚合 Map 阶段产生的...
《实战Hadoop中的源码》一书,由刘鹏撰写,是通往云计算领域的宝贵资源。Hadoop作为开源的大数据处理框架,其源码解析对于理解其工作原理、优化系统性能以及进行二次开发至关重要。本篇将深入探讨Hadoop源码中的关键...
在文档的部分内容中,我们看到一系列的段落和代码示例,这些示例主要涵盖了Hadoop Streaming的基本使用方法,包括如何设置环境、编写map和reduce脚本、提交作业以及一些高级用法和优化技巧。 #### 环境配置 文档中...
比如,在日志分析案例中,Hadoop可以从大量服务器日志中提取关键信息,如用户行为、系统状态等,然后通过MapReduce进行统计分析,找出访问热点或异常行为,帮助运营者优化服务。 总之,“Hadoop核心技术”涵盖了从...
8. **Hadoop优化**:为了提升性能,Hadoop允许用户调整各种参数,如副本数量、Block大小、Map和Reduce任务的数量等。理解这些参数的作用并进行合理配置,是提高Hadoop集群效率的关键。 通过阅读这份“Hadoop官方...
【标题】:“词频统计,利用Hadoop中mapper/reduce进行单词的计数” 在大数据处理领域,Hadoop是一个至关重要的框架,它以其分布式、容错性和可扩展性而受到广泛应用。本主题聚焦于如何利用Hadoop的MapReduce模型...
在Hadoop的配置中,需要修改`core-site.xml`来定义HDFS的默认FS(文件系统),`hdfs-site.xml`来设置HDFS的相关参数,如副本数量和数据节点位置,以及`mapred-site.xml`来配置MapReduce的相关参数。此外,还需要确保...
例如,避免在 Map 或 Reduce 函数中进行不必要的计算,减少对象创建,以及利用缓存和批处理。 通过综合运用这些优化策略,可以显著提升 Hadoop MapReduce Job 的处理效率,同时确保数据处理的准确性和可扩展性。...
Slot是Hadoop集群中资源分配的基本单位,分为mapslot和reduceslot两种。一个TaskTracker可以有多个mapslot和reduceslot,具体数量由参数mapred.tasktracker.[map|reduce].tasks.maximum配置。这些slot资源被调度器...
在Hadoop的运行中,配置文件扮演着至关重要的角色,它们定义了系统的行为和性能参数。接下来,我们将详细探讨这四个默认配置文件——hdfs-default.xml、yarn-default.xml、core-default.xml和mapred-default.xml,...
此外,文档也介绍了old-mr-api和new-mr-api中影响切割大小的参数,以及如何通过调整这些参数来优化Map任务数量。 通过深入学习和应用文档中提到的调优方法,开发者可以大幅提升Hive及Hadoop作业的效率和性能,...
4. 性能优化:实验可能包括如何调整Hadoop参数以优化性能,如修改Map和Reduce的任务数量,设置内存大小等。 三、Hadoop作业 作业通常涉及解决特定的问题或实现特定的功能,可能涵盖以下内容: 1. 数据分析:使用...
它将复杂任务分解为“映射”(map)和“化简”(reduce)两个阶段,使得数据处理能够在集群中的多台机器上并行执行。 3. **YARN(Yet Another Resource Negotiator)**:在Hadoop 2.x版本中引入,YARN作为资源管理...
在Hadoop MapReduce中,我们通常将这个过程分为两个阶段:Map阶段和Reduce阶段。 Map阶段的主要任务是对输入的文档进行切分,生成词频键值对。对于每个文档,我们需要读取内容,将文档拆分成单词,并为每个单词计算...
Hadoop 3.1.0是Hadoop发展过程中的一个重要版本,它在Hadoop 3.0的基础上进行了多项改进和优化,提升了系统的稳定性和性能。这个"hadop-3.1.0-windows"压缩包是专为在Windows环境下运行Hadoop设计的,包含了所有必要...
在使用Hadoop进行数据处理时,可能会出现"INFO mapred.JobClient: map 0% reduce 0%"的错误提示,并且在日志中没有出现任何错误信息。解决办法是,删除/etc/hosts文件中的多余机器名。 五、Call to localhost/...