写在前面

在做数据仓库的时候,使用动态分区会产生许多的小文件,给计算资源造成较大的影响,所以本文针对小文件如何规避计算资源浪费作了一些设计

为什么要处理小文件:

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小文件过多如何解决?相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 视频教程-10分钟实现微信小程序支付功能-微信开发

    10分钟实现微信小程序支付功能 码农一枚,非著名全栈开发人员.分享自己的一些经验,学习心得,希望后来人少走弯路,少填坑. 多年全栈开发经验,擅长小程序,java,安卓,web前端开发. 邱石 ¥19. ...

最新文章

  1. IBM用量子计算机成功模拟分子,登上《自然》封面
  2. 河南科技大学828计算机网络,2017年河南科技大学信息工程学院828计算机网络之数据库系统概论考研导师圈点必考题汇编...
  3. eclipse远程连接Hadoop,用户认证失败
  4. 掌握这 20 个容器实战技巧!
  5. iOS核心动画之CALayer-layer的创建
  6. [蓝桥杯2015初赛]生命之树-求树的最大子树权值和
  7. react dispatch_React系列自定义Hooks很简单
  8. 计算机网络学习笔记-1.2.4TCP,IP参考模型和五层参考模型
  9. mysql wb bbu_BBU
  10. uva 10891 - Game of Sum
  11. python字符串find_Python字符串find()
  12. Java Script基础(一)
  13. JNI 本地方法注册
  14. 英特尔傲腾内存linux,英特尔一面优化傲腾可持续内存性能 一面不忘科普
  15. 圆内接等边三角形的画法_几何画板应用教学,教你绘制圆的内接正三角形
  16. 快来喝杯Java(初级第一章)
  17. 奈何心是安定心,命总是流浪命
  18. 用手机打开exe文件
  19. 阿里云虚拟主机wordpress伪静态设置Nginx设置
  20. CDR插件开发之CPG插件016 -【实例】在CPG插件中动态导出图像到临时文件夹

热门文章

  1. C++简单排序——选择排序
  2. pandas循环写入多个sheet
  3. HTML——audio标签和video标签
  4. 顺序表指定位置插入元素
  5. 针孔式镜头的相关参数
  6. IDF实验室之牛刀小试-天孤剑-的微博
  7. Python【2021蓝桥杯省赛编程题】
  8. php502bad gateway,PHP表单提交后出现502 bad gateway解决办法
  9. *nux平台上的C10M问题
  10. mysql占位符井号_井字植草砖