Hive参数层面优化之二控制Reduce数

Reduce数决定中间或落地文件数,文件大小和Block大小无关。

1、Reduce个数的决定因素

reduce个数的设定极大影响任务执行效率,不指定reduce个数的情况下,Hive会猜测确定一个reduce个数,基于以下两个设定:

参数1:hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G)

参数2:hive.exec.reducers.max(每个作业最大的reduce数,默认为999)

计算reducer数的公式

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

即:如果reduce的输入(map的输出)总大小不超过1G,那么只会有一个reduce任务;

案例:

select pt,count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04‘ group by pt; 

文件存放位置:/group/p_sdo_data/p_sdo_data_etl/pt/popt_tbaccountcopy_mes/pt=2012-07-04

总大小为9G多,因此这句有10个reduce

最佳实践:通常情况下,有必要手动指定reducer的个数。考虑到map阶段的输出数据量通常会比输入有大幅减少,因此即使不设定reducer个数,重设hive.exec.reducers.max也是很有必要的。依据hadoop的经验,可以将reducer的个数设定为0.95*集群中TaskTracker的个数

2、Reduce数过大或过小引发的问题

Reduce数过大将导致:

1)  生成了很多个小文件(最终输出文件有reduce决定,一个reduce一个文件,输出文件的大小和设置的block的大小是没有关系的),那么如果这些小文件作为下一个Job输入,则也会出现小文件过多需要进行合并的问题;

2)  启动和初始化reduce也会消耗时间和资源;

3)  有多少个reduce就会有多少个输出文件;

Reduce数过小将导致:

1)  执行耗时;

2)  可能出现数据倾斜(比如:500个map只有1个reduce);

3、调整Reduce个数

调整reduce个数方法一: 调整hive.exec.reducers.bytes.per.reducer参数的值;

案例:

set hive.exec.reducers.bytes.per.reducer=500000000; (500M)

select pt,count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04‘ group by pt; 

这次有20个reduce

调整reduce个数方法二:mapred.reduce.tasks

Hive中默认值是1;

案例:

在多个作业共享的某个结果集的数据job时,如果只设定了一个reduce,则该job只有一个输出文件,那么后续的多个job使用该job的输出时,只能使用一个map进行处理,速度会非常慢;可以通过设置共享作业的reduce数使得有多个输出,则后续的job就可以多个map并行处理;现实环境中需要根据实际的数据流来设置reduce的个数;

那么如何查询文件的数据量呢?

hadoop fs -du 文件名 

根据实际数据量来设定合适的reduce个数;

多个作业共享的某个结果集的数据job或者某个job被后边多个job多次引用,可设大该参数(reduce数),以便增大后续访问的Map

如果某个job执行完毕后的数据不会再被后续的job继续使用,就无所谓是否通过手工指定reduce数了。

案例:

set mapred.reduce.tasks = 15;select pt,count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04‘ group by pt;

这次有15个reduce

4、只有一个Reduce数的常见场景

很多时候你会发现任务中不管数据量多大,不管你有没有设置调整reduce个数的参数,任务中一直都只有一个reduce任务(数据倾斜的表象之一);

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

2)   没有group by的汇总(group by key会按照不同的key分发到不同的reduce上);

比如把select pt,count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04‘ group by pt;

写成 select count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04‘;

3)   用了order by(整个作业排序,性能低);

5、Reduce数总结

在设置reduce个数的时候也需要考虑这两个原则:

1)  使大数据量利用合适的reduce

2)  使单个reduce任务处理合适的数据量

Hive参数层面优化之二控制Reduce数,布布扣,bubuko.com

时间: 2025-01-20 22:01:46

Hive参数层面优化之二控制Reduce数的相关文章

Hive参数层面优化之一控制Map数

1.Map个数的决定因素 通常情况下,作业会通过input文件产生一个或者多个map数: Map数主要的决定因素有: input总的文件个数,input文件的大小和集群中设置的block的大小(在hive中可以通过set dfs.block.size命令查看,该参数不能自定义修改): 文件块数拆分原则:如果文件大于块大小(128M),那么拆分:如果小于,则把该文件当成一个块. 举例一: 假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和

Hive架构层面优化之二合理利用中间结果集(单Job)

是针对单个作业,针对本job再怎么优化也不会影响到其他job: Hadoop的负载主要有两部分:CPU负载和IO负载: 问题:机器io开销很大,但是机器的cpu开销较小,另外map输出文件也较大,怎么办? 解决办法:通过设置map的中间输出进行压缩就可以了,这个不会影响最终reduce的输出. 集群中的机器一旦选定了,那么CPU就没的改变了,所以集群的最主要的负载还是IO负载: 压缩技术虽然可以降低IO负载,但是同时也加重了CPU负载,治标不治本,CPU加重了,整体性能还是上不去:如果当前CPU

Hive调优(语法与参数层面优化)

一.简介 作为企业Hadoop应用的核心产品,Hive承载着FaceBook.淘宝等大佬 95%以上的离线统计,很多企业里的离线统计甚至全由Hive完成,如我所在的电商.Hive在企业云计算平台发挥的作用和影响愈来愈大,如何优化提速已经显得至关重要. 好的架构胜过任何优化,好的Hql同样会效率大增,修改Hive参数,有时也能起到很好的效果. 有了瓶颈才需要优化 1.Hadoop的主要性能瓶颈是IO负载,降IO负载是优化的重头戏. 2.对中间结果的压缩 3.合理设置分区,静态分区和动态分区 二.H

Hive语法层面优化之一数据倾斜介绍

数据倾斜:数据分布不均匀,造成数据大量的集中到一点,造成数据热点: 由于数据并不是平均分配的,会导致各个节点上处理的数据量是不均衡的,所以数据倾斜是无法避免的: 造成数据倾斜的最根本原因:key分发不均匀造成的: 常见的数据倾斜的症状 1)  Map阶段快,reduce阶段非常慢: 2)  某些map很快,某些map很慢: 3)  某些reduce很快,某些reduce很慢: 4)  任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成,

Hive语法层面优化之四count(distinct)引起的数据倾斜

当该字段存在大量值为null或空的记录,容易发生数据倾斜: 解决思路: count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1: 如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union. 案例: select count(distinct end_user_id) as user_num from trackinfo; 调整为: select cast(count(

Hive语法层面优化之五分析执行计划追踪导致数据倾斜的原因

count(distinct key)案例 explain select count(distinct session_id) from trackinfo where ds=' 2013-07-21' ; STAGE DEPENDENCIES: Stage-1 is a root stage Stage-0 is a root stage STAGE PLANS: Stage: Stage-1 Map Reduce Alias -> Map Operator Tree: trackinfo T

Hive架构层面优化之四 常用复杂/低效的统计从源上给出,以避免上层作业过多计算

案例一:trackinfo,基础表处理常用的低性能UDF 背景描述:日志信息10分钟加载一次到实时日志表trackreal中(按小时分区),为了保证实时性,在加载的过程中并没有做任何的过滤处理,加载到trackreal表后再过滤非法数据.爬虫数据等,生成按天增量日志表trackinfo,然后根据不同的page_type来统计流量. 解决方案如下: select '首页', count(*) pv, #每条记录就是一条pv count(distinct session_id) uv #根据sess

Hive语法层面优化之六数据倾斜常见案例

常见案例一:空值产生的数据倾斜 日志表有一部分的user_id为空或者是0的情况,导致在用user_id进行hash分桶时,会将日志由user_id为0或者为空的数据分到一个reduce上,导致数据倾斜: 如:访户未登录时,日志中的user_id为空,用user_id和用户表的user_id进行关联的时候,会将日志中的user_id为空的数据分到一起,导致了过大的空key造成数据倾斜: 解决办法:随机函数解决数据倾斜 把空值的key变成一个字符串加上随机数(只要不与真正的end_user_id的

Hive架构层面优化之七压缩

常见的压缩有:对中间结果压缩.对输出结果压缩. 压缩对比: 算法 压缩前/压缩后 压缩速度 解压速度 GZIP 13.4% 21MB/s 118 MB/s LZO 20.5% 135 MB/s 410 MB/s Snappy 22.2% 172 MB/s 409 MB/s Snappy介绍: Snappy 网站:http://code.google.com/p/snappy/ Snappy的前身是Zippy.虽然只是一个数据压缩库,它却被Google用于许多内部项目程,其中就包括BigTable