首页 > 其他分享 >Hive参数调优:如何控制reduce个数与参数调优(合并小文件和拆分大文件)

Hive参数调优:如何控制reduce个数与参数调优(合并小文件和拆分大文件)

时间:2024-01-29 11:57:47浏览次数:30  
标签:文件 set exec reduce 个数 hive 调优 参数 reducers

reduce的个数一般最后决定了输出文件的个数,如果想多输出文件的个数(这样文件变小,但有可能程序变慢),那么可以人为增加reduce个数。如果想减少文件个数,也可以手动较少reduce个数(同样可能程序变慢)。但实际开发中,reduce的个数一般通过程序自动推定,而不人为干涉,因为人为控制的话,如果使用不当很容易造成结果不准确,且降低执行效率。

1.控制reduce个数的方式与参数

1.1.首先可以通过参数直接控制最终reduce的个数,使用参数mapred.reduce.tasks

#官方默认-1,可根据数据量实际大小进行设置,一般情况下根据数据量大小设置这个参数可以使程序执行更快
set mapred.reduce.tasks=-1;

1.2.在hive中如果不指定reduce个数的情况下,Hive会猜测确定一个reduce个数,基于以下两个设定

1.set hive.exec.reducers.bytes.per.reducer=300000000    300Mb
 注意:在hive 0.14.0之前默认hive.exec.reducers.bytes.per.reducer默认值是1Gb,每个reduce最多处理1Gb。

但是在之后版本默认值都是256Mb.这里我们用的是300Mb。

为什么300Mb写的是300*1000*1000?因为网络传输中用的1000,而不是1024机制。

2.set hive.exec.reducers.max=1009    --默认值,这个值一般不会修改。

 注意,在hive 0.14.0之前默认是999,之后是1009,所以我们公司的也是官方默认值。
 
3.reduce计算方式:计算reducer数的公式很简单

Num=min(hive.exec.reducers.max2,map输出数据量/hive.exec.reducers.bytes.per.reducer)
 

2.通过hive.exec.reducers.bytes.per.reducer控制reduce个数

准备文件大表的大小为23.4G,存储为22个文件,平均每个文件大小都在1.1G左右。小表的文件2个,合计58Mb.

2.1通过hive.exec.reducers.bytes.per.reducer控制reduce个数

使用系统默认的配置参数,系统自动计算reduce个数,这里需要85个reduce。85*300>23.4G。程序运行时间为123S.

set mapred.max.split.size=256000000  ;
set mapred.min.split.size=10000000 ; 
set hive.exec.reducers.bytes.per.reducer = 300000000; 
 

2.2增大hive.exec.reducers.bytes.per.reducer = 1000000000; 发现需要的reduce变成了26个,减少了一大半。且满足26*1Gb>23.4G。但程序运行时间增加将近一半237s.

 
set mapred.max.split.size=256000000;
set mapred.min.split.size=10000000; 
set hive.exec.reducers.bytes.per.reducer = 1000000000;
 
Hadoop job information for Stage-1: number of mappers: 112; number of reducers: 26
Time taken: 237.104 seconds

2.3降低hive.exec.reducers.bytes.per.reducer = 128000000; 发现需要的reduce变成了,增加到197个。执行时间为141s.

set mapred.max.split.size=256000000;
set mapred.min.split.size=10000000; 
set hive.exec.reducers.bytes.per.reducer = 128000000;
Hadoop job information for Stage-1: number of mappers: 112; number of reducers: 197
Time taken: 141.371 seconds

3.通过mapred.reduce.tasks直接设置reduce个数

如下,手动设置reduce的个数为100个,则reduce的个数就是100个,每个reduce处理的数据按总数据量 /100.

set mapred.max.split.size=256000000;
set mapred.min.split.size=10000000; 
set mapred.reduce.tasks=100;
 
Hadoop job information for Stage-1: number of mappers: 112; number of reducers: 100

总结:

同map函数一样,启动和初始化reduce也会消耗时间和资源。所以reduce的个数不宜过多,且reduce的个数决定了最终输出文件的个数,如果reduce个数过多则会产生很多小文件,对于以后的计算也会降低效率。

当然reduce个数如果过少,也会造成单个reduce处理数据量太大也会影响程序的效率。所以一般reduce的个数最好让程序自己去推定与计算。

那么什么时候可以进行手动设定reduce数量呢?比如系统自动计算的reduce个数,因为集群资源不足,造成程序运行出现OOM(内存溢出不足)时,可以根据推定的reduce个数手动增加数量,保证程序在跑的慢的基础上可以完整运行。

4.reduce的特殊情况,程序只有一个reduce

一般map输出的结果值小于hive.exec.reducers.bytes.per.reducer值时,程序只有一个reduce没有问题,其次手动设置mapred.reduce.tasks=1,这个时候程序只有一个reduce。

那么正常除了这两种情况下,正常程序还有什么情况下只有 一个reduce呢?

1.代码用了order by ,因为order by是全局排序
order by 全局排序针对所有的数据,所以最终所有的数据都要分发给一个reduce去处理。比如这里23.4G文件使用order by,系统 启动了两个MR程序执行。最终使用一个reduce进行排序,极度慢,慎用。

2.表关联时出现了笛卡尔乘积

 表之间进行join时,如果出现 了笛卡尔乘积,需要全局处理,所以MR不得不使用 一个reduce去处理,所以要尽量避免出现这种 情况。

参考文档:

https://blog.csdn.net/qq_26442553/article/details/99693490
https://cloud.tencent.com/developer/article/1866347

标签:文件,set,exec,reduce,个数,hive,调优,参数,reducers
From: https://www.cnblogs.com/whiteY/p/17994193

相关文章

  • SqlServer还原数据库出现“无法在服务器上访问指定的路径或文件”提示的解决办法
    1、......
  • D35XB100-ASEMI整流桥D35XB100参数、封装、规格
    编辑:llD35XB100-ASEMI整流桥D35XB100参数、封装、规格型号:D35XB100品牌:ASEMI正向电流(Id):35A反向耐压(VRRM):1000V正向浪涌电流:550A正向电压(VF):1.05V引脚数量:5芯片个数:4芯片尺寸:MIL功率(Pd):大功率设备封装:GBJ-5工作温度:-40°C~150°C类型:插件、整流桥D35XB100描述:ASEMI......
  • java读取并解析XML文件的方法有哪些?
    XMLStreamReader:1. DOM(DocumentObjectModel)方式:DOM将整个XML文档加载到内存中,形成一颗树状结构,然后通过操作这个树状结构来获取所需要的数据。示例代码如下:importjavax.xml.parsers.*;importorg.w3c.dom.*;publicclassXMLParser{publicstaticvoidmain(Stri......
  • D35XB80-ASEMI整流桥D35XB80参数、封装、尺寸
    编辑:llD35XB80-ASEMI整流桥D35XB80参数、封装、尺寸型号:D35XB80品牌:ASEMI封装:GBJ-5最大重复峰值反向电压:800V最大正向平均整流电流(Vdss):35A功率(Pd):芯片个数:4引脚数量:5类型:插件、整流桥正向浪涌电流:450A正向电压:1.05V最大输出电压(RMS):封装尺寸:如图工作温度:-40°C~1......
  • Docker 入门系列(4)- Docker 数据管理(挂载目录、挂载文件、数据卷挂载、数据卷共享、数
    Docker入门系列(4)-Docker数据管理(挂载目录、挂载文件、数据卷挂载、数据卷共享、数据卷删除、数据卷容器备份和恢复):https://blog.csdn.net/wohu1104/article/details/84962695?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170649547416800213023691%2522%252C%252......
  • 推荐一个轻量的文件快递柜!像拿快递一样取文件!
    大家好,我是Java陈序员。很多时候,我们都想将一些文件或文本传送给别人,或者跨端传递一些信息!但是我们又不想为了分享,而去下载一些乱七八糟的软件。那么有没有一款工具可以快速实现跨平台传输文件信息的呢?答案是有的。今天给大家介绍一个文件分享工具,像拿快递一样取文件。关注......
  • 最新Unity DOTS Instancing合批:如何针对单个渲染实体修改材质参数
    最近在做DOTS的教程,由于DOTS(版本1.0.16)目前不支持角色的骨骼动画,我们是将角色的所有动画数据Baker到一个纹理里面,通过修改材质中的参数AnimBegin,AnimEnd来决定动画播放的起点和终点,材质参数AnimTime记录当前过去的动画时间。但是在做大规模战斗控制的时候,有10000+的小兵在战斗......
  • 自定义httpServletRequestWrapper导致上传文件请求参数丢失
    问题背景项目是SpringBoot单体式,在项目中,为了实现调用controller请求的日志记录功能。因此做了以下配置:创建自定义拦截器LogInterceptor;因为需要使用到流获取请求参数,解决流只能读一次问题,所以需要自定义HttpServletRequestWrapper;需要使得自定义HttpServletRequestW......
  • pandas高效读取大文件的探索之路
    使用pandas进行数据分析时,第一步就是读取文件。在平时学习和练习的过程中,用到的数据量不会太大,所以读取文件的步骤往往会被我们忽视。然而,在实际场景中,面对十万,百万级别的数据量是家常便饭,即使千万,上亿级别的数据,单机处理也问题不大。不过,当数据量和数据属性多了之后,读取文件的......
  • [转帖]Oracle SQL调优系列之cursor学习笔记
    https://cloud.tencent.com/developer/article/1995387 文章目录-[一、oracle库缓存](https://cloud.tencent.com/developer)-[1.1、库缓存简介](https://cloud.tencent.com/developer)-[1.2、相关概念](https://cloud.tencent.com/developer)......