Fayson的github: https://github.com/fayson/cdhproject

推荐关注微信公众号:“Hadoop实操”,ID:gh_c4c535955d0f,或者扫描文末二维码。

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.shimpala-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_timeFROM HDFS_META_DIRSWHERE parent_id=1) a
JOIN(SELECT strleft(path, instr(path,'/',1,2)-1) basepath,sum(blockcount) blockcounts,sum(filesize) filesizes,count(*) file_numsFROM HDFS_META_FILESGROUP 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_timeFROM HDFS_META_DIRSWHERE parent_id=2) a
JOIN(SELECT strleft(path, instr(path,'/',1,3)-1) basepath,sum(blockcount) blockcounts,sum(filesize) filesizes,count(*) file_numsFROM HDFS_META_FILESGROUP 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 aJOIN hive_table_details b ON a.path=b.db_pathGROUP BY a.id,b.dbname) m,(SELECT a.dbname,count(1) file_nums,sum(b.blockcount) blockcounts,sum(b.filesize) filesizesFROM hive_table_details a,hdfs_meta_files bWHERE a.fid=b.fidGROUP BY a.dbname) n
WHERE p.id=m.idAND 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,
(SELECTa.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实操

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

  1. 2021-12-30大数据学习日志——Hadoop离线阶段——HDFS

    学习目标 理解分布式文件存储的概念与实现 掌握HDFS分块存储.副本机制等特性 学会shell操作HDFS 掌握HDFS读写流程 理解NameNode元数据管理机制 理解SecondaryNameNo ...

  2. hadoop离线day03--Hadoop HDFS

    hadoop离线day03--Hadoop HDFS 目录 hadoop离线day03--Hadoop HDFS 今日内容大纲 Apache HDFS入门 概念 HDFS重要特性 分块存储 副本机制 ...

  3. 离线分析:Flume+Kafka+HBase+Hadoop通话数据统计

    文章目录 项目背景 项目架构 系统环境 系统配置 框架安装 JDK Hadoop Zookeeper Kafka Flume HBase 项目实现 项目结构 表设计 HBase Mysql 功能编写 ...

  4. 第七章:小朱笔记hadoop之源码分析-hdfs分析 第三节:hdfs实现分析

    第七章:小朱笔记hadoop之源码分析-hdfs分析 第三节:hdfs实现分析 3.3 namenode (1)FSDirectory FSDirectory用来管理HDFS整个文件系统的namesp ...

  5. 第七章:小朱笔记hadoop之源码分析-hdfs分析 第四节:namenode分析-namenode启动过程分析...

    第七章:小朱笔记hadoop之源码分析-hdfs分析 第四节:namenode分析 4.1 namenode启动过程分析 org.apache.hadoop.hdfs.server.namenode. ...

  6. hadoop离线分析(简单版)-实现流程+数据分析

    目录 整体流程概述 稳妥的采集数据方法 FTP服务器上的Flume配置文件如下 其它常见问题 应用层代码部署到分布式mycluster1 数据采集(Flume采集nginx日志) Visits数据分析 ...

  7. 电商大数据项目(二)-推荐系统实战之实时分析以及离线分析

    电商大数据项目-推荐系统实战(一)环境搭建以及日志,人口,商品分析 https://blog.51cto.com/6989066/2325073 电商大数据项目-推荐系统实战之推荐算法 https:/ ...

  8. 大数据离线分析工具Hive简单介绍

    Hive是Facebook为了解决海量日志数据的分析而开发的,后来开源给了Apache软件基金会,可见Apache软件基金会是个神奇的组织,我们之前学过的很多开源工具都有Apache软件基金会的身影. ...

  9. 大数据5.1 - hive离线分析

    1.1 分桶表 1.1.1 分桶表概念 分区和分桶可以同时,分桶是更细粒度的分配方式.分区是追求效率,分桶又解决什么问题呢?海量数据的分开存储. 对于每一个表(table)或者分区, Hive可以进一 ...

最新文章

  1. Schema约束模式实例
  2. 备忘: VC++ 自动适用编译两种模式库文件 (DLL, LIB)
  3. tensorflow实现回归
  4. vue中路径的配置使用
  5. Java高并发程序设计学习笔记(五):JDK并发包(各种同步控制工具的使用、并发容器及典型源码分析(Hashmap等))...
  6. 【英语学习】【Level 07】U06 First Time L5 A Different City
  7. 在著名出版社出版书,你也行——记录我写书出版的经历和体会
  8. 基于昇腾AI异构计算架构CANN的通用目标检测与识别一站式方案初体验
  9. java吸血鬼数字_吸血鬼数字(java)
  10. 第七届泰迪杯挑战赛C题
  11. 如何在Ubuntu系统下使用扫描仪(by quqi99)
  12. 艾默生手操器TREXLFPNAWS1S
  13. 标准差计算机怎么按,如何使用计算机计算平均值及禁标准差
  14. 2022年Java秋招面试必看的 | Linux 面试题
  15. DOTA2无法找到有效的direct 3D
  16. 模块电路选型(5)----电机驱动模块
  17. 笔记 GWAS 操作流程2-4:哈温平衡检验
  18. jsp预加载转圈_30种CSS3炫酷页面预加载loading动画特效(推荐)
  19. unity打包的安卓无法解析_我是UNITY3D 打包成APK ,安装到手机上就直接报无法解析程序包。...
  20. 威马汽车闫枫:造车新赛道的互联网思维

热门文章

  1. 高性能数据库连接池的内幕
  2. 微信小程序电商实战—环境搭建篇
  3. SpringBoot整合MybatisPlus遇到的大坑!
  4. Matlab R2017b 绘制散点图
  5. AutoCAD.net-错误消息大全
  6. 陈潇冰 react权威指南_React中条带化付款的分步指南
  7. 原装驱动后声卡没声音【解决办法】
  8. 张驰咨询:快速提高流程效率的5个关键精益生产工具
  9. 2. Hadoop的安装(这你都没装好,我就服了)
  10. ECharts - 14.小例子:实现日历图