FusionInsight MRS小文件合并工具简介
工具介绍
在Hadoop大规模生产集群中,由于HDFS的元数据都保存在NameNode的内存中,集群规模受制于NameNode单点的内存限制。如果HDFS中有大量的小文件,会消耗NameNode大量内存,还会大幅降低读写性能,延长作业运行时间。因此,小文件问题是制约Hadoop集群规模扩展的关键问题。
本工具主要有如下两个功能:
- 扫描表中有多少低于用户设定阈值的小文件,返回该表目录中所有数据文件的平均大小。
- 对表文件提供合并功能,用户可设置合并后的平均文件大小。
支持的表类型
Spark:Parquet、ORC、CSV、Text、Json。
Hive:Parquet、ORC、CSV、Text、RCFile、Sequence、Bucket。
说明: |
|
工具使用
下载安装客户端,例如安装目录为“/opt/client”。进入“/opt/client/Spark2x/spark/bin”,执行mergetool.sh脚本。
加载环境变量
source /opt/client/bigdata_env
source /opt/client/Spark2x/component_env
扫描功能
命令形式: sh mergetool.sh scan <db.table> <filesize>
db.table的形式是“数据库名.表名”,filesize为用户自定义的小文件阈值(单位MB),返回结果为小于该阈值的文件个数,及整个表目录数据文件的平均大小。
例如:sh mergetool.sh scan default.table1 128
合并功能
命令形式: sh mergetool.sh merge <db.table> <filesize> <shuffle>
db.table的形式是“数据库名.表名”,filesize为用户自定义的合并后平均文件大小(单位MB),shuffle是一个boolean值,取值true/false,作用是设置合并过程中是否允许数据进行shuffle。
例如:sh mergetool.sh merge default.table1 128 false
提示SUCCESS: Merge succeeded,则操作成功:
说明: |
|
shuffle设置
对于合并功能,可粗略估计合并前后分区数的变化:
一般来说,旧分区数>新分区数,可设置shuffle为false;但如果旧分区远大于新分区数,例如高于100倍以上,可以考虑设置shuffle为true,增加并行度,提高合并的速度。
- 设置shuffle为true(repartition),会有性能上的提升;但是由于Parquet和Orc存储方式的特殊性,repartition会使压缩率变小,直接表现是hdfs上表的总大小会增大到1.3倍。
- 设置shuffle为false(coalesce),合并后的大小不会非常平均,可能会分布在设置的filesize左右。
日志存放位置
默认日志存放位置为/tmp/SmallFilesLog.log4j,如需自定义日志存放位置,可在/opt/client/Spark2x/spark/tool/log4j.properties中配置log4j.appender.logfile.File。
- 点赞
- 收藏
- 关注作者
评论(0)