您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

大多数开发人员都弄错的Hive与MapReduce小文件合并问题

时间:2023-01-31 16:27:52  来源:51CTO  作者:
因为设置上面四个参数,看上去规定了map结束,MR结束合并文件,如果文件平均小于smallfiles.avgsize启动一个新的MRj进行文件的二次合并。如果启动mr合并文件,没有问题。

0.背景

近来我们公司搞小文件治理(小于10Mb),小文件太多的危害就不此赘述了。公司的开发人员提供的合并小文件治理配置如下:

 

-- 设置小文件合并
set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true;
set hive.merge.size.per.task = 256000000 ;
set hive.merge.smallfiles.avgsize= 256000000 ;

 

看上去配置的没啥问题,不管是Map-only,还是MapReduce都考虑到了,只要输出的文件小于这个值,就重新启动一个MR去执行文件合并。看也符合Hive官网的配置解释

 

然而现实并非如此,废话不多说,you can you code,no can no bb.

原分析表数据在HDFS存储为551个小文件,下面所有的测试都是基于这个文件。

1.测试代码方案1

设置启动map前文件合并,先使用官方默认配置,实现文件合并测试

 

set  hive.input.format = org.Apache.hadoop.hive.ql.io.CombineHiveInputFormat; --官方默认值,也是当前平台默认值
set  hive.merge.smallfiles.avgsize=16000000;  --官方默认值,也是当前平台默认值
set  hive.merge.size.per.task=256000000;  --官方默认值,也是当前平台默认值
set  hive.merge.mapfiles  =true ;       --官方默认值,也是当前平台默认值
set  hive.merge.mapredfiles = true ;  --官方默认值,也是当前平台默认值

drop table if exists FDM_SOR.T_FSA_BHVR_NEW_EXPO_D_tmp_tmp;
create table FDM_SOR.t_fsa_bhvr_new_expo_d_tmp_tmp
stored as orc 
as 
select 
*  
from FDM_SOR.t_fsa_bhvr_new_expo_d 
where stat_date = '20200630'
 

结果:只产生了438个文件,看样子效果不错,文件变少了,但是发现还是有很多小于16Mb的文件,为啥设置了不管用呢,是不是set
hive.merge.smallfiles.avgsize官方的默认值给的太小了。需要加大。看实验2.

 

 

2.测试代码方案2

设置启动map前文件合并,将set
hive.merge.smallfiles.avgsize值加大,增加文件合并的Size。按照官方的说法当输出的文件平均小于16Mb时系统会再启动一个MR进行文件合并。这下该管用了吧,请看:

set  hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; --官方默认值,也是当前平台默认值
set  hive.merge.smallfiles.avgsize=256000000;  --改了这个值,由默认的16Mb,改成256Mb
set  hive.merge.size.per.task=256000000;  --官方默认值,也是当前平台默认值
set  hive.merge.mapfiles  =true ;  --官方默认值,也是当前平台默认值
set  hive.merge.mapredfiles = true ;  --官方默认值,也是当前平台默认值

drop table if exists FDM_SOR.T_FSA_BHVR_NEW_EXPO_D_tmp_tmp;
create table FDM_SOR.t_fsa_bhvr_new_expo_d_tmp_tmp
stored as orc 
as 
select 
*  
from FDM_SOR.t_fsa_bhvr_new_expo_d 
where stat_date = '20200630'

废话不多说,上结果请看

 

结果分析:没错,第一次MR因为Comb.NEText启动了438个map和上面一样,果然接着又启动了一个MR,进行输出后的文件合并。看样子很DIAO。合并要求文件大小不小256Mb,然后实际呢?pAppa。文件虽然减少了很多到351个,但依然有很多小文件,很多小于10Mb的文件,这个时候心里肯定一句

3.测试代码方案3

放大招,功夫有没有,代码走一走,加上split参数

set mapred.max.split.size=256000000;  
set mapred.min.split.size.per.node=100000000;
set mapred.min.split.size.per.rack=100000000;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set hive.merge.mapfiles = true ;
set hive.merge.mapredfiles = true ;
set hive.merge.size.per.task = 256000000 ;
set hive.merge.smallfiles.avgsize=160000000 ;

drop table if exists FDM_SOR.T_FSA_BHVR_NEW_EXPO_D_tmp_tmp;
create table FDM_SOR.T_FSA_BHVR_NEW_EXPO_D_tmp_tmp
stored as orc 
as 
select 
*  
from FDM_SOR.T_FSA_BHVR_NEW_EXPO_D 
where stat_date = '20200630'

废话不多说,上结果请看:

 

结果分析:这下好了,全是大文件,44大文件,每个大文件都是辣么大,最小的都是48Mb。为啥加了split参数以后就生效了呢。前面单独合并小文件参数没啥效果呢?网上随便搜一下,都是这种配置这种参数的?

-- 设置小文件合并
set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true;
set hive.merge.size.per.task = 256000000 ;
set hive.merge.smallfiles.avgsize= 256000000 ;

4.答案揭晓

因为设置上面四个参数,看上去规定了map结束,MR结束合并文件,如果文件平均小于smallfiles.avgsize启动一个新的MRj进行文件的二次合并。如果启动mr合并文件,没有问题。但是忽略了一个问题,你重新启动一个mr合并文件,这个mr是不是需要进行文件split,你这个参数搞小了,那就会产生很多task,很多map,比如很多小文件就是一个map,最终还是产生很多小文件(因为合并小文件的mr只有map)。所以必须要配合split参数才有用。具体split参数使用,参考我其他博客。

本文转载自微信公众号「涤生大数据」,作者「涤生大数据」,可以通过以下二维码关注。



Tags:Hive   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
一文搞明白Hive与数据库区别
Hive 采用了类似SQL 的查询语言 HQL (Hive Query Language),因此很容易将 Hive 理解为数据库。其实Hive 是为数据仓库设计的,是数据仓库的客户端,所以要搞清楚Hive与数据库的区...【详细内容】
2023-11-02  Search: Hive  点击:(187)  评论:(0)  加入收藏
MySQL到TiDB:Hive Metastore横向扩展之路
一、背景大数据元数据服务Hive Metastore Service(以下简称HMS),存储着数据仓库中所依赖的所有元数据并提供相应的查询服务,使得计算引擎(Hive、Spark、Presto)能在海量数据中准确...【详细内容】
2023-09-28  Search: Hive  点击:(336)  评论:(0)  加入收藏
十分钟掌握Doris,超越Hive、Elasticsearch和PostgreSQL
以前,数据仓库通常由Apache Hive、MySQL、Elasticsearch和PostgreSQL组成。它们支持数据仓库的数据计算和数据存储层: 数据计算:Apache Hive作为计算引擎。 数据存储:MySQL为Dat...【详细内容】
2023-09-27  Search: Hive  点击:(225)  评论:(0)  加入收藏
你真的能搞明白Hive与数据库区别吗?
Hive 采用了类似SQL 的查询语言 HQL (Hive Query Language),因此很容易将 Hive 理解为数据库。其实Hive 是为数据仓库设计的,是数据仓库的客户端,所以要搞清楚Hive与数据库的区...【详细内容】
2023-06-26  Search: Hive  点击:(195)  评论:(0)  加入收藏
【大数据】Hive Join 的原理与机制
一、概述Hive是一个基于Hadoop的数据仓库解决方案,它提供了类似于SQL的查询语言,称为HiveQL,用于处理结构化数据。在Hive中,JOIN操作用于将两个或多个表中的数据连接在一起,以便...【详细内容】
2023-05-08  Search: Hive  点击:(124)  评论:(0)  加入收藏
Hive DDL 操作与视图讲解
一、概述Hive是建立在Hadoop上的数据仓库工具,它允许用户通过类SQL的语法来查询和管理数据。在Hive中,DDL(数据定义语言)和视图操作是非常常见的。 1)表和视图关系表和视图都是数...【详细内容】
2023-05-06  Search: Hive  点击:(148)  评论:(0)  加入收藏
【大数据】Hive 分区和分桶的区别及示例讲解
一、概述在大数据处理过程中,Hive是一种非常常用的数据仓库工具。Hive分区和分桶是优化Hive性能的两种方式,它们的区别如下:1、分区概述Hive分区是把数据按照某个属性分成不同...【详细内容】
2023-05-04  Search: Hive  点击:(159)  评论:(0)  加入收藏
Hive 和 Spark 分区策略剖析
一、概述随着技术的不断的发展,大数据领域对于海量数据的存储和处理的技术框架越来越多。在离线数据处理生态系统最具代表性的分布式处理引擎当属Hive和Spark,它们在分区策略...【详细内容】
2023-03-30  Search: Hive  点击:(148)  评论:(0)  加入收藏
比Hive快十倍的大数据查询利器,你知道吗?
目前最流行的大数据查询引擎非hive莫属,它是基于MR的类SQL查询工具,会把输入的查询SQL解释为MapReduce,能极大的降低使用大数据查询的门槛, 让一般的业务人员也可以直接对大数据...【详细内容】
2023-03-07  Search: Hive  点击:(204)  评论:(0)  加入收藏
大多数开发人员都弄错的Hive与MapReduce小文件合并问题
因为设置上面四个参数,看上去规定了map结束,MR结束合并文件,如果文件平均小于smallfiles.avgsize启动一个新的MRj进行文件的二次合并。如果启动mr合并文件,没有问题。0.背景近来...【详细内容】
2023-01-31  Search: Hive  点击:(218)  评论:(0)  加入收藏
▌简易百科推荐
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(3)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(8)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(15)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(11)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(8)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(14)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(10)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(12)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(13)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条