Hadoop如何计算map数和reduce数
原地址:http://www.songyafei.cn/post/a0d5b_140a7cf
Hadoop在运行一个mapreduce job之前,需要估算这个job的maptask数和reducetask数。首先分析一下job的maptask数,当一个job提交时,jobclient首先分析job被拆分的split数量,然后吧job.split文件放置在HDFS中,一个job的MapTask数量就等于split的个数。
job.split中包含split的个数由FileInputFormat.getSplits计算出,方法的逻辑如下:
1. 读取参数mapred.map.tasks,这个参数默认设置为0,生产系统中很少修改。
2. 计算input文件的总字节数,总字节数/(mapred.map.tasks==0 ? 1: mapred.map.tasks )=goalsize
3. 每个split的最小值minSize由mapred.min.split.size参数设置,这个参数默认设置为0,生产系统中很少修改。
4. 调用computeSplitSize方法,计算出splitsize= Math.max(minSize, Math.min(goalSize, blockSize)),通常这个值=blockSize,输入的文件较小,文件字节数之和小于blocksize时,splitsize=输入文件字节数之和。
5. 对于input的每个文件,计算split的个数。
a) 文件大小/splitsize>1.1,这个相对于输入文件中的单个文件,创建一个split,这个split的字节数=splitsize,文件剩余字节数=文件大小-splitsize
length=file.getLength()//单个文件 long bytesRemaining = length; while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) { String[][] splitHosts = getSplitHostsAndCachedHosts(blkLocations, length-bytesRemaining, splitSize, clusterMap); splits.add(makeSplit(path, length-bytesRemaining, splitSize, splitHosts[0], splitHosts[1])); bytesRemaining -= splitSize; }
b) 文件剩余字节数/splitsize<1.1,剩余的部分作为一个split
举例说明:
1. input只有一个文件,大小为100M,splitsize=blocksize,则split数为2,第一个split为64M,第二个为36M
2. input只有一个文件,大小为65M,splitsize=blocksize,则split数为1,split大小为65M
3. input只有一个文件,大小为129M,splitsize=blocksize,则split数为2,第一个split为64M,第二个为65M(最后一个split的大小可能超过splitsize)
4. input只有一个文件,大小为20M ,splitsize=blocksize,则split数为1,split大小为20M
5. input有两个文件,大小为100M和20M,splitsize=blocksize,则split数为3,第一个文件分为两个split,第一个split为64M,第二个为36M,第二个文件为一个split,大小为20M
6. input有两个文件,大小为25M和20M,splitsize=blocksize,则split数为2,第一个文件为一个split,大小为25M,第二个文件为一个split,大小为20M
假设一个job的input大小固定为100M,当只包含一个文件时,split个数为2,maptask数为2,但当包含10个10M的文件时,maptask数为10。
下面来分析reducetask,纯粹的mapreduce task的reduce task数很简单,就是参数mapred.reduce.tasks的值,hadoop-site.xml文件中和mapreduce job运行时不设置的话默认为1。
在HIVE中运行sql的情况又不同,hive会估算reduce task的数量,估算方法如下:
通常是ceil(input文件大小/1024*1024*1024),每1GB大小的输入文件对应一个reduce task。
特殊的情况是当sql只查询count(*)时,reduce task数被设置成1。
总结:通过map和reducetask数量的分析可以看出,hadoop/hive估算的map和reduce task数可能和实际情况相差甚远。假定某个job的input数据量庞大,reduce task数量也会随之变大,而通过join和group by,实际output的数据可能不多,但reduce会输出大量的小文件,这个job的下游任务将会启动同样多的map来处理前面reduce产生的大量文件。在生产环境中每个user group有一个map task数的限额,一个job启动大量的map task很显然会造成其他job等待释放资源。
Hive对于上面描述的情况有一种补救措施,参数hive.merge.smallfiles.avgsize控制hive对output小文件的合并,当hiveoutput的文件的平均大小小于hive.merge.smallfiles.avgsize-默认为16MB左右,hive启动一个附加的mapreducejob合并小文件,合并后文件大小不超过hive.merge.size.per.task-默认为256MB。
尽管Hive可以启动小文件合并的过程,但会消耗掉额外的计算资源,控制单个reduce task的输出大小>64MB才是最好的解决办法。
相关推荐
Hadoop Map-Reduce框架是设计用于处理大规模数据集(多太字节级)的软件框架,它允许在大量廉价硬件集群上(可达数千节点)进行并行处理,确保了数据处理的可靠性与容错性。此教程全面介绍了Hadoop Map-Reduce框架的...
MapReduce的设计理念源于Google的同名论文,它通过将大规模数据处理任务分解为两个阶段:Map(映射)和Reduce(化简),使得海量数据能够在多台计算机上并行处理,极大地提高了数据处理效率。 Map阶段是数据处理的...
在Windows平台上进行Hadoop的Map/Reduce开发可能会比在Linux环境下多一些挑战,但通过详细的步骤和理解Map/Reduce的工作机制,开发者可以有效地克服这些困难。以下是对标题和描述中涉及知识点的详细说明: **Hadoop...
在 Hadoop Map-Reduce 中,数据处理过程主要分为两个阶段:**Map 阶段** 和 **Reduce 阶段**。 ##### Map 阶段 Map 函数接收输入数据块,并将其转换为一系列键值对。这一阶段的主要任务是对输入数据进行预处理,...
Hadoop Map-Reduce Map-Reduce 是 Hadoop 框架中的一种核心组件,用于处理大规模数据。Map-Reduce 依靠两大步骤来完成数据处理:Map 和 Reduce。 Map 阶段的主要任务是将输入数据拆分成小块,并将其转换成 key-...
本篇文章将深入探讨“远程调用执行Hadoop Map/Reduce”的概念、原理及其实现过程,同时结合标签“源码”和“工具”,我们将涉及到如何通过编程接口与Hadoop集群进行交互。 Hadoop MapReduce是一种编程模型,用于大...
此外,通过Eclipse与Hadoop集群的有效连接,开发者可以在本地环境中轻松地编写、测试和调试Map-Reduce程序,进而提高开发效率。在实际应用中,Map-Reduce已经被广泛应用于搜索引擎索引构建、社交网络数据分析、金融...
### Hadoop、MapReduce与HDFS...综上所述,Hadoop是一个功能强大的分布式计算框架,通过HDFS和MapReduce等核心组件,为大数据处理提供了高效的解决方案。无论是数据存储还是数据处理,Hadoop都能满足不同场景的需求。
本文将深入探讨Map JOIN和Reduce JOIN两种在Hadoop中实现JOIN的方法,并通过代码示例来阐述它们的工作原理。 1. Map JOIN: Map JOIN在Hadoop中主要应用于小表与大表的连接。小表的数据可以完全加载到内存中,而大...
该框架将任务分解为一系列较小的任务(Map 和 Reduce),并在集群中的多台计算机上并行执行这些任务。 - **应用场景**:适用于大数据分析、搜索引擎索引构建、日志文件分析等场景。 #### 二、MapReduce 工作原理 1...
每个案例都详细列出了实践步骤,包括如何编写 Map 和 Reduce 函数、如何配置 Hadoop 环境、如何运行 MapReduce 任务等。 #### 六、总结 Hadoop MapReduce 是一种非常强大的分布式数据处理工具,它通过简单的编程...
Hadoop MapReduce是一种分布式计算框架,用于处理和存储大规模数据集。它通过将复杂任务分解为可并行处理的“映射”和“化简”阶段,使得在多台服务器上处理海量数据成为可能。而HBase,则是构建在Hadoop之上的一款...
总结起来,这个“最高气温 map reduce hadoop 实例”展示了如何利用Hadoop MapReduce框架处理和分析大量气温数据,寻找全局的最高气温。通过理解MapReduce的工作流程,以及如何编写和运行对应的Mapper和Reducer代码...
MapReduce是Google提出的一种分布式计算模型,它将复杂的并行计算任务分解为两个主要阶段:Map(映射)和Reduce(规约)。Map阶段负责将原始输入数据分割成多个键值对,并分别处理;Reduce阶段则负责对Map阶段产生的...
Hadoop是Apache软件基金会开发的一个开源分布式计算框架,它的核心组件包括HDFS(Hadoop Distributed File System)和MapReduce。HDFS为海量数据提供了高容错、高扩展性的存储解决方案,而MapReduce则是用于并行处理...
【标题】"基于Hadoop计算机平均分"是一个关于利用Java编程语言和Apache Hadoop框架来计算数据集中的平均分数的项目。Hadoop是大数据处理领域的一个核心工具,它提供了分布式存储(HDFS)和分布式计算(MapReduce)的...
Hadoop Map Reduce 教程.doc
用户编写Map函数和Reduce函数,然后交给Hadoop框架进行处理。Map函数处理输入的键值对数据,生成中间键值对数据;Reduce函数再将这些中间键值对按键进行归约,产生最终的输出结果。这个过程可以在大量数据集上进行,...
Hadoop是Apache软件基金会开发的一个开源分布式计算框架,它设计用于处理和存储海量数据。这个系统的核心由两个主要组件组成:Hadoop Distributed File System (HDFS) 和 MapReduce。在"炼数成金hadoop完整课件(8)...
总结来说,本文详细讲解了Hadoop平台上WordCount的实现,包括map-reduce模型的应用、Java编程语言的应用和Hadoop命令行工具的使用等。本文可以作为学习Hadoop的map-reduce模型和词频统计技术的参考。