在FileInputFormat map操作中有一块非常中的split的算法 ,
以wordcount为例子,他到底是如果做分片的,我们如何来调优呢,
首先我们来看下他的算法:
在FileInputFormat public List<InputSplit> getSplits(JobContext job) 中计算 分片大小用到的几个数据我么先来看一下:
// 主要以来配置中的 值,缺省为 1 ;
long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
protected long getFormatMinSplitSize() { return 1; } public static long getMinSplitSize(JobContext job) { return job.getConfiguration().getLong(SPLIT_MINSIZE, 1L); } public static final String SPLIT_MINSIZE = "mapreduce.input.fileinputformat.split.minsize";
这里 mapreduce.input.fileinputformat.split.minsize 在 /mapred-default.xml 的配置主哦功能默认是 0 ,所以getMinSplitSize 返回缺省值 1 ;
而 getFormatMinSplitSize 返回值 值也是 1;
通过 Max之后 最后得到的值是1 ;
这里 可以配置的 就是 split.minsize ,所以这个值如果配置的大于1的话 ,那么 minSize 就是 配置主哦功能的split.minsize了,
//默认使用最大值,配置了,就使用配置的值;
long maxSize = getMaxSplitSize(job);
public static long getMaxSplitSize(JobContext context) { return context.getConfiguration().getLong(SPLIT_MAXSIZE, Long.MAX_VALUE); } public static final String SPLIT_MAXSIZE = "mapreduce.input.fileinputformat.split.maxsize";
从代码可以看出来,缺省使用了 Long.MAX_VALUE,如果配置就是用 配置的值,
// 在配置文件 file.blocksize core-default.xml 默认值 给的 64*1024*1024
long blockSize = file.getBlockSize();
long splitSize = computeSplitSize(blockSize, minSize, maxSize);
protected long computeSplitSize(long blockSize, long minSize, long maxSize) { return Math.max(minSize, Math.min(maxSize, blockSize)); }
实际上是取出了 在 block中splitMax中取出一个最小值,在和分块最小值中取出 较大的一个,
举个例子:
加入 wordcount中使用 最小分块 为 3 ,最大分块为 10,blocksize 为默认 67108864
,那么最终结果为 是 10
但是我们在跑wordcount的时候,我们应该是都没有 设置这写参数,那么应该都是默认值:
minSize:1 maxSize:Long.MAX_VALUE-- 9223372036854775807 blocksize:67108864
最终得到的值即:blocksize:67108864
那么在 wordcount 如果出现块的大小刚好把一个单词截断了怎么办呢?
待续.............
这个配置项定义了在HDFS上每个block的大小,它的值是以字节为单位。
可以在配置文件hadoop-site.xml(Hadoop 0.20 以前版本)定义,
也可以在JobConf里定义。hdfs中block size定义是以文件为粒度的。
hadoop的mapper数基本由输入文件的block数决定,如果输入的block
size不够大,导致mapper处理时间很短(不到一分钟),大量这样的mapper
会严重降低计算性能。但是如果输入文件都是小文件,就算blocksize再大,每个
文件也会占一个block,这时候要通过合并小文件来减少mapper数,设置blocksize
是没用的。命令行设置块大小可以加参数,0.20以后的用
hadoop fs -D dfs.block.size=134217728 -put local_name remote_location
之前的可以用fs.local.block.size
参数
新版在 dfs.blocksize中设置
相关推荐
在Hadoop 1.0.4中,`org.apache.hadoop.mapreduce.lib.input` 包是MapReduce库中的输入格式类,它提供了多种处理数据输入的方法,为开发者提供了灵活的数据处理入口。 MapReduce 是 Hadoop 的核心计算模型,由两个...
4. 在`getSplits()`方法中,根据目录下的所有文件大小,创建一个大的split,而不是为每个小文件创建一个split。 5. 配置MapReduce作业时,将新创建的InputFormat类作为输入格式设置。 此外,需要注意的是,合并本地...
在Hadoop的生态系统中,MapReduce是处理海量数据的一种编程模型,而InputFormat作为MapReduce编程模型的重要组成部分,是负责处理输入数据的关键接口。为了深入理解MapReduce工作原理,必须掌握InputFormat的设计和...
1. **数据分片(Split)**:Hadoop首先将大文件分割成多个小块(Block),每个Block通常为128MB或256MB,便于分布式处理。 2. **Map阶段**:每个Block会被分配到集群中的某个节点上,执行Map函数。在这个阶段,Map...
- **概念**:Hadoop 分布式文件系统是一种高度容错性的文件系统,设计用来部署在低廉的硬件上。 - **特点**:支持超大文件存储,支持流式数据访问,自动保存数据副本,提供高吞吐量访问数据的能力。 - **应用场景...
这个示例展示了如何创建一个简单的 MapReduce 程序,从输入文件中读取文本,统计每个单词出现的次数,并将结果写入输出文件。通过这种方式,用户可以理解 MapReduce 的基本原理及其在实际应用中的使用方法。
在Hadoop框架中,MapReduce负责将大规模数据集分割成较小的数据块,并在集群中并行处理这些数据块,以提高计算效率。以下是MapReduce的一些关键概念和流程的详细解释: 1. **前置条件**:在开始MapReduce工作之前,...
Mapper类提供`map()`方法,开发者需要在这个方法中编写自己的业务逻辑。 **Shuffle阶段** Shuffle阶段介于Map和Reduce之间,它负责收集Map任务产生的中间结果,并按照键进行排序,为Reduce阶段做准备。在源码中,这...
- 将打包后的JAR路径设置到`job.setJar`方法中,确保集群能够找到并执行这个JAR。 在实际操作中,还需要考虑Hadoop客户端的安装和配置,包括Hadoop的环境变量设置、配置文件(如`core-site.xml`, `hdfs-site.xml`,...
WordCount工具是Apache Hadoop生态系统中的一个经典示例程序,用于统计文本文件中各个单词出现的频率。在大数据处理领域,Hadoop是一个广泛使用的开源框架,它提供了分布式存储(HDFS)和分布式计算(MapReduce)的...
- **切片机制**:`FileInputFormat`根据文件大小和配置的`InputSplit`大小计算出输入数据的切片(split),每个split对应一个map任务。`InputSplit`表示数据输入的一块,可以是文件的一部分或整个文件。 在实际应用...
3.2.3. `initialize()`方法中,`FileInputFormat.createRecordReader()`创建了一个`LineRecordReader`实例,用于读取数据。 3.2.4. `LineRecordReader.initialize()`确保单词不会跨split边界,例如通过确保每个split...
在大多数情况下,计算节点和存储节点是相同的,即MapReduce框架和Hadoop分布式文件系统(HDFS)运行在同一组节点上。这种配置允许框架有效地将任务调度到已经拥有数据的节点上,从而实现非常高的集群聚合带宽。 ###...
在IT行业中,Hadoop MapReduce是一种分布式计算框架,主要用于处理和存储海量数据。这个框架源自Google的MapReduce模型,由Apache Hadoop项目实现,是大数据处理领域的基石之一。在这个名为“奇怪的人Hadoop ...
本示例中,我们将深入探讨如何使用Hadoop MapReduce进行“WordCount”操作,这是一种基本但实用的统计任务,用于计算文本文件中每个单词出现的次数。由于涉及到的是Java编程,因此我们将使用Java语言来实现这一过程...
4. 将切片规划列表List(FileSplit)序列化为文件job.split,并将其复制到job资源提交路径中。然后,将job的相关参数写为job.xml文件,并同样复制到job资源提交路径中。 5. 获取job的jar包并复制到job资源提交路径中...
在这个main方法中,我们设置了输入输出路径,Mapper和Reducer类,并启动了Job。 在Hadoop MapReduce中,数据会被自动分发到集群中的节点进行处理,然后将结果合并回中心节点。这种分布式处理模式允许处理非常大的...
- FileInputFormat的getSplits()方法根据这些信息计算数据切片(split)。 - 每个切片对应一个MapTask实例。 **1.3.2 FileInputFormat切片机制** **1.3.2.1 切片定义** 在Hadoop中,切片是在InputFormat类中的...