首页 > 其他分享 >0464-如何离线分析HDFS的FsImage查找集群小文件

0464-如何离线分析HDFS的FsImage查找集群小文件

时间:2022-10-04 11:34:37浏览次数:83  
标签:HDFS hdfs -- 离线 DB hive FsImage fsimage

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。


Fayson的github:

​https://github.com/fayson/cdhproject​


提示:代码块部分可以左右滑动查看噢


1

文章编写目的


随着Hadoop集群数据量的增长,集群中也同时会存在大量的小文件,即文件Size比HDFS的Block Size(默认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@cdh02 fsimage]#  hdfs dfsadmin -fetchImage ./tmp_meta

(可左右滑动)


0464-如何离线分析HDFS的FsImage查找集群小文件_hive


2.使用hdfs oiv命令解析FsImage文件


[root@cdh02 fsimage]# hdfs oiv -i ./tmp_meta/fsimage_0000000000008236656 -o ./tmp_meta/fsimage.csv -p Delimited

​(可左右滑动)


0464-如何离线分析HDFS的FsImage查找集群小文件_hdfs_02


3.将解析的csv文件加载到Hive的HDFS_META_TEMP表中


[root@cdh02 fsimage]# sed -i -e "1d" ./tmp_meta/fsimage.csv
[root@cdh02 fsimage]# hdfs dfs -rmr /tmp/hdfs_metadata/fsimage
[root@cdh02 fsimage]# hdfs dfs -mkdir -p /tmp/hdfs_metadata/fsimage
[root@cdh02 fsimage]# hdfs dfs -copyFromLocal ./tmp_meta/fsimage.csv /tmp/hdfs_metadata/fsimage

(可左右滑动)


0464-如何离线分析HDFS的FsImage查找集群小文件_统计分析_03


4.使用Sqoop脚本将Hive元数据中关于Hive库和表的信息抽取的Hive中


sqoop import \
--connect "jdbc:mysql://${DB_IPADDR}:${DB_PORT}/${META_DB_NAME}" \
--username ${DB_USERNAME} \
--password ${DB_PASSWORD} \
--query 'select c.NAME,c.DB_LOCATION_URI,a.TBL_NAME,a.OWNER,a.TBL_TYPE,b.LOCATION from TBLS a,SDS b,DBS c where a.SD_ID=b.SD_ID and a.DB_ID=c.DB_ID and $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}

(可左右滑动)


0464-如何离线分析HDFS的FsImage查找集群小文件_hive_04


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


0464-如何离线分析HDFS的FsImage查找集群小文件_hive_05


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


0464-如何离线分析HDFS的FsImage查找集群小文件_hdfs_06


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


0464-如何离线分析HDFS的FsImage查找集群小文件_hive_07


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


0464-如何离线分析HDFS的FsImage查找集群小文件_hdfs_08


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


0464-如何离线分析HDFS的FsImage查找集群小文件_统计分析_09


config-env.sh:脚本主要用户配置集群信息(如:ImpalaDaemon访问地址、存储的表名、临时文件存放目录等)


[root@cdh02 fsimage]# more config-env.sh
#!/bin/bash
###定义一些全局的变量
DB_NAME=hdfs_metadata
IMPALAD=cdh01.fayson.com:25003

#sqoop抽数写入Hive表配置参数
DB_IPADDR=cdh02.fayson.com
DB_PORT=3306
META_DB_NAME=metastore
DB_USERNAME=root
DB_PASSWORD=123456
TARG_HIVE_TB=hive_tables_temp
MAP_COUNT=1

​(可左右滑动)


0464-如何离线分析HDFS的FsImage查找集群小文件_统计分析_10


*.keytab:两个keytab文件为前面环境准备过程中导出的hive和hdfs用户

offline_fsimage.sh:脚本主要用于创建分析用户的数据表及生成分析需要的数据


0464-如何离线分析HDFS的FsImage查找集群小文件_统计分析_11


offline_analyse.sh:脚本用于执行analyse_sql目录的SQL语句


[root@cdh02 fsimage]# more offline_analyse.sh 
#!/bin/bash
source ./config-env.sh

impala-shell -i $IMPALAD --var=DB_NAME=${DB_NAME} -f ./analyse_sql/all_hdfs.sql

(可左右滑动)


0464-如何离线分析HDFS的FsImage查找集群小文件_hive_12


sqoop_hive_metadata.sh:用于Sqoop抽取MySQL中Hive元数据表数据到Hive仓库


[root@cdh02 fsimage]# more sqoop_hive_metadata.sh 
#!/bin/bash
#将Hive元数据库中的库及表等信息抽取到Hive仓库
sqoop import \
--connect "jdbc:mysql://${DB_IPADDR}:${DB_PORT}/${META_DB_NAME}" \
--username ${DB_USERNAME} \
--password ${DB_PASSWORD} \
--query 'select c.NAME,c.DB_LOCATION_URI,a.TBL_NAME,a.OWNER,a.TBL_TYPE,b.LOCATION from TBLS a,SDS b,DBS c where a.SD_ID=b.SD_ID and a.DB_ID=c.DB_ID and $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}

​(可左右滑动)


0464-如何离线分析HDFS的FsImage查找集群小文件_hdfs_13


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根目录统计分析


SELECT a.*,
b.file_nums,
b.blockcounts,
b.filesizes,
(b.filesizes/b.file_nums) AS avg_filesize
FROM
(SELECT id,
path,
username,
modification_time
FROM HDFS_META_DIRS
WHERE parent_id=1) a
JOIN
(SELECT strleft(path, instr(path,'/',1,2)-1) basepath,
sum(blockcount) blockcounts,
sum(filesize) filesizes,
count(*) file_nums
FROM HDFS_META_FILES
GROUP BY basepath) b ON a.path=b.basepath
ORDER BY b.file_nums desc,avg_filesize asc;

(可左右滑动)


0464-如何离线分析HDFS的FsImage查找集群小文件_统计分析_14


2.指定HDFS数据目录统计分析


SELECT a.*,
b.file_nums,
b.blockcounts,
b.filesizes,
(b.filesizes/b.file_nums) AS avg_filesize
FROM
(SELECT id,
path,
username,
modification_time
FROM HDFS_META_DIRS
WHERE parent_id=2) a
JOIN
(SELECT strleft(path, instr(path,'/',1,3)-1) basepath,
sum(blockcount) blockcounts,
sum(filesize) filesizes,
count(*) file_nums
FROM HDFS_META_FILES
GROUP BY basepath) b ON a.path=b.basepath
ORDER BY b.file_nums desc,avg_filesize asc;

(可左右滑动)


0464-如何离线分析HDFS的FsImage查找集群小文件_hive_15


4

基于Hive库和表的统计分析


如下统计方式主要基于Hive库和表的统计分析,统计Hive中所有库存的数据文件数、Block数量、文件总大小(bytes)及平均文件大小(bytes)。


1.基于Hive库的统计分析


SELECT n.*,
(n.filesizes/n.file_nums) AS avg_filesize
FROM hdfs_meta_dirs p,

(SELECT a.id,
b.dbname,
count(*)
FROM hdfs_meta_dirs a
JOIN hive_table_details b ON a.path=b.db_path
GROUP BY a.id,
b.dbname) m,

(SELECT a.dbname,
count(1) file_nums,
sum(b.blockcount) blockcounts,
sum(b.filesize) filesizes
FROM hive_table_details a,
hdfs_meta_files b
WHERE a.fid=b.fid
GROUP BY a.dbname) n
WHERE p.id=m.id
AND m.dbname=n.dbname
order by file_nums desc,avg_filesize asc;

(可左右滑动)


0464-如何离线分析HDFS的FsImage查找集群小文件_统计分析_16


2.基于Hive表的统计分析


select n.*,(n.filesizes/n.file_nums) AS avg_filesize from hdfs_meta_dirs p,
(select a.id,b.dbname,count(*) from hdfs_meta_dirs a join hive_table_details b on a.path=b.db_path group by a.id, b.dbname) m,
(SELECT
a.dbname,a.tbl_name,
count(1) file_nums,
sum(b.blockcount) blockcounts,
sum(b.filesize) filesizes
FROM hive_table_details a,
hdfs_meta_files b
WHERE a.fid=b.fid
GROUP BY a.dbname,a.tbl_name) n
where p.id=m.id and m.dbname=n.dbname
order by file_nums desc,avg_filesize asc
limit 20;

(可左右滑动)


0464-如何离线分析HDFS的FsImage查找集群小文件_hdfs_17


5

总结


如上SQL的统计分析可以看到有三个比较重要的统计指标file_nums、blockcounts和avg_filesize。通过这三个指标进行小文件分析,进行如下分析:

如果file_nums/blockcounts的值越大且avg_filesize越小则说明该HDFS或Hive表的小文件越多。


提示:代码块部分可以左右滑动查看噢


为天地立心,为生民立命,为往圣继绝学,为万世开太平。

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。


推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

0464-如何离线分析HDFS的FsImage查找集群小文件_hdfs_18

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操


0464-如何离线分析HDFS的FsImage查找集群小文件_hdfs_19


标签:HDFS,hdfs,--,离线,DB,hive,FsImage,fsimage
From: https://blog.51cto.com/u_14049791/5731143

相关文章

  • Java Api ——HDFS连接和文件创建
    写在前面:需要配置好Linux虚拟机并成功配置Hadoop idea创建maven项目导入maven:<dependencies><dependency><groupId>org.apache.hadoop</group......
  • HDFS和NFS的区别
    #相同点两者的文件系统数据均能够在相关系统内的多台机器上进行数据读取和写入,都是分布式文件系统#不同点##NFS是通过RPC通信协议进行数据共享的文件系统,所以NFS必须在运行......
  • hdfs
    1.hdfs报大量gc超时namenode日志出现大量GC超时相关错误,且30914端口未监听:GCpool'ParNew'hadcollection(s):count=1time=0msGCpool'ConcurrentMarkSweep'had......
  • HDFS架构设计理念以及优缺点
    Hadoop是一个由Apache基金会开发的分布式系统基础架构。可以快速实现大规模数据的分布式存储开发,以及分布式程序的快速开发,利用集群的威力进行大数据的高速存储和运算。其......
  • HDFS架构设计理念以及优缺点
    Hadoop是一个由Apache基金会开发的分布式系统基础架构。可以快速实现大规模数据的分布式存储开发,以及分布式程序的快速开发,利用集群的威力进行大数据的高速存储和运算。......
  • linux内核离线升级步骤详解【亲测可用】
    由于种种原因,linux的内核版本需要升级,但由于生产原因往往不能在线升级,在此记录笔者本人昨晚的的离线升级步骤,亲测可用。我们知道,红帽和CentOS同源同宗,内核升级步骤也是一......
  • 用户在线、离线、忙碌功能设计与实现
    需求:需要在系统中展现,系统中用户的状态。展示用户是否在线、忙碌或者离线。做法:1.使用webSocket建立链接,通过实时推送用户信息,达到用户状态的更新。2.当用户登录时自......
  • Linux下Jenkins离线安装(war包)
    1、下载Jenkins.war包地址:https://mirrors.jenkins.io/war-stable/2.346.3/2、将Jenkins.war包上传到/usr/local/tomcat/webapps3、浏览器访问:http://192.168.150.128......
  • 如何从官网下载QT5开源版离线安装包
    一、浏览器访问qt官网地址https://www.qt.io二、点击DevelopmentTools三、点击DownloadQt四、点击Goopensource五、点击DownloadtheQtOnlineInst......
  • ceph17-quincy离线部署
    ceph-ansible集群搭建操作系统现在centos7版本主机名IPnode110.0.0.18node210.0.0.19node310.0.0.20操作系统虚拟化软件Ubuntu22.04......