Hadoop中在计算一个JOB需要的map数之前首先要计算分片的大小。计算分片大小的公式是:
goalSize = totalSize / mapred.map.tasks
minSize = max {mapred.min.split.size, minSplitSize}
splitSize = max (minSize, min(goalSize, dfs.block.size))
totalSize是一个JOB的所有map总的输入大小,即Map input bytes。参数mapred.map.tasks的默认值是2,我们可以更改这个参数的值。计算好了goalSize之后还要确定上限和下限。
下限是max {mapred.min.split.size, minSplitSize} 。参数mapred.min.split.size的默认值为1个字节,minSplitSize随着File Format的不同而不同。
上限是dfs.block.size,它的默认值是64兆。
举几个例子,例如Map input bytes是100兆,mapred.map.tasks默认值为2,那么分片大小就是50兆;如果我们把mapred.map.tasks改成1,那分片大小就变成了64兆。
计算好了分片大小之后接下来计算map数。Map数的计算是以文件为单位的,针对每一个文件做一个循环:
1. <wbr><wbr>文件大小/splitsize>1.1,创建一个split,这个split的大小=splitsize,文件剩余大小=文件大小-splitsize</wbr></wbr>
2. <wbr><wbr>文件剩余大小/splitsize<1.1,剩余的部分作为一个split</wbr></wbr>
举几个例子:
1. <wbr><wbr>input只有一个文件,大小为100M,splitsize=blocksize,则map数为2,第一个map处理的分片为64M,第二个为36M</wbr></wbr>
2. <wbr><wbr>input只有一个文件,大小为65M,splitsize=blocksize,则map数为1,处理的分片大小为65M (因为65/64<1.1)</wbr></wbr>
3. <wbr><wbr>input只有一个文件,大小为129M,splitsize=blocksize,则map数为2,第一个map处理的分片为64M,第二个为65M</wbr></wbr>
4. <wbr><wbr>input有两个文件,大小为100M和20M,splitsize=blocksize,则map数为3,第一个文件分为两个map,第一个map处理的分片为64M,第二个为36M,第二个文件分为一个map,处理的分片大小为20M</wbr></wbr>
5. <wbr><wbr>input有10个文件,每个大小10M,splitsize=blocksize,则map数为10,每个map处理的分片大小为10M</wbr></wbr>
再看2个更特殊的例子:
1. <wbr><wbr>输入文件有2个,分别为40M和20M,dfs.block.size = 64M, mapred.map.tasks采用默认值2。那么splitSize = 30M ,map数实际为3,第一个文件分为2个map,第一个map处理的分片大小为30M,第二个map为10M;第二个文件分为1个map,大小为20M</wbr></wbr>
2. <wbr><wbr>输入文件有2个,分别为40M和20M,dfs.block.size = 64M, mapred.map.tasks手工设置为1。</wbr></wbr>
那么splitSize = 60M ,map数实际为2,第一个文件分为1个map,处理的分片大小为40M;第二个文件分为1个map,大小为20M
通过这2个特殊的例子可以看到mapred.map.tasks并不是设置的越大,JOB执行的效率就越高。同时,Hadoop在处理小文件时效率也会变差。
根据分片与map数的计算方法可以得出结论,一个map处理的分片最大不超过dfs.block.size * 1.1 ,默认情况下是70.4兆。但是有2个特例:
1. <wbr><wbr>Hive中合并小文件的map only JOB,此JOB只会有一个或很少的几个map。</wbr></wbr>
2. <wbr><wbr>输入文件格式为压缩的Text File,因为压缩的文本格式不知道如何拆分,所以也只能用一个map</wbr></wbr>
分享到:
相关推荐
使用Hadoop中的MapReduce计算框架可以对数字文本分析及求和,当遇到大规模数据时,使用别的编程语言会使得计算过程变得复杂,但使用MapReduce并行计算框架只需编写map函数和reduce函数即可,简单方便.zip
hadoop map reduce 的中文简易教程,能轻松帮助普通用户不需了解太多hadoop底层知识就能实现分布式编程,很好的入门教程。
包mapreduce.lib.map的Hadoop源代码分析
使用Hadoop Map Reduce分析股票市场 如何运行程序? 首先在您的系统中安装Hadoop。 请按照以下步骤进行安装 然后开始执行给定的命令 cd hadoop-3.2.2 / sbin ./start-dfs.sh ./start-yarn.sh jps 导出HADOOP_...
Hadoop, Apache开源的分布式框架。源自Google GFS,BigTable,MapReduce...JobTracker,hadoop的Map/Reduce调度器,负责与TackTracker通信分配计算任务并跟踪任务进度。 TaskTracker,启动和管理Map和Reduce子任务的节点。
MapReduce意味着在计算过程中实际分为两大步,Map过程和Reduce过程。 下面以一个统计单词次数简单案例为例: 数据源 Map类 import java.io.IOException; import org.apache.hadoop.io.LongWritable; import org....
020 结合WordCount实例讲解Hadoop的数据存储和数据计算 021 Hadoop 五大服务与配置文件中的对应关系 022 分析Hadoop 三种启动停止方式的Shell 脚本 023 去除警告【Warning$HADOOP HOME is deprecated。】 024 Hadoop...
Hadoop平台中一种Reduce负载均衡贪心算法,刘朵,曾锋,MapReduce是目前广泛应用的并行计算框架,是Hadoop平台的重要组成部分。主要包括Map函数和Reduce函数。Map函数输出key-value键值对作为Reduce的
hadoop权威指南,hadoop map/reduce 分布式计算
Hadoop映射减少字计数器 61C(计算机体系结构)的类项目,该项目使用Hadoop Map Reduce框架对大型文本文档中的单词频率进行计数。
《Hadoop实战》作为云计算所青睐的分布式架构,Hadoop是一个用Java语言实现的软件框架,在由大量计算机组成的集群中运行海量数据的分布式计算,是谷歌实现云计算的重要基石。《Hadoop实战》分为3个部分,深入浅出地...
hadoop权威指南,hadoop map/reduce 分布式计算
从Hadoop URL中读取数据 通过FileSystem API读取数据 写入数据 目录 查询文件系统 删除数据 数据流 文件读取剖析 文件写入剖析 一致模型 通过 distcp并行拷贝 保持 HDFS 集群的均衡 ...
通常,hadoop Map/Reduce框架和分布式文件系统是运行在一组相同的节点上的,也就是说,计算节点和存储节点通常在一起。这种配置允许框架在那些已经存好数据的节点上高效地调度任务,这可以使整个集群的网络带宽被...
本文重点阐述了通信数据分布式存储与查询在Hadoop ...在数据查询过程中,还将数据遍历过程放Reduce函数中,从而使广度优先搜索算法的层次遍历过程也能够并行运行。这在很大程度上优化了数据查询和分层扩展的效率
从Hadoop URL中读取数据 通过FileSystem API读取数据 写入数据 目录 查询文件系统 删除数据 数据流 文件读取剖析 文件写入剖析 一致模型 通过 distcp并行拷贝 保持 HDFS 集群的均衡 Hadoop的归档文件 使用Hadoop归档...
云计算-基于Hadoop的MapReduce计算模型优化与应用研究.pdf
而进行海量计算需要一个稳定的,安全的数据容器,才有了Hadoop分布式文件系统(HDFS,Hadoop Distributed File System)。 HDFS通信部分使用org.apache.hadoop.ipc,可以很快使用RPC.Server.start()构造一个节点...
Hadoop 分布式计算框架 1.MapReduce设计理念 何为分布式计算 移动计算,而不是移动数据 2.计算机框架MR 从HDFS存储的数据/文件作为输入(MR的数据来源) 对于这些数据首先要处理成一个个片段 split 每个片段都有个map...