You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Java客户端(RPC方式)获取DataNode的DiskUsage?

通过RPC/Java客户端获取DataNode磁盘使用状态的方案

核心思路

HDFS的DataNode与NameNode、客户端之间依赖原生RPC协议通信,我们可以直接利用HDFS提供的DataNodeProtocol或ClientDatanodeProtocol这两个RPC接口,调用对应方法获取磁盘使用状态,无需通过WebAPI解析响应。

实现步骤

1. 引入依赖

确保项目中包含对应版本的HDFS客户端依赖(以Maven为例):

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs-client</artifactId>
    <version>你的HDFS版本号</version>
</dependency>

2. 方案一:通过NameNode RPC获取DataNode状态

借助DataNodeProtocol接口,通过向NameNode发送心跳请求的方式,获取目标DataNode的存储状态:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hdfs.protocol.DataNodeProtocol;
import org.apache.hadoop.hdfs.protocol.HeartbeatResponse;
import org.apache.hadoop.hdfs.protocol.DatanodeRegistration;
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants;
import org.apache.hadoop.ipc.RPC;
import java.net.InetSocketAddress;

public class DnDiskStatusViaNN {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://你的NameNode地址:8020");

        // 获取DataNodeProtocol的RPC代理,连接NameNode
        DataNodeProtocol dnProtocol = RPC.getProxy(
                DataNodeProtocol.class,
                DataNodeProtocol.versionID,
                new InetSocketAddress("你的NameNode地址", 8020),
                conf
        );

        // 构造目标DataNode的注册信息(真实场景可从配置或DataNode本地实例获取)
        DatanodeRegistration dnReg = new DatanodeRegistration(
                "目标DataNode地址:50010",
                "目标DataNode主机名",
                "目标DataNode地址:50020",
                new String[]{"存储ID"},
                HdfsServerConstants.DatanodeRole.DATA_NODE
        );

        // 发送心跳请求,获取包含存储状态的响应
        HeartbeatResponse response = dnProtocol.reportHeartBeat(
                dnReg,
                0, 0, null, null, null, null, false, null, null
        );

        // 解析磁盘使用数据
        if (response.getStorageReports() != null) {
            for (var report : response.getStorageReports()) {
                System.out.println("存储路径: " + report.getStoragePath());
                System.out.println("总容量: " + report.getCapacity() / (1024*1024*1024) + " GB");
                System.out.println("已使用: " + report.getUsed() / (1024*1024*1024) + " GB");
                System.out.println("剩余容量: " + report.getRemaining() / (1024*1024*1024) + " GB");
                System.out.println("------------------------");
            }
        }

        RPC.stopProxy(dnProtocol);
    }
}

3. 方案二:直接连接DataNode RPC端口

使用ClientDatanodeProtocol接口,直接连接目标DataNode的内部RPC端口(默认50020),获取存储信息:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hdfs.protocol.ClientDatanodeProtocol;
import org.apache.hadoop.hdfs.protocol.StorageReport;
import org.apache.hadoop.ipc.RPC;
import java.net.InetSocketAddress;

public class DnDiskStatusDirect {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();

        // 获取ClientDatanodeProtocol代理,直接连接目标DataNode
        ClientDatanodeProtocol dnClientProtocol = RPC.getProxy(
                ClientDatanodeProtocol.class,
                ClientDatanodeProtocol.versionID,
                new InetSocketAddress("目标DataNode地址", 50020),
                conf
        );

        // 直接获取存储报告
        StorageReport[] storageReports = dnClientProtocol.getDatanodeInfo().getStorageReports();
        
        // 解析输出磁盘状态
        for (var report : storageReports) {
            System.out.println("存储路径: " + report.getStoragePath());
            System.out.println("总容量: " + report.getCapacity() / (1024*1024*1024) + " GB");
            System.out.println("已使用: " + report.getUsed() / (1024*1024*1024) + " GB");
            System.out.println("剩余容量: " + report.getRemaining() / (1024*1024*1024) + " GB");
            System.out.println("------------------------");
        }

        RPC.stopProxy(dnClientProtocol);
    }
}

关键注意事项

  • 确保客户端HDFS版本与集群版本一致,避免RPC协议兼容性问题。
  • 运行客户端的机器需要能访问目标NameNode/DataNode的RPC端口,且具备足够的权限。
  • 如果在DataNode本地执行,可直接获取本地的DatanodeRegistration或StorageReport实例,无需手动构造。

内容的提问来源于stack exchange,提问作者diptam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:20:48