FsImage文件时HDFS存放在NameNode中的镜像文件,里面包括了整个HDFS集群的目录和文件信息,(类似于一个索引目录+部分数据的文件),而且HDFS提供了命令可以将FsImage文件转成CSV文件,可以用它在Hive上进行分析。目前fsiamge一般都是几十g的级别。
FsImage字段一览
字段名 | 中文 |
---|---|
Path | 目录路径 |
Replication | 备份数 其实就是所有的存储份数 |
ModificationTime | 最后修改时间 创建 |
AccessTime | 对于文件来说是最后访问时间,对于文件夹来说就是创建时间 |
PreferredBlockSize | 首选块大小 byte |
BlocksCount | 块 数eeeeeeeeee |
FileSize | 文件大小 byte |
NSQUOTA | 名称配额 限制指定目录下允许的文件和目录的数量。 |
DSQUOTA | 空间配额 限制该目录下允许的字节数 |
Permission | 权限 |
UserName | 用户 |
GroupName | 用户组 |
hdfs get命令
hdfs dfs -get /user/bigdata/fsimage_0000000010470664202 /opt/fsimage_001
hdfs vio命令:
hdfs oiv -i /opt/fsimage_001 -o /opt/fsimage_001.csv -p Delimited -delimiter ","
Linux sed命令: 在每行数据末尾后面新增,HDFS
sed -i s/$/,HDFS/g fsimage_001.csv
hdfs put命令
hdfs dfs -put /opt/fsimage_001.csv /user/hdfsser/hdfs_fsimage/fsimage_001.csv
字段名 | 类型 | 备注 |
---|---|---|
Path | string | 目录路径 |
Replication | string | 备份数 |
ModificationTime | string | 最后修改时间 |
AccessTime | string | string |
PreferredBlockSize | string | 首选块大小 byte |
BlocksCount | string | 块 数 |
FileSize | string | 文件大小 byte |
NSQUOTA | string | 名称配额 限制指定目录下允许的文件和目录的数量。 |
DSQUOTA | string | 空间配额 限制该目录下允许的字节数 |
Permission | string | 权限 |
UserName | string | 用户 |
GroupName | string | 用户组 |
clustersource | string | 数据集群来源 |
字段名 | 类型 | 备注 |
---|---|---|
Path | string | 完成目录路径 |
dbname | string | Hive库名 |
tablename | string | Hive表名 |
FileSize | string | 文件大小 byte |
UserName | string | 用户 |
clustersource | string | 数据集群来源 |
字段名 | 类型 | 备注 |
---|---|---|
Path | string | 目录路径 不包含文件名 |
filename | string | 文件名 |
FileSize | string | 文件大小 byte |
UserName | string | 用户 |
clustersource | string | 数据集群来源 |
语法: length(string A)
返回值: int
说明:返回字符串A的长度
语法: reverse(string A)
返回值: string
说明:返回字符串A的反转结果
语法: substr(string A, int start),substring(string A, int start)
返回值: string
说明:返回字符串A从start位置到结尾的字符串
语法: substr(string A, int start, int len),substring(string A, intstart, int len)
返回值: string
说明:返回字符串A从start位置开始,长度为len的字符串
语法: split(string str, string pat)
返回值: array
说明:按照pat字符串分割str,会返回分割后的字符串数组
语法:floor(double d)
返回值:bigint
说明:返回<=d的最大bigint值;
语法:ceil(double d)
返回值:bigint
说明:返回>=d的最小bigint 值;
启动Hive,直接使用hive命令
$ hive;
进入对应的数据库 use hdfsser;
hive> use hdfsser;
查询出插入inhive表的语句
INSERT INTO TABLE inhive
SELECT path,
split(path,'\\/')[5],
split(path,'\\/')[6],
FileSize,
UserName,
clustersource
FROM fsimage
WHERE split(path,'\\/')[3]= 'hive' and split(path,'\\/')[4] = 'warehouse';
INSERT INTO TABLE nonhive
SELECT CASE
WHEN filesize='0' THEN path
ELSE substr(path, 0, length(path)-1-length(reverse(split(reverse(path),'\\/')[0])))
END,
CASE
WHEN filesize='0' THEN NULL
ELSE reverse(split(reverse(path),'\\/')[0])
END ,
FileSize,
UserName,
clustersource
FROM fsimage
WHERE size(split(path,'\\/'))<=3
OR split(path,'\\/')[3] <> 'hive';
在文件大小的不同区间进行分析,单位大小MB
(0-1),[1,10),[10,128),[128-512),[512,+∞)
各个区间下的文件数量,目录数量
两大考量点 一个是文件数量一个是文件或目录类型