hadoop & hive任务优化之map个数的影响因子

原创 2016年06月01日 21:21:36

 很早就想写hadoop任务优化的系列博客,趁今晚有闲暇,就以经常难住应聘hadoop研发工程师相关岗位人员经典题目为例说起吧。由于hive是架接在hadoop之上,故两者在这个问题上是一致的,故合并在一起讲解。因为目前hadoop主流版本已为hadoop2.x,故以下讲解均以hadoop2.x为基础。
      见到大多数的研发人员都认为hadoop很历害,放上个任务就去集群上跑,快慢他们并不在乎,只是关心能否跑出结果。这样的hadoop用法确实太过粗浅,用hive之类的工具可以在10分钟内教给一个懂sql的人学会应用hadoop。这远不是一个专业的hadoop应用开发工程师所应要求的,而应是深入hadoop运行原理、参数详解、任务过程剖析等方面,使hadoop真正成为大数据处理平台。下面言归正传。
       1、集群的container总大小
            这个是最外层的因素,集群一般会做设置,当job产生的map数大于某一阀值时候,直接禁止提交。
            但由于hadoop2.x已是动态分配container,往往只限制内存+CPU,并没有明确的个数限制。但当超过分配的CPU或是内存其一的大小时候,将直接禁止提交。
       2、分配到用户所属调度队列的资源总大小
            与1中相似,由于目前hadoop2.x集群多采用公平调度的多队列资源分配管理。只要当前用户所提交任务不超过当前所属队列的总资源大小,即可被提交。
       3、当前任务的输入数据的文件个数
             这是最复杂的情况,
            3.1 当输入的每个文件的大小均小于集群设置的块大小,则有多少个输入文件,则会产生多少个map任务。
            3.2 当输入的文件中,有大于一个block size的时候,且该文件的格式可拆分,如lzo,textfile等,则该文件会被拆分成两个map,其它的类似文件也是如是处理。
                  当有大于blocksize的时候,但该文件格式不可拆分,如gzip,deflate等,则该文件依然不会被拆分,即有多少个文件就产生多少个map任务。
       4、输入数据文件的格式
             当输入文件的格式不可拆分时,如gzip ,deflate时候,则产生的map任务个数均为文件的数量。
             当输入文件的格式可拆分时候,如lzo,textfile的时候,则产生的文件个数可以通过以下参数来动态协调优化:
             如: set mapred.max.split.size=256000000;  #每个Map最大输入大小 ,单位字节,该大小为256M
            假设blocksize为128M,当某文件大小大于该数值时候,按该数值大小处理,不再拆分成多个blocksize分开处理。
                           
        5、人工设置map task个数mapred.map.tasks
             该因子会间接影响map的产生个数,其计算公式和方法,链接如下
             http://blog.sina.com.cn/s/blog ... .html,讲解的比较具体和细致,我就不赘述了。
        6、map输入端合并
           set mapred.max.split.size=256000000;  #每个Map最大输入大小 ,单位字节
           set mapred.min.split.size.per.node=100000000; #一个节点上split的至少的大小 ,单位字节
           set mapred.min.split.size.per.rack=100000000; #一个交换机下split的至少的大小 ,单位字节
           set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  #执行Map前进行小文件合并 的执行类;
其中,mapred.max.split.size决定多个文件合并后,最大可以形成一个多大的数据块,即决定多少个小文件可以参与合并。
mapred.min.split.size.per.node决定跨data node节点的小文件是否可以合并,
mapred.min.split.size.per.rack决定跨交换机上的小文件是否可以合并。
最后由类org.apache.hadoop.hive.ql.io.CombineHiveInputFormat来执行以输入数据合并操作,
并将输出作为真正计算的map的输入。

总结:
        hadoop任务优化的核心是,合理的job任务产生合适 的map/reduce个数,每个map/reduce处理合适的数据条数。
 最大的障碍在于job产生木桶效应,某个map或是某个reduce处理时间过长,直接决定了job的运行时间。
        故解决此问题有5点,a、对数据本身的大小、条目数清楚,
                                       b、业务逻辑代码的合理性
                                       c、系统参数设置合理
                                       d、合理的map生成
                                       e、合理的reduce生成
有以上5点,才可以真正成为hadoop开发的优秀开发人员。    


更多学习讨论,          请加入官方QQ技术群320349384,
                                 官方天亮论坛:http://bbs.yuqing36524.com/
                                 天亮教育视频链接:http://pan.baidu.com/s/1pJJrcqJ





浅谈hadoop map过程,以及一些调优

每次map 将key val 写到一个writebuff wb中,wb里有个spill值(就是个wb 的空间比例),每当达到spill值, 就会输出这段spill(default 100m),输出前会...
  • G7N3F
  • G7N3F
  • 2016年01月20日 17:49
  • 680

Hadoop map调优参数

参数:io.sort.mb(default 100) 当map task开始运算,并产生中间数据时,其产生的中间结果并非直接就简单的写入磁盘。 而是会利用到了内存buffer来进行已经产生的部分结...

Hadoop MapReduce Job性能调优——修改Map和Reduce个数

map task的数量即mapred.map.tasks的参数值,用户不能直接设置这个参数。Input Split的大小,决定了一个Job拥有多少个map。默认input split的大小是64M(与...

hive中控制map和reduce数量的简单实现方法

通过mapred.max.split.size等参数控制hive中的map个数进行资源控制

Hive中如何确定map数

Hive 是基于 Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 sql 查询功能,可以将 sq l语句转换为 MapReduce 任务进行运行。当运行一个 h...

hive优化之-控制hive任务中的map数和reduce数

1.    通常情况下,作业会通过input的目录产生一个或者多个map任务。  主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hiv...

hive优化之-控制hive任务中的map数和reduce数

hive优化之-控制hive任务中的map数和reduce数 一、    控制hive任务中的map数:  1.    通常情况下,作业会通过input的目录产生一个或者多个map任务。 ...

MapReduce任务参数调优和说明

最近在涉及到hadoop mr跑任务时间和效率太慢看到一些参数的相关说明就顺手转过来已备用后续再看或者其它朋友看到。 本文主要记录Hadoop 2.x版本中MapReduce参数调优...

Hadoop-2.4.1学习之如何确定Mapper数量

本篇文章通过源代码分析了在输入格式为TextInputFormat的情况下,hadoop-2.4.1如何确定Mapper任务的数量...

map和reduce 个数的设定 (Hive优化)经典

一、   控制hive任务中的map数:  1.   通常情况下,作业会通过input的目录产生一个或者多个map任务。  主要的决定因素有: input的文件总个数,input的文件大小,集...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hadoop & hive任务优化之map个数的影响因子
举报原因:
原因补充:

(最多只允许输入30个字)