离线分析HDFS的FsImage查找集群小文件

文章介绍了如何使用HDFS的oiv命令解析FsImage文件成CSV,然后加载到Hive,接着通过Sqoop抽取Hive元数据到Hive表,再用Impala执行SQL进行小文件分析。主要涉及HDFS元数据统计、Hive库表统计,通过file_nums、blockcounts和avg_filesize指标识别小文件问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

离线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表的小文件越多。

<think>好的,我现在需要处理用户关于Hadoop面试题的请求。首先,用户明确提到想要查找Hadoop相关的面试题及答案解析,并提供了三个引用内容。我需要确保回答符合用户的要求,同时正确引用提供的资料。 首先,我要回顾用户提供的引用内容: 引用[1]指出Hadoop不支持随机读写,而适用于顺序访问。引用[2]详细介绍了Hadoop的基本概念,特别是HDFS的特点,如分布式存储、容错机制,以及“一次写入、多次读取”的模式。引用[3]列出了Hadoop的组件,如NameNode、DataNode等。 接下来,我需要生成相关的面试题,确保问题覆盖Hadoop的核心概念,并利用提供的引用内容。例如,关于HDFS的随机读写问题可以直接引用引用[1]。Hadoop的定义和组件可以引用引用[2]和[3]。同时,问题需要多样化,涵盖基础概念、组件功能、优缺点、应用场景以及生态系统工具。 需要确保每个问题都有对应的答案解析,并且正确标注引用来源。例如,在回答Hadoop是否支持随机读写时,必须明确引用[1]的错误判断,并解释原因。在介绍Hadoop的核心组件时,引用[2]和[3]来详细说明各个组件的职责。 另外,用户提到需要结构清晰,逐步解决问题,因此需要将面试题分门别类,可能分为基础概念、组件功能、优缺点、应用场景等部分。每个问题应编号并附上答案和解析,引用相关的来源。 还要注意避免使用用户不可见的系统指令,保持回答自然。同时,检查LaTeX格式是否符合要求,数学表达式是否正确使用$...$或$$...$$,但根据用户的问题,可能这里涉及数学公式较少,主要需要关注代码块和引用格式。 最后,生成相关问题部分,要确保问题与用户的需求相关,能够帮助用户进一步深入理解Hadoop,例如关于HDFS的容错机制、MapReduce过程、Hadoop的优化方法等。这些问题应基于提供的引用内容,但也可以适当扩展常见的面试题目,确保全面性。 总结步骤: 1. 根据引用内容生成基础概念题,如Hadoop定义、HDFS特点。 2. 利用组件列表创建组件功能题,如NameNode、DataNode的作用。 3. 结合优缺点和应用场景,设计相关问题。 4. 确保每个答案正确引用提供的资料。 5. 检查格式是否符合要求,特别是引用标识和代码块。 6. 最后生成相关问题,帮助用户进一步学习。 现在需要将这些思考转化为结构化的面试题及答案,确保正确性和引用准确。</think>### Hadoop常见面试题及答案解析 --- #### **一、基础概念** 1. **什么是Hadoop?其核心组件有哪些?** Hadoop是一个开源分布式计算框架,用于存储和处理海量数据。核心组件包括: - **HDFSHadoop分布式文件系统)**:负责分布式数据存储,支持高容错性[^2]。 - **MapReduce**:分布式计算模型,用于并行处理大规模数据集。 - **YARN(资源调度框架)**:管理集群资源并调度任务。 2. **HDFS是否支持随机读写?为什么?** 不支持。HDFS设计为**“一次写入、多次读取”**模式,适合批量处理而非实时访问。随机读写会破坏其顺序访问优化机制[^1]。 --- #### **二、HDFS相关** 3. **NameNode和DataNode的作用是什么?** - **NameNode**:管理文件系统元数据(如文件目录结构、块位置),不存储实际数据[^3]。 - **DataNode**:存储实际数据块,并向NameNode汇报状态。 4. **HDFS如何实现容错?** - 数据分块存储(默认128MB/块),每个块复制到多个节点(默认3副本)。 - 若某个DataNode故障,系统会从其他副本恢复数据。 --- #### **三、MapReduce相关** 5. **MapReduce的工作流程分为哪几个阶段?** - **Map阶段**:输入数据分片,由Mapper生成键值对。 - **Shuffle阶段**:按Key排序并分发到Reducer。 - **Reduce阶段**:聚合键值对,输出最终结果。 6. **Combiner的作用是什么?** Combiner是本地Reduce操作,用于合并Mapper输出的中间结果,减少网络传输量。例如,求和时可以先在Mapper端局部汇总。 --- #### **四、优缺点与应用场景** 7. **Hadoop的优缺点有哪些?** - **优点**:高扩展性、容错性、低成本硬件支持。 - **缺点**:不适合低延迟任务(如实时查询)、小文件处理效率低。 8. **Hadoop适合哪些应用场景?** - 日志分析离线数据处理(如ETL)、大规模数据存储(如历史档案)[^2]。 --- #### **五、进阶问题** 9. **Secondary NameNode的作用是什么?** 定期合并NameNode的编辑日志(EditLog)和镜像文件(FsImage),防止EditLog过大。注意:**它不是NameNode的备份**,仅辅助恢复[^3]。 10. **如何优化Hadoop小文件问题?** - 合并小文件为SequenceFile或HAR文件。 - 使用HBase替代HDFS存储小文件。 --- ### §§扩展问题§§ 1. HDFS的副本放置策略是什么? 2. YARN中ResourceManager和NodeManager的职责有何区别? 3. Hadoop 2.x与Hadoop 3.x的主要区别有哪些? 4. 如何理解MapReduce的“数据本地化”优化? 5. Hadoop生态系统中Hive和HBase的适用场景有何不同? --- **引用来源** [^1]: Hadoop仅支持顺序读写,不支持随机访问。 : Hadoop核心架构与HDFS设计原理。 : Hadoop组件(NameNode、DataNode等)的功能说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值