hive仓库表数据最终是存储在HDFS上,由于Hadoop的特性,对大文件的处理非常高效。而且大文件可以减少文件元数据信息,减轻NameNode的存储压力。但是在数据仓库中,越是上层的表汇总程度就越高,数据量也就越小,而且这些表通常会有日期分区,随着时间的推移,HDFS的文件数目就会逐步增加。
一、小文件带来的问题
- HDFS的文件包好数据块和元信息,其中元信息包括位置、大小、分块等信息,都保存在NameNode的内存中。每个对象大约占用150个字节,因此一千万文件及分块就会占用约3G的内存空间,一旦接近这个量级,NameNode的性能就会开始下降。
- HDFS读写小文件时也会更加耗时,因为每次都需要从NameNode获取元信息,并且对应的DataNode建立连接。对于MapReduce程序来说,小文件会增加Mapper的数量,每个Map任务只会处理很少的数据,浪费大量的调度时间。
二、Hive小文件产生的原因
一方面hive数据仓库中汇总表的数据量通常比源数据少的多,而且为了提升运算速度,我们会增加Reduce的数量,Hive本身也会做类似的优化----Reducer数量等于源数据的量除以hive.exec.reducers.bytes.per.reduce所配置的量(默认1G)。Reduce数量的增加也即意味着结果文件的增加,从而产生小文件的问题。
解决小文件的问题可以从两个方向入手:
- 输入合并。即在map前合并小文件。
- 输出合并。即在输出结果的时候合并小文件。
三、配置Map输入合并
-- 每个Map最大输入大小,决定合并后的文件数 set mapred.max.split.size=256000000; -- 一个节点上split的至少的大小 ,决定了多个data node上的文件是否需要合并 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;
四、配置hive结果合并
通过设置hive的配置项在执行结束后对结果文件进行合并:
- set hive.merge.mapfiles = true #在Map-only的任务结束时合并小文件
- set hive.merge.mapredfiles = true #在Map-Reduce的任务结束时合并小文件
- set hive.merge.size.per.task = 256*1000*1000 #合并文件的大小
- set hive.merge.smallfiles.avgsize=16000000 #当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
hive在对结果文件进行合并时会执行一个额外的map-only脚本,mapper的数量是文件总大小除以size.per.task参数所得的值,触发合并的条件是:根据查询类型不同,相应的mapfiles/mapredfiles参数需要打开;结果文件的平均大小需要大于avgsize参数的值。
-- map-red job,5个reducer,产生5个60K的文件。 create table dw_stage.zj_small as select paid, count (*) from dw_db.dw_soj_imp_dtl where log_dt = '2014-04-14' group by paid; -- 执行额外的map-only job,一个mapper,产生一个300K的文件。 set hive.merge.mapredfiles= true; create table dw_stage.zj_small as select paid, count (*) from dw_db.dw_soj_imp_dtl where log_dt = '2014-04-14' group by paid; -- map-only job,45个mapper,产生45个25M左右的文件。 create table dw_stage.zj_small as select * from dw_db.dw_soj_imp_dtl where log_dt = '2014-04-14' and paid like '%baidu%' ; -- 执行额外的map-only job,4个mapper,产生4个250M左右的文件。 set hive.merge.smallfiles.avgsize=100000000; create table dw_stage.zj_small as select * from dw_db.dw_soj_imp_dtl where log_dt = '2014-04-14' and paid like '%baidu%' ;
五、压缩文件的处理
对于输出结果为压缩文件形式存储的情况,要解决小文件问题,如果在map输入前合并,对输出的文件存储格式并没有限制。但是如果使用输出合并,则必须配合SequenceFile来存储,否则无法进行合并,以下是实例:
set mapred.output.compression.type=BLOCK; set hive.exec.compress.output= true; set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzoCodec; set hive.merge.smallfiles.avgsize=100000000; drop table if exists dw_stage.zj_small; create table dw_stage.zj_small STORED AS SEQUENCEFILE as select * from dw_db.dw_soj_imp_dtl where log_dt = '2014-04-14' and paid like '%baidu%' ;
六、使用HAR归档文件
Hadoop的归档文件格式也是解决小文件问题的方式之一。而且hive提供了原生支持:
set hive.archive.enabled= true; 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' );
如果使用的不是分区表,则可以创建成外部表,并使用har://协议来指定路径。
转:http://blog.csdn.net/yycdaizi/article/details/43341239
相关推荐
Hive内部表合并小文件Java程序
Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能。
在Spark SQL执行etl时候会有最终结果大小只有几百k,但是小文件一个分区有上千的情况。危害: HDFS有最大文件数限制 浪费磁盘资源(可能存在空文件) Hive中进行统计,计算的时候,会产生很多个map,影响计算的速度 ...
小文件合并代码,
iceberg小文件合并代码
通过指定目录进行多线程执行合并小文件程序,由于hdfs小文件过多,可用于自定义合并orc小文件。
impala和hive中小文件合并问题解决
1. HIVE结构 6 1.1 HIVE架构 6 1.2 Hive 和 Hadoop 关系 7 1.3 Hive 和普通关系数据库的异同 8 1.4 HIVE元数据库 9 1.4.1 DERBY 9 1.4.2 Mysql 10 ...9.9 合并小文件 62 9.10 Group By 62 10. HIVE FAQ: 62
Hive用户指南 目录 1. HIVE结构 6 1.1 HIVE架构 6 1.2 Hive 和 Hadoop 关系 7 1.3 Hive 和普通关系数据库的异同 8 1.4 HIVE元数据库 9 1.4.1 DERBY 9 ...9.9 合并小文件 62 9.10 Group By 62 10. HIVE FAQ: 62
HiveTask执行SQL及合并小文件工具使用说明
先执行temp.exe将runonce1.hive加到exemade.exe的尾部,这样就做好了一个需要合并的exe.再次执行exemade.exe就可以释放出来hive文件了。 注意:这3个文件需要放在同一个文件夹下。 密码:L01_ujs
数据转换语句:可以通过Hive SQL进行数据转换,例如数据清洗、转换、合并等操作。 数据导出语句:可以将Hive表中的数据导出到本地文件系统或HDFS中。 总体而言,Hive SQL是面向数据仓库的一种数据操作语言,它使用...
在与csv文件夹相同的文件夹中生成.hive文件,并使用所有合并文件生成run.sh。 因此,只需切换到.hive脚本所在的文件夹并运行run.sh(./run.sh)。 该工具还将在.hive和run.sh脚本上设置执行权限,以便您可以直接执行...
特此免费授予获得此软件和相关文档文件(“软件”)副本的任何人无限制地处理软件的权利,包括但不限于使用,复制,修改,合并的权利,发布,分发,再许可和/或出售本软件的副本,并允许具备软件的人员这样做,但须...
通过一定的java程序设计做数据解析、结构化、各自合并成一个文件即可方便load到hive中。 输出:(两张表,一个用户表,一个评论内容表) 将两个类别下各自对应的文件集,进行解析、结构化。 通过load语法,将数据...
hive-tools 项目介绍 在网易集团内部有大大小小几百套 hive 集群,为了满足网易猛犸大数据平台的元数据统一管理的需求,我们需要将多个分别独立的 hive 集群的元数据信息进行合并,但是不需要移动 HDFS 中的数据文件...
Hadoop大数据常见问题及处理方法,使用 hive 自带的 concatenate 命令,自动合并小文件
技术点24 使用Avro 存储大量小文件 5.2 通过压缩提高数据存储效率 技术点25 选择合适的压缩解码器 技术点26 在HDFS、MapReduce、Pig 和Hive 中使用数据压缩 技术点27 在MapReduce、Hive 和Pig 中处理可分割的...
10.2.1 序列化和反序列化技术点64 载入日志文件10.2.2 UDF、分区、分桶和压缩技术点65 编写UDF 和压缩分区表10.2.3 数据合并技术点66 优化Hive 合并10.2.4 分组、排序和explain 10.3 本章小结11 ...
1. 到文件下初始化 2. 添加文件hive复习.md 3. 合并添加和提交,以及注释 4. 查看日志 2. 合并分支(把“目标分支”合并到“当前分支”)she