1
文章编写目的
随着Hadoop集群数据量的增长,集群中也同时会存在大量的小文件,即文件Size比HDFS的BlockSize(默认128MB)小的多的文件。Hadoop集群中存在大量的小文件对集群造成的影响如下:
1.对NameNode的内存造成很大的压力以及性能问题,在HDFS中任何文件、目录或者block在NameNode内存中均以对象的方式表示(即元数据),默认每个元数据对象约占150bytes。
2.HDFS在存储小文件上效率会很低,同样在读取上也会导致大量的查找,在各个DN节点去检索小文件。
在前面的文章Fayson介绍了《
如何在Hadoop中处理小文件
》,《
如何使用Impala合并小文件
》和《
如何在Hadoop中处理小文件-续
》。基于上述原因Fayson主要介绍如何通过离线分析HDFS的FsImage的方式查找集群中的小文件。
内容概述
1.FsImage分析脚本
2.FsImage数据转存到Impala表中
3.各个维度分析查找集群中的小文件
4.总结
测试环境
1.CM和CDH版本为5.15
2
离线FsImage分析脚本
本篇文章Fayson的分析脚本主要基于HDFS提供的oiv命令来进行FsImage离线分析,将FsImage文件解析问指定的csv格式数据,如下脚本分析的具体步骤:
1.使用hdfs命令获取FsImage数据文件
[root@cdh02fsimage]hdfsoiv-i./tmp_meta/fsimage_0000000000008236656-o./tmp_meta/
(可左右滑动)

3.将解析的csv文件加载到Hive的HDFS_META_TEMP表中
[root@cdh02fsimage]hdfsdfs-rmr/tmp/hdfs_metadata/fsimage[root@cdh02fsimage]hdfsdfs-copyFromLocal./tmp_meta//tmp/hdfs_metadata/fsimage
(可左右滑动)

4.使用Sqoop脚本将Hive元数据中关于Hive库和表的信息抽取的Hive中
sqoopimport\--connect"jdbc:mysql://${DB_IPADDR}:${DB_PORT}/${META_DB_NAME}"\--username${DB_USERNAME}\--password${DB_PASSWORD}\--query',_LOCATION_URI,_NAME,,_TYPE,,SDSb,_ID=__ID=_IDand$CONDITIONS'\--fields-terminated-by','\--delete-target-dir\--hive-database${DB_NAME}\--target-dir/tmp/${TARG_HIVE_TB}\--hive-import\--hive-overwrite\--hive-table${TARG_HIVE_TB}\--m${MAP_COUNT}
(可左右滑动)

5.执行文件创建分析的Impala表

6.执行analyse_sql/all_语句通过各个维度查找小文件

离线分析脚本目录结构如下:

analyse_sql:主要存放分析小文件的SQL语句

base_sql:主要存放建表语句及基础数据生成SQL脚本

:脚本主要用户配置集群信息(如:ImpalaDaemon访问地址、存储的表名、临时文件存放目录等)
[root@cdh02fsimage]!/bin/bashsqoop抽数写入Hive表配置参数DB_IPADDR=_PORT=3306META_DB_NAME=metastoreDB_USERNAME=rootDB_PASSWORD=123456TARG_HIVE_TB=hive_tables_tempMAP_COUNT=1
(可左右滑动)

*.keytab:两个keytab文件为前面环境准备过程中导出的hive和hdfs用户
offline_:脚本主要用于创建分析用户的数据表及生成分析需要的数据

offline_:脚本用于执行analyse_sql目录的SQL语句
[root@cdh02fsimage]!/bin/bashsource./$IMPALAD--var=DB_NAME=${DB_NAME}-f./analyse_sql/all_
(可左右滑动)

sqoop_hive_:用于Sqoop抽取MySQL中Hive元数据表数据到Hive仓库
[root@cdh02fsimage]!/bin/bash#将Hive元数据库中的库及表等信息抽取到Hive仓库sqoopimport\--connect"jdbc:mysql://${DB_IPADDR}:${DB_PORT}/${META_DB_NAME}"\--username${DB_USERNAME}\--password${DB_PASSWORD}\--query',_LOCATION_URI,_NAME,,_TYPE,,SDSb,_ID=__ID=_IDand$CONDITIONS'\--fields-terminated-by','\--delete-target-dir\--hive-database${DB_NAME}\--target-dir/tmp/${TARG_HIVE_TB}\--hive-import\--hive-overwrite\--hive-table${TARG_HIVE_TB}\--m${MAP_COUNT}
(可左右滑动)

tmp_meta:该目录主要用于存放HDFS的元数据及oiv生成的csv文件
3
基于HDFS数据目录统计分析
如下统计方式主要基于HDFS的数据目录进行统计分析,统计HDFS指定目录下所有数据文件数、Block数量、文件总大小(bytes)及平均文件大小(bytes)。
统计中有两个重要参数parent_id和instr(path,'/',1,2)这两个参数主要表示指定统计的HDFS目录以及目录钻取深度,instr()函数中的最后一个参数即为目录钻取深度(如果为parent_id=1为根目录“/”,钻取深度则为2,即根目录下所有的数据目录,需要钻取根深的目录则依次递增)。
1.HDFS根目录统计分析
SELECTa.*,_nums,,,(/_nums)ASavg_filesizeFROM(SELECTid,path,username,modification_timeFROMHDFS_META_DIRSWHEREparent_id=1)aJOIN(SELECTstrleft(path,instr(path,'/',1,2)-1)basepath,sum(blockcount)blockcounts,sum(filesize)filesizes,count(*)file_numsFROMHDFS_META_FILESGROUPBYbasepath)=_numsdesc,avg_filesizeasc;
(可左右滑动)

2.指定HDFS数据目录统计分析
SELECTa.*,_nums,,,(/_nums)ASavg_filesizeFROM(SELECTid,path,username,modification_timeFROMHDFS_META_DIRSWHEREparent_id=2)aJOIN(SELECTstrleft(path,instr(path,'/',1,3)-1)basepath,sum(blockcount)blockcounts,sum(filesize)filesizes,count(*)file_numsFROMHDFS_META_FILESGROUPBYbasepath)=_numsdesc,avg_filesizeasc;
(可左右滑动)

4
基于Hive库和表的统计分析
如下统计方式主要基于Hive库和表的统计分析,统计Hive中所有库存的数据文件数、Block数量、文件总大小(bytes)及平均文件大小(bytes)。
1.基于Hive库的统计分析
SELECTn.*,(/_nums)ASavg_filesizeFROMhdfs_meta_dirsp,(,,count(*)FROMhdfs_meta_dirsaJOINhive_table_=_,)m,(,count(1)file_nums,sum()blockcounts,sum()filesizesFROMhive_table_detailsa,hdfs_meta_=)==_numsdesc,avg_filesizeasc;
(可左右滑动)

2.基于Hive表的统计分析
selectn.*,(/_nums)ASavg_filesizefromhdfs_meta_dirsp,(,,count(*)fromhdfs_meta_dirsajoinhive_table_=_,)m,(,_name,count(1)file_nums,sum()blockcounts,sum()filesizesFROMhive_table_detailsa,hdfs_meta_=,_name)==_numsdesc,avg_filesizeasclimit20;
(可左右滑动)

5
总结
如上SQL的统计分析可以看到有三个比较重要的统计指标file_nums、blockcounts和avg_filesize。通过这三个指标进行小文件分析,进行如下分析:
如果file_nums/blockcounts的值越大且avg_filesize越小则说明该HDFS或Hive表的小文件越多。

原创文章,欢迎转载,转载请注明:转载自实操

版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。