10分钟掌握Hive小文件过多如何解决?
写在前面
在做数据仓库的时候,使用动态分区会产生许多的小文件,给计算资源造成较大的影响,所以本文针对小文件如何规避计算资源浪费作了一些设计
为什么要处理小文件:
1、从Hive在进行mapreduce操作时,小文件map的次数较多,每个map对应JVM去执行,所以这些任务的初始化,启动,执行会浪费大量的资源,严重影响性能。
2. 在HDFS中,NameNode主要功能是接受客户端的读写服务。 NameNode维护着文件系统树及整棵树内所有的文件和目录。每个文件对象约占150byte ,如果文件过多会占用大量内存。NameNode内存容量严重制约了集群的扩展。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。 NameNode也记录着每个文件中各个块所在的数据节点信息,但它并不永久保存块的位置信息,因为这些信息在系统启动时由数据节点重建
1.通过调整参数合并
#每个Map最大输入大小(这个值决定了合并后文件的数量)
set mapred.max.split.size=256000000;
#一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)
set mapred.min.split.size.per.node=100000000;
#一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并)
set mapred.min.split.size.per.rack=100000000;
#执行Map前进行小文件合并
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
#===设置map输出和reduce输出进行合并的相关参数:
#设置map端输出进行合并,默认为true
set hive.merge.mapfiles = true
#设置reduce端输出进行合并,默认为false
set hive.merge.mapredfiles = true
#设置合并文件的大小
set hive.merge.size.per.task = 256*1000*1000
#当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge。
set hive.merge.smallfiles.avgsize=16000000
2.使用 distribute by rand() 将数据随机分配给 reduce
针对按分区插入数据的时候产生大量的小文件的问题, 可以使用DISTRIBUTE BY rand() 将数据随机分配给Reduce,这样可以使得每个Reduce处理的数据大体一致。
# 设置每个reducer处理的大小为5个G
set hive.exec.reducers.bytes.per.reducer=5120000000;
# 使用distribute by rand()将数据随机分配给reduce, 避免出现有的文件特别大, 有的文件特别小
insert overwrite table test partition(dt)
select * from iteblog_tmp
DISTRIBUTE BY rand();
3.存储格式
使用 sequencefile 作为表存储格式,不要用 textfile,在一定程度上可以减少小文件
4.使用hadoop的archive归档
#用来控制归档是否可用
set hive.archive.enabled=true;
#通知Hive在创建归档时是否可以设置父目录
set hive.archive.har.parentdir.settable=true;
#控制需要归档文件的大小
set har.partfile.size=1099511627776;
#使用以下命令进行归档
ALTER TABLE srcpart ARCHIVE PARTITION(ds='2008-04-08', hr='12');
#对已归档的分区恢复为原文件
ALTER TABLE srcpart UNARCHIVE PARTITION(ds='2008-04-08', hr='12');
#::注意,归档的分区不能够INSERT OVERWRITE,必须先unarchive
5.Hadoop自身方法
1)Hadoop Archive
Hadoop Archive或者HAR,是一个高效地将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样在减少namenode内存使用的同时,仍然允许对文件进行透明的访问。
2)Sequence file
sequence file由一系列的二进制key/value组成,如果为key小文件名,value为文件内容,则可以将大批小文件合并成一个大文件。
3)CombineFileInputFormat
它是一种新的inputformat,用于将多个文件合并成一个单独的split,另外,它会考虑数据的存储位置。
10分钟掌握Hive小文件过多如何解决?相关推荐
- hive小文件过多问题解决方法
小文件产生原因 hive 中的小文件肯定是向 hive 表中导入数据时产生,所以先看下向 hive 中导入数据的几种方式 直接向表中插入数据 insert into table A values (1 ...
- 解决hive小文件过多问题
hive 中的小文件肯定是向 hive 表中导入数据时产生,所以先看下向 hive 中导入数据的几种方式 1. 直接向表中插入数据 insert into table A values (1,'zha ...
- 有效解决hive小文件过多问题
小文件产生原因 hive 中的小文件肯定是向 hive 表中导入数据时产生,所以先看下向 hive 中导入数据的几种方式 直接向表中插入数据 insert into table A values (1 ...
- hive 小文件过多解决方案
目录 一.小文件产生原因 二.小文件过多产生的影响 三.怎么解决小文件过多 1. 使用 hive 自带的 concatenate 命令,自动合并小文件 2. 调整参数减少Map数量 3. 减少Redu ...
- hive小文件过多问题解决
起因 数据中台当前有一张流水类表,存在3200个分区,230w个数据文件,150亿条数据,导致该表查询起来及其麻烦,更令人糟心的是,业务人员不懂查询方式,经常有人使用select *的方式查询该表,导 ...
- 解决Hive动态分区小文件过多问题
一.问题描述 为了支撑相应的业务需求,本次生产环境通过Hive SQL来完成动态插入分区表数据的脚本开发.但是,动态分区的插入往往会伴随产生大量的小文件的发生.而小文件产生过多的影响主要分为以下两种情 ...
- Hive中数据倾斜和小文件过多的解决方案
数据倾斜: 任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成.因为其处理的数据量和其他reduce差异过大. 原因:某个reduce的数据 ...
- Hive小文件问题:如何产生、造成影响、解放办法
一.小文件是如何产生的 1.动态分区插入数据,产生大量的小文件,从而导致map数量剧增. 2.reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的). 3.数据源本身就包含大量的小 ...
- 视频教程-10分钟实现微信小程序支付功能-微信开发
10分钟实现微信小程序支付功能 码农一枚,非著名全栈开发人员.分享自己的一些经验,学习心得,希望后来人少走弯路,少填坑. 多年全栈开发经验,擅长小程序,java,安卓,web前端开发. 邱石 ¥19. ...
最新文章
- IBM用量子计算机成功模拟分子,登上《自然》封面
- 河南科技大学828计算机网络,2017年河南科技大学信息工程学院828计算机网络之数据库系统概论考研导师圈点必考题汇编...
- eclipse远程连接Hadoop,用户认证失败
- 掌握这 20 个容器实战技巧!
- iOS核心动画之CALayer-layer的创建
- [蓝桥杯2015初赛]生命之树-求树的最大子树权值和
- react dispatch_React系列自定义Hooks很简单
- 计算机网络学习笔记-1.2.4TCP,IP参考模型和五层参考模型
- mysql wb bbu_BBU
- uva 10891 - Game of Sum
- python字符串find_Python字符串find()
- Java Script基础(一)
- JNI 本地方法注册
- 英特尔傲腾内存linux,英特尔一面优化傲腾可持续内存性能 一面不忘科普
- 圆内接等边三角形的画法_几何画板应用教学,教你绘制圆的内接正三角形
- 快来喝杯Java(初级第一章)
- 奈何心是安定心,命总是流浪命
- 用手机打开exe文件
- 阿里云虚拟主机wordpress伪静态设置Nginx设置
- CDR插件开发之CPG插件016 -【实例】在CPG插件中动态导出图像到临时文件夹