解决hive表小文件过多问题

举报
bigdata张凯翔 发表于 2021/03/28 01:05:03 2021/03/28
【摘要】 问题描述: 前些时间,运维的同事反应小文件过多问题,需要我们去处理,所以想到是以何种手段去合并现有的小文件。我们知道Hadoop需要在namenode维护文件索引相关的metadata,所以小文件过多意味着消耗更大的内存空间。 过程 经过网上的调研发现通过hive表使用orc格式进行存储能够通过concatenate命令对分区进行小文件合并,并且能够节省80%以上的存储空间,...

问题描述:

前些时间,运维的同事反应小文件过多问题,需要我们去处理,所以想到是以何种手段去合并现有的小文件。我们知道Hadoop需要在namenode维护文件索引相关的metadata,所以小文件过多意味着消耗更大的内存空间。

过程

经过网上的调研发现通过hive表使用orc格式进行存储能够通过concatenate命令对分区进行小文件合并,并且能够节省80%以上的存储空间,真是喜闻乐见!

本文不再详细介绍orc,text,rc,parquet各种对比,具体可参考Hive基础(五)-Hive的压缩和存储格式,下面只是以举例为主。

创建一个orc hive 表:

CREATE EXTERNAL TABLE `app.example_orc`(
  `timestamp` string COMMENT '时间戳',
  `city` string)
PARTITIONED BY (
  `dt` string)
STORED AS ORC
LOCATION
  'hdfs://xxxxxxxx/test'
TBLPROPERTIES (
  'mart_name'='xxxx',
  'transient_lastDdlTime'='1476148520');

从别的表导数据到此表的20180505分区:
INSERT INTO TABLE app.example_orc partition(dt="20180505",dt="xxxxx"...) select timestamp, city from app.nielsenid_device2pin_unmapped where dt="20180505"
使用concatenate命令针对20180505分区进行小文件合并:
alter table app.example_orc partition (dt="20180505") concatenate;
不足点:
使用concatenate命令合并小文件时不能指定合并后的文件数量,虽然可以多次执行该命令,但显然不够优雅。
当多次使用concatenate后文件数量不在变化,这个跟参数mapreduce.input.fileinputformat.split.minsize=256mb的设置有关,可设定每个文件的最小size;
只能针对分区使用concatenate命令。

更多参考:
Hive优化(十三)-小文件进行合并

文章来源: www.jianshu.com,作者:百忍成金的虚竹,版权归原作者所有,如需转载,请联系作者。

原文链接:www.jianshu.com/p/a0cd44aeca3e

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。