百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

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

bigegpt 2024-09-14 00:14 8 浏览

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

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

(可左右滑动)

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

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

(可左右滑动)

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

(可左右滑动)

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}

(可左右滑动)

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

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

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

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

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

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

(可左右滑动)

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

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

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

(可左右滑动)

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}

(可左右滑动)

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;

(可左右滑动)

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;

(可左右滑动)

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;

(可左右滑动)

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;

(可左右滑动)

5

总结

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

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

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

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

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

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

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

相关推荐

或者这些Joplin插件也可以帮助你的笔记应用再一次强大

写在前面距离上次分享《搭建私有全平台多端同步笔记,群晖NAS自建JoplinServer服务》已过去一段时间,大家是否开始使用起来了呢?如果你和我一样已经使用过Joplin有一段时间了,那或许你也会...

Three.JS教程4 threejs中的辅助类

一、辅助类简介Three.js提供了一些辅助类(Helpers)以帮助我们更容易地调试、可视化场景中的元素。ArrowHelepr:创建箭头辅助器;AxisHelper:创建坐标轴辅助器;BoxH...

第2章 还记得点、线、面吗(二)(第二章还能敲钟吗)

glbgltf模型(webvrmodel)-gltf模型下载定制,glb模型下载定制,三维项目电商网站在线三维展示,usdz格式,vr模型网,网页VR模型下载,三维模型下载,webgl网页模型下载我...

如何检查Linux系统硬件信息?从CPU到显卡,一网打尽!

你可能会问:“我为什么要关心硬件信息?”答案很简单:硬件是Linux系统的根基,了解它可以帮你解决很多实际问题。比如:性能调优:知道CPU核心数和内存大小,才能更好地调整程序运行参数。故障排查:系统卡...

SpriteJS:图形库造轮子的那些事儿

从2017年到2020年,我花了大约4年的时间,从零到一,实现了一个可切换WebGL和Canvas2D渲染的,跨平台支持浏览器、SSR、小程序,基于DOM结构和支持响应式的,高...

平时积累的FPGA知识点(6)(fpga经典应用100例)

平时在FPGA群聊等积累的FPGA知识点,第六期:1万兆网接口,发三十万包,会出现掉几包的情况,为什么?原因:没做时钟约束,万兆网接口的实现,本质上都是高速serdes,用IP的话,IP会自带约束。...

芯片逻辑调度框架设计 都需要那些那些软件工具

设计芯片逻辑调度框架通常需要使用以下软件工具:1.逻辑设计工具:例如Vivado、Quartus、SynopsysDesignCompiler等,用于设计和实现逻辑电路。2.仿真工具:例如Mo...

ZYNQ与DSP之间EMIF16通信(正点原子领航者zynq之fpga开发指南v3)

本文主要介绍说明XQ6657Z35-EVM高速数据处理评估板ZYNQ与DSP之间EMIF16通信的功能、使用步骤以及各个例程的运行效果。[基于TIKeyStone架构C6000系列TMS320C6...

好课推荐:从零开始大战FPGA(从零开始的冒险4399)

从零开始大战FPGA引子:本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“...

业界第一个真正意义上开源100 Gbps NIC Corundum介绍

来源:内容由「网络交换FPGA」编译自「FCCM2020」,谢谢。FCCM2020在5月4日开始线上举行,对外免费。我们有幸聆听了其中一个有关100G开源NIC的介绍,我们对该文章进行了翻译,并对其中...

高层次综合:解锁FPGA广阔应用的最后一块拼图

我们为什么需要高层次综合高层次综合(High-levelSynthesis)简称HLS,指的是将高层次语言描述的逻辑结构,自动转换成低抽象级语言描述的电路模型的过程。所谓的高层次语言,包括C、C++...

Xilinx文档编号及其内容索引(部分)

Xilinx文档的数量非常多。即使全职从事FPGA相关工作,没有几年时间不可能对器件特性、应用、注意事项等等有较为全面的了解。本文记录了我自使用Xilinx系列FPGA以来或精读、或翻阅、或查询过的文...

Xilinx Vivado联合Modelsim软件仿真

引言:Xilinx公司Vivado开发软件自带仿真工具,可以实现一般性能的FPGA软件仿真测试,其测试执行效率以及性能都不如第三方专用仿真软件Modelsim强。本文我们介绍下如何进行Vivado20...

体育动画直播是怎么做出来的?从数据到虚拟赛场的科技魔法!

你是否见过这样的比赛直播?没有真实球员,却能看梅西带球突破?足球比赛变成动画版,但数据100%真实?电竞比赛用虚拟形象直播,选手操作实时同步?这就是体育动画直播——一种融合实时数据、游戏引擎和AI的...

Dialogue between CPC and political parties of neighboring countries held in Beijing

BEIJING,May26(Xinhua)--TheCommunistPartyofChina(CPC)inDialoguewithPoliticalPartiesof...