hive性能优化

Hive性能优化:

hive分配map和reduce数量

m,r数据量,对效率影响较大,因为在启动和初始化阶段是很耗费时间和资源的。

(1)控制mapper的数据量

通常情况下,作业会通过input的目录产生一个或多个map任务,

主要决定的因素有:input的文件总个数,input的文件大小

Eg:

a) 假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(block为128M,6个128m的块和1个12m的块),从而产生7个map数

b) 假设input目录下有3个文件a,b,c,大小分别为10m,20m,130m,那么hadoop会分隔成4个块(10m,20m,128m,2m),从而产生4个map数

两种方式控制map数量:

通过合并小文件来实现

合并小文件参数属性:

(1)是否合并Map输出文件:hive.merge.mapfiles=true(默认值为真)

(2)是否合并Reduce 端输出文件:hive.merge.mapredfiles=false(默认值为假)

(3)合并文件的大小:hive.merge.size.per.task=25610001000(默认值为256000000)

通过控制上一个job的reduce数量来控制

(2)控制reducer的数据量

  Reducer的个数极大的影响执行效率,不指定reducer个数的情况下,hive分配reducer个数基于以下:

[if !supportLists](1)      [endif]参数1:hive.exec.reducers.bytes.per.reducer(默认为1G)

[if !supportLists](2)      [endif]参数2 :hive.exec.reducers.max(默认为999)

计算reducer数的公式

N=min(参数2,总输入数据量/参数1)

或者直接指定reducer个数:setmapred.reduce.tasks=13;   //但是效果不是很好

     Reducer个数不是越多越好,同map一样,启动和初始化reduce也会消耗时间和资源;有多少个reduce就有多少个输出文件

      Reduce数过多:生成很多小文件,如果这些小文件作为下一个任务的输入,则会出现小文件过多的问题

      Reduce过少:影响执行效率

     什么情况下只会有一个reduce:

       很多时候会发现,任务重不管数据量有多大,不管有没有调整reduce的个数,任务重一直都只有一个reduce

(1)    数据量小于hive.exec.reducers.bytes.per.reducer参数值的情况外

(2)   没有group by的汇总

(3)    用了order by


2.关于join:

(1)将数据量少的表或者子查询放在join的左边,

原因:在join操作的reduce阶段,位于join左边的表的数据会被加载进内存,将数据量少的表放在左侧,可以有效减少内存溢出的概率

注:如果多个join操作,且每个表参与多个join的字段相同,则将所有的join合并到一个mapperd程序中

Eg:

//在一个mapre程序中执行join

SELECT a.val, b.val, c.val

FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)   

//在两个mapred程序中执行join

SELECT a.val, b.val, c.val

FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2)  

Eg2中会在两个mapper中执行,是由于参与两次join的表b的key不一致


(2) Map join的关键在于join操作中的某个表的数据量很小,join操作在map中完成,不再需要reduce

Eg:

SELECT /*+ MAPJOIN(b) */ a.key,  a.value

  FROM a join b on a.key =  b.key

注:mapjoin无法执行a full/right outer join b 操作、

相关参数:

hive.join.emit.interval= 1000

hive.mapjoin.size.key= 10000

hive.mapjoin.cache.numrows = 10000


     注:在进行join操作的条件过滤的时候,应该讲过滤条件放在on关键词里面,这样可以提高效率

      原因:join操作是在where操作之前执行,所以在执行join时,where条件并不能起到减少join数据的作用


3.group by优化

      Map端聚合,首先在map端进行初步的聚合,最后在reduce端得出最终结果。

    相关参数:

(1)  hive.map.aggr = true  //是否在 Map 端进行聚合,默认为True

(2)  hive.groupby.mapaggr.checkinterval

= 100000 //在 Map 端进行聚合操作的条目数目

     数据倾斜的聚合优化,对数据进行聚合优化,可以进行参数设置:

       hive.groupby.skewindata = true


当此项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照Group

  By Key 分布到 Reduce 中(这个过程可以保证相同的 Group

  By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。



4. 如何调整map数量

 通常有一下参数可以决定map的数量

set mapred.max.split.size=256000000;        --决定每个map处理的最大的文件大小,单位为B

set mapred.min.split.size.per.node=1;         --节点中可以处理的最小的文件大小

set mapred.min.split.size.per.rack=1;         --机架中可以处理的最小的文件大小


没有办法直接控制map的数量,只能通过以上参数的设置来控制map的分配数量

set mapred.max.split.size=1024000000;

setmapred.min.split.size.per.node=1024000000;

setmapred.min.split.size.per.rack=1024000000;


 可以简单的理解为集群对一个表分区下面的文件进行分发到各个节点,之后根据mapred.max.split.size确认要启动多少个map数,逻辑如下     a.假设有两个文件大小分别为(256M,280M)被分配到节点A,那么会启动两个map,剩余的文件大小为10MB和35MB因为每个大小都不足241MB会先做保留     b.根据参数set

  mapred.min.split.size.per.node看剩余的大小情况并进行合并,如果值为1,表示a中每个剩余文件都会自己起一个map,这里会起两个,如果设置为大于45*1024*1024则会合并成一个块,并产生一个map     如果mapred.min.split.size.per.node为10*1024*1024,那么在这个节点上一共会有4个map,处理的大小为(245MB,245MB,10MB,10MB,10MB,10MB),余下9MB     如果mapred.min.split.size.per.node为45*1024*1024,那么会有三个map,处理的大小为(245MB,245MB,45MB)     实际中mapred.min.split.size.per.node无法准确地设置成45*1024*1024,会有剩余并保留带下一步进行判断处理     c. 对b中余出来的文件与其它节点余出来的文件根据mapred.min.split.size.per.rack大小进行判断是否合并,对再次余出来的文件独自产生一个map处理

重点:注意各参数的设置大小,不要冲突,否则会异常,大小顺序如下 

mapred.max.split.size <= mapred.min.split.size.per.node

<= mapred.min.split.size.per.rack 

调整reduce数量,不建议随意设置reduce参数,可能调整参数更好一点 

set hive.exec.reducers.bytes.per.reducer=1073741824

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,924评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,902评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,716评论 0 239
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,783评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,166评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,510评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,784评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,476评论 0 196
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,196评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,459评论 2 243
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,978评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,321评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,964评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,046评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,803评论 0 193
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,530评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,420评论 2 265

推荐阅读更多精彩内容