如何使用蜂巢合并小文件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
<节> <节> <节> <节> <节>问题背景 ,,节> <节> 节> <节> 节> <节> 节> 节> 节> 节> 节>目前集群存于一个非常不健康的状态,主要问题是小文件太多,单个DataNode的区块数量阈值是500000,而现在单个DataNode的块为2631218,约为阈值的5倍,现在所有DataNode都处于黄色不健康状态。
小文件问题会直接带来NameNode的压力巨大,从而导致HDFS的稳定性,同时对HDFS日常的数据读写带来性能下降。目前已可以看到集群的NameNode频繁出现检查点告警问题。
通过对集群中目前目录个数,文件大小,文件数量,蜂巢表数量,蜂巢数据库数量,蜂巢分区数量进行了详细的数据采集。发现主要是HDFS目录中的小文件太多,大量1 kb的文件,甚至是小于1 kb的文件,具体表现为:不论表与分区的数据量大小,当有分区时每个分区具有200个文件,当没有分区时每个表有200个文件,而许多表是小表,所以造成严重的小文件问题。
解决此问题的方法主要为两个方面,一是从源头解决小文件问题,在导数的过程中对作业进行优化,以减少小文件的输出,此方法需要业务方解决;二是合并平台上已有的小文件,本问描写合并平台小文件的方案。
<节> <节> <节> <节> <节>原表情况 ,,节> <节> 节> <节> 节> <节> 节> 节> 节> 节> 节>通过对集群内的文件数量以及文件大小进行分析,小文件问题基本出现在蜂巢表中;经过近一步分析,发现每个分区存在着200个小文件,可以将这些文件合并减少小文件数量从而缓解小文件问题。
示例表test_part一共20行数据,以字段date_str为分区
共有五个分区
每个分区分别四个文件
执行流程总体如下:
1,使用创建表名像tb_name创建备用表,使得表结构保持一致。
2,配置支持合并等参数,并使用插入覆盖语句读取原表数据插入到备用表。
3,确认表数据一致后,删除原表,使用改变语句将备用表的表名修改为原表的表名。
新建备表,表结构与原表保持一致
<节><代码> create table test_part_bak like test_part;,节>
代码>
设置如下参数,使支持合并
<节><代码> SET hive.merge.mapfiles =,真的,节>
SET hive.merge.mapredfiles =,真的,
SET hive.merge.size.per.task =, 256000000,
SET hive.merge.smallfiles.avgsize =, 134217728,
SET hive.exec.compress.output =,真的,
SET parquet.compression =,时髦的;
SET hive.exec.dynamic.partition.mode =, nonstrict;
SET hive.exec.dynamic.partition =,真的,
代码>
使用插入覆盖语句查询原表数据覆盖备表
<节>如何使用蜂巢合并小文件