如何通过Python hdfs模块的InsecureClient获取HDFS节点可用磁盘容量
Python HDFS客户端实现
hdfs dfs -df 等价容量查询 脚本前置修正
你现有初始化脚本存在冗余实例化逻辑,InsecureClient本身已支持代理参数配置,无需重复创建Client实例,修正后的初始化代码为:
from hdfs import InsecureClient client = InsecureClient( url="NameNode地址:端口", user="你的HDFS操作用户名", # 无代理需求可直接删除以下proxies配置 proxies={"http": "本地代理地址:端口"} )
核心实现思路
你使用的hdfs第三方库是对WebHDFS开放接口的封装,hdfs dfs -df对应的底层WebHDFS能力为GET_FILESYSTEM_STATS接口,通过该接口可直接获取集群维度的磁盘容量统计值,完全不需要依赖本地Shell命令调用。
核心查询代码
# 调用容量统计接口,等价于执行`hdfs dfs -df` fs_stats = client._request( method="GET", path="/", params={"op": "GET_FILESYSTEM_STATS"} ).json() # 接口返回的核心字段说明 # - totalCapacity: HDFS集群总容量(单位:字节) # - dfsUsed: HDFS已占用的存储容量(单位:字节) # - remaining: HDFS剩余可用存储容量(单位:字节) # 计算磁盘使用率,与`-h`参数的百分比计算逻辑完全一致 used_rate = round(fs_stats["dfsUsed"] / fs_stats["totalCapacity"] * 100, 2) # 实现`-h`参数的人类可读单位格式化 def format_byte_size(size_bytes): units = ["B", "KB", "MB", "GB", "TB", "PB"] unit_index = 0 while size_bytes >= 1024 and unit_index < len(units) - 1: size_bytes /= 1024 unit_index += 1 return f"{round(size_bytes, 2)} {units[unit_index]}" # 输出与原命令格式一致的结果 print("文件系统 总容量 已用 可用 使用率%") print( f"hdfs://{client.url.split('//')[-1]:<22} " f"{format_byte_size(fs_stats['totalCapacity']):<9} " f"{format_byte_size(fs_stats['dfsUsed']):<8} " f"{format_byte_size(fs_stats['remaining']):<8} " f"{used_rate}%" )
适配说明
- 如果你使用的是3.x及以上版本的
hdfs库,该能力已经被封装为公开方法client.get_fs_stats(),可直接调用获取统计值,无需走私有请求方法 - 针对Hadoop 2.7之前的旧版本集群,需要根据实际接口返回的字段名调整映射逻辑,旧版本可能将总容量字段命名为
capacity而非totalCapacity - 权限校验逻辑与原生命令完全一致:调用接口的用户需要拥有WebHDFS集群级别的读权限,否则会返回403鉴权错误
输出参考效果
内容的提问来源于stack exchange,提问作者Bruno
相关产品推荐
相关产品推荐

