小文件产生原因

hive 中的小文件肯定是向 hive 表中导入数据时产生,所以先看下向 hive 中导入数据的几种方式

  1. 直接向表中插入数据

insert into table A values (1,'zhangsan',88),(2,'lisi',61);
这种方式每次插入时都会产生一个文件,多次插入少量数据就会出现多个小文件,但是这种方式生产环境很少使用,可以说基本没有使用的
  1. 通过load方式加载数据

load data local inpath '/export/score.csv' overwrite into table A  -- 导入文件
load data local inpath '/export/score' overwrite into table A   -- 导入文件夹
使用 load 方式可以导入文件或文件夹,当导入一个文件时,hive表就有一个文件,当导入文件夹时,hive表的文件数量为文件夹下所有文件的数量
  1. 通过查询方式加载数据

insert overwrite table A  select s_id,c_name,s_score from B;
这种方式是生产环境中常用的,也是最容易产生小文件的方式

insert 导入数据时会启动 MR 任务,MR中 reduce 有多少个就输出多少个文件

所以, 文件数量=ReduceTask数量*分区数

也有很多简单任务没有reduce,只有map阶段,则

文件数量=MapTask数量*分区数

每执行一次 insert 时hive中至少产生一个文件,因为 insert 导入时至少会有一个MapTask。
像有的业务需要每10分钟就要把数据同步到 hive 中,这样产生的文件就会很多。

小文件过多产生的影响

  1. 首先对底层存储HDFS来说,HDFS本身就不适合存储大量小文件,小文件过多会导致namenode元数据特别大, 占用太多内存,严重影响HDFS的性能

  2. 对 hive 来说,在进行查询时,每个小文件都会当成一个块,启动一个Map任务来完成,而一个Map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费。而且,同时可执行的Map数量是受限的。

怎么解决小文件过多

1. 使用 hive 自带的 concatenate 命令,自动合并小文件

使用方法:

#对于非分区表alter table A concatenate;
#对于分区表alter table B partition(day=20201224) concatenate;

举例:

#向 A 表中插入数据hive (default)> insert into table A values (1,'aa',67),(2,'bb',87);hive (default)> insert into table A values (3,'cc',67),(4,'dd',87);hive (default)> insert into table A values (5,'ee',67),(6,'ff',87);
#执行以上三条语句,则A表下就会有三个小文件,在hive命令行执行如下语句#查看A表下文件数量hive (default)> dfs -ls /user/hive/warehouse/A;Found 3 items-rwxr-xr-x   3 root supergroup        378 2020-12-24 14:46 /user/hive/warehouse/A/000000_0-rwxr-xr-x   3 root supergroup        378 2020-12-24 14:47 /user/hive/warehouse/A/000000_0_copy_1-rwxr-xr-x   3 root supergroup        378 2020-12-24 14:48 /user/hive/warehouse/A/000000_0_copy_2
#可以看到有三个小文件,然后使用 concatenate 进行合并hive (default)> alter table A concatenate;
#再次查看A表下文件数量hive (default)> dfs -ls /user/hive/warehouse/A;Found 1 items-rwxr-xr-x   3 root supergroup        778 2020-12-24 14:59 /user/hive/warehouse/A/000000_0
#已合并成一个文件

注意: 
1、concatenate 命令只支持 RCFILE 和 ORC 文件类型。 
2、使用concatenate命令合并小文件时不能指定合并后的文件数量,但可以多次执行该命令。 
3、当多次使用concatenate后文件数量不在变化,这个跟参数 mapreduce.input.fileinputformat.split.minsize=256mb 的设置有关,可设定每个文件的最小size。

2. 调整参数减少Map数量

  • 设置map输入合并小文件的相关参数

#执行Map前进行小文件合并#CombineHiveInputFormat底层是 Hadoop的 CombineFileInputFormat 方法#此方法是在mapper中将多个文件合成一个split作为输入set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; -- 默认
#每个Map最大输入大小(这个值决定了合并后文件的数量)set mapred.max.split.size=256000000;   -- 256M
#一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)set mapred.min.split.size.per.node=100000000;  -- 100M
#一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并)set mapred.min.split.size.per.rack=100000000;  -- 100M
  • 设置map输出和reduce输出进行合并的相关参数:

#设置map端输出进行合并,默认为trueset hive.merge.mapfiles = true;
#设置reduce端输出进行合并,默认为falseset hive.merge.mapredfiles = true;
#设置合并文件的大小set hive.merge.size.per.task = 256*1000*1000;   -- 256M
#当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件mergeset hive.merge.smallfiles.avgsize=16000000;   -- 16M
  • 启用压缩

# hive的查询结果输出是否进行压缩set hive.exec.compress.output=true;
# MapReduce Job的结果输出是否使用压缩set mapreduce.output.fileoutputformat.compress=true;

3. 减少Reduce的数量

#reduce 的个数决定了输出的文件的个数,所以可以调整reduce的个数控制hive表的文件数量,#hive中的分区函数 distribute by 正好是控制MR中partition分区的,#然后通过设置reduce的数量,结合分区函数让数据均衡的进入每个reduce即可。
#设置reduce的数量有两种方式,第一种是直接设置reduce个数set mapreduce.job.reduces=10;
#第二种是设置每个reduce的大小,Hive会根据数据总大小猜测确定一个reduce个数set hive.exec.reducers.bytes.per.reducer=5120000000; -- 默认是1G,设置为5G
#执行以下语句,将数据均衡的分配到reduce中set mapreduce.job.reduces=10;insert overwrite table A partition(dt)select * from Bdistribute by rand();
解释:如设置reduce数量为10,则使用 rand(), 随机生成一个数 x % 10 ,这样数据就会随机进入 reduce 中,防止出现有的文件过大或过小

4. 使用hadoop的archive将小文件归档

Hadoop Archive简称HAR,是一个高效地将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样在减少namenode内存使用的同时,仍然允许对文件进行透明的访问

#用来控制归档是否可用set hive.archive.enabled=true;#通知Hive在创建归档时是否可以设置父目录set hive.archive.har.parentdir.settable=true;#控制需要归档文件的大小set har.partfile.size=1099511627776;
#使用以下命令进行归档ALTER TABLE A ARCHIVE PARTITION(dt='2020-12-24', hr='12');
#对已归档的分区恢复为原文件ALTER TABLE A UNARCHIVE PARTITION(dt='2020-12-24', hr='12');

注意:  
归档的分区可以查看不能 insert overwrite,必须先 unarchive

最后

如果是新集群,没有历史遗留问题的话,建议hive使用 orc 文件格式,以及启用 lzo 压缩。
这样小文件过多可以使用hive自带命令 concatenate 快速合并。

hive小文件过多问题解决方法相关推荐

  1. hive小文件过多问题解决

    起因 数据中台当前有一张流水类表,存在3200个分区,230w个数据文件,150亿条数据,导致该表查询起来及其麻烦,更令人糟心的是,业务人员不懂查询方式,经常有人使用select *的方式查询该表,导 ...

  2. 解决hive小文件过多问题

    hive 中的小文件肯定是向 hive 表中导入数据时产生,所以先看下向 hive 中导入数据的几种方式 1. 直接向表中插入数据 insert into table A values (1,'zha ...

  3. hive 小文件过多解决方案

    目录 一.小文件产生原因 二.小文件过多产生的影响 三.怎么解决小文件过多 1. 使用 hive 自带的 concatenate 命令,自动合并小文件 2. 调整参数减少Map数量 3. 减少Redu ...

  4. 有效解决hive小文件过多问题

    小文件产生原因 hive 中的小文件肯定是向 hive 表中导入数据时产生,所以先看下向 hive 中导入数据的几种方式 直接向表中插入数据 insert into table A values (1 ...

  5. 10分钟掌握Hive小文件过多如何解决?

    写在前面 在做数据仓库的时候,使用动态分区会产生许多的小文件,给计算资源造成较大的影响,所以本文针对小文件如何规避计算资源浪费作了一些设计 为什么要处理小文件: 1.从Hive在进行mapreduce ...

  6. 解决Hive动态分区小文件过多问题

    一.问题描述 为了支撑相应的业务需求,本次生产环境通过Hive SQL来完成动态插入分区表数据的脚本开发.但是,动态分区的插入往往会伴随产生大量的小文件的发生.而小文件产生过多的影响主要分为以下两种情 ...

  7. Hive中数据倾斜和小文件过多的解决方案

    数据倾斜: 任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成.因为其处理的数据量和其他reduce差异过大. 原因:某个reduce的数据 ...

  8. Hive小文件问题:如何产生、造成影响、解放办法

    一.小文件是如何产生的 1.动态分区插入数据,产生大量的小文件,从而导致map数量剧增. 2.reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的). 3.数据源本身就包含大量的小 ...

  9. 逆水寒服务器更新响应超时,逆水寒patcher.zip文件更新失败怎么办 更新文件异常问题解决方法...

    逆水寒ol是由网易打造的一款国风武侠动作角色扮演类网游,游戏进行了更新推送,但是不少玩家出现了更新文件异常的问题,之后手动下载更新文件也无法下载,那么该如何解决?下面小编带来更新文件异常问题解决方法, ...

最新文章

  1. part.write java_使用javax.servlet.http.Part类上传文件
  2. 使用wamp访问localhost时查看项目地址不对
  3. java实现MD5加密
  4. 企业托管云模式 浪潮ERP签约山东医药
  5. 重启sshd_调整linux服务器sshd的MaxStartups,确保可以并行登录
  6. java IO流小结
  7. Python GUI 截图小工具 实例Demo
  8. 一个数据科学家对商学院的建议
  9. 法国政府正考虑采用开源软件
  10. 百度移动搜索落地页体验广告白皮书3.0上线
  11. 谷歌大脑2017技术研究总结 | Jeff Dean执笔(附论文 数据集)
  12. window10 多桌面切换快捷键 win+tab
  13. Java多态学习笔记
  14. HTTP 的前世今生
  15. jav中spark迁移hive到mongo(更新数据)
  16. 产品经理之如何快速阐释产品价值(FABE模型)
  17. 迅雷下载的都是php_为什么用迅雷下载的是PHP文件?
  18. OFFICES当出现“向程序发送命令时出现问题”错误怎么解决
  19. 从前有座灵剑山--与邪教辩论(1)
  20. 毫无破绽!用这个开源项目换了张脸后,连女朋友都难分真假,能否骗过刷脸支付?...

热门文章

  1. 【Android应用实例之四】计时器之通过ServiceBroadcastReceiver实现UI动态更新
  2. 电子工程师必须懂得如何规划自己的人生
  3. MyBatis 学习笔记 - 2021-7-10 - 2021-7-13
  4. android:exported =true,什么是具有相同用户ID的Android应用程序
  5. Kubernetes单机部署-一键安装
  6. 1.如何让另一台电脑访问本机发布的web项目
  7. 在线白板怎么演示?分享一种思路
  8. 2021年明日方舟[限定寻访·春节]【月隐晦明】限时寻访抽卡模拟器源代码(自制)
  9. MongoDB对数据的操作
  10. 文件服务器鉴权,服务鉴权