hbase 0.96 java api_HBase(九) HBase JAVA API - 运维API

运维API

监控集群状态

Configuration conf = HBaseConfiguration.create();

HBaseAdmin admin = new HBaseAdmin(conf);

ClusterStatus status = admin.getClusterStatus();

System.out.println("Cluster Status:\n--------------");

// 集群版本

System.out.println("HBase Version: " + status.getHBaseVersion());

// ClusterStatus实例的版本号,通过序列化的方式通过RPC传输

System.out.println("Version: " + status.getVersion());

//根目录下hbase.id存的集群id,这个id是集群第一次启动时通过UUID生成的

System.out.println("Cluster ID: " + status.getClusterId());

// 返回master的ServerName实例,用法类同下面rs的ServerName

System.out.println("Master: " + status.getMaster());

System.out.println("No. Backup Masters: " + status.getBackupMastersSize());

System.out.println("Backup Masters: " + status.getBackupMasters());

// 当前正常的region服务器数量,不包括dead server

System.out.println("No. Live Servers: " + status.getServersSize());

// 当前正常的region服务器列表,信息包括服务器名、端口、启动时间戳

System.out.println("Servers: " + status.getServers());

// 下面两个类同

System.out.println("No. Dead Servers: " + status.getDeadServers());

System.out.println("Dead Servers: " + status.getDeadServerNames());

// 集群中region的总数量

System.out.println("No. Regions: " + status.getRegionsCount());

// 当前集群正在进行的region事务列表,包括移动、上线、下线;key是编码后的region名,value是RegionState实例

System.out.println("Regions in Transition: " + status.getRegionsInTransition());

// 集群请求TPS

System.out.println("No. Requests: " + status.getRequestsCount());

// 平均每台服务器上线的region数量

System.out.println("Avg Load: " + status.getAverageLoad());

System.out.println("Master Coprocessors: " + Arrays.asList(status.getMasterCoprocessors()));

System.out.println("\nServer Info:\n--------------");

for (ServerName server : status.getServers()) {

// 返回域名,如果没有返回ip

System.out.println("Hostname: " + server.getHostname());

// hostname:rpc-port

System.out.println("Host and Port: " + server.getHostAndPort());

// hostname,rpc-port,start-code

System.out.println("Server Name: " + server.getServerName());

System.out.println("RPC Port: " + server.getPort());

// 启动时的System.currentTimeMillis()

System.out.println("Start Code: " + server.getStartcode());

// 每个region服务器的负载情况,包括server中管理的region信息

HServerLoad load = status.getLoad(server);

System.out.println("\nServer Load:\n--------------");

// 等于getNumberOfRegions

System.out.println("Load: " + load.getLoad());

// JVM信息

System.out.println("Max Heap (MB): " + load.getMaxHeapMB());

System.out.println("Used Heap (MB): " + load.getUsedHeapMB());

// 当前服务器已用写缓存的大小,包括服务器上的所有server

System.out.println("Memstore Size (MB): " + load.getMemStoreSizeInMB());

// 仅统计上线的region

System.out.println("No. Regions: " + load.getNumberOfRegions());

// 当前周期内的TPS,包括所有API请求,如get/put/incr/delete等,周期结束后清零

// 周期配置由hbase.regionserver.msginterval配置

System.out.println("No. Requests: " + load.getNumberOfRequests());

System.out.println("Total No. Requests: " + load.getTotalNumberOfRequests());

// 下面三个都是包括server上所有region的整体情况

System.out.println("No. Storefiles: " + load.getStorefiles());

System.out.println("Storefile Size (MB): " + load.getStorefileSizeInMB());

System.out.println("Storefile Index Size (MB): " + load.getStorefileIndexSizeInMB());

System.out.println("Coprocessors2: " + Arrays.asList(load.getRsCoprocessors()));

System.out.println("\nRegion Load:\n--------------");

for (Map.Entryentry : load.getRegionsLoad().entrySet()) {

System.out.println("Region: " + Bytes.toStringBinary(entry.getKey()));

RegionLoad regionLoad = entry.getValue();

System.out.println("Name: " + Bytes.toStringBinary(regionLoad.getName()));

System.out.println("Name (as String): " + regionLoad.getNameAsString());

// TPS

System.out.println("No. Requests: " + regionLoad.getRequestsCount());

// QPS

System.out.println("No. Read Requests: " + regionLoad.getReadRequestsCount());

// WPS

System.out.println("No. Write Requests: " + regionLoad.getWriteRequestsCount());

// 当前region的列族数量

System.out.println("No. Stores: " + regionLoad.getStores());

// region的store file数量

System.out.println("No. Storefiles: " + regionLoad.getStorefiles());

// region总占用

System.out.println("Storefile Size (MB): " + regionLoad.getStorefileSizeMB());

System.out.println("Storefile Index Size (MB): " + regionLoad.getStorefileIndexSizeMB());

System.out.println("Memstore Size (MB): " + regionLoad.getMemStoreSizeMB());

// 当前region的root-level indexes

System.out.println("Root Index Size: " + regionLoad.getRootIndexSizeKB());

System.out.println("Total Bloom Size: " + regionLoad.getTotalStaticBloomSizeKB());

System.out.println("Total Index Size: " + regionLoad.getTotalStaticIndexSizeKB());

// 当前compaction中已compacted的kvs数

System.out.println("Current Compacted Cells: " + regionLoad.getCurrentCompactedKVs());

// 当前compaction的总kvs数

System.out.println("Total Compacting Cells: " + regionLoad.getTotalCompactingKVs());

System.out.println();

}

}

admin.close();

集群管理

Configuration conf = HBaseConfiguration.create();

// 校验配置文件是否可以通信,如果不通会抛出异常

HBaseAdmin.checkHBaseAvailable(conf);

HBaseAdmin admin = new HBaseAdmin(conf);

HTable table = new HTable(conf, "t1");

HRegionLocation hrl = table.getRegionLocation("r1");

System.out.println(hrl.getHostnamePort());

HRegionInfo hri = hrl.getRegionInfo();

System.out.println(hri.getRegionNameAsString());

// out: 't1,,1438153572263.7c01637130a14cb696483c9b70788ee6.'

byte[] regionName = hri.getRegionName();

/*

* region下线,之后会随机再上线,可能在本机或者其他rs上

* 第二个参数表示是否在zk中强制标记下线 执行此条命令后,

* shell中执行get '.META.','t1,,1438153572263.7c01637130a14cb696483c9b70788ee6.'

* 会发现info:server和info:serverstartcode的timestamp变化了, 值可能变化,因为是随机的再上线

*/

admin.unassign(regionName, true);

Thread.sleep(2000);

// region上线

admin.assign(regionName);

// 这两个sleep是为了让这两次重新分配能够生效,否则下面closeregion会报region非上线的错误,但sleep不是好办法

Thread.sleep(2000);

admin.flush("t1");

// 下面两个操作是异步的,因为合并可能会很耗时,可以传table或region

admin.compact(regionName);

admin.majorCompact(regionName);

// 表或region拆分,第二个参数是切分点,如果不为空则按这个行健切分,但必须保证行健合法且大于起始行健,否则被忽略

// 如果第二个参数空,则hbase自动选择切分点。此操作也是异步的

admin.split(regionName);

// 可以控制region在哪个特定的服务器上线,如果第二个参数null,则随机分配

admin.move(hri.getEncodedNameAsBytes(), null);

// 负载均衡开关,第二个参数如果是true,会等待到下一次balancer执行

admin.setBalancerRunning(true, true);

// 立刻执行负载均衡

admin.balancer();

/*

* region下线,如果第二个参数不为空,会绕过master,直接下线,

* 尽管RegionServer关闭了这个Region,但是,在Master侧,还以为该Region是在该RegionServer上面打开的。

* 假如,在执行Balance的时候,Master计算出恰好要转移这个Region,那么,这个Region将无法被关闭,本次转移操作将无法完成

* 所以尽量不要执行此操作,更不要绕过master执行此操作 执行此条命令后,shell中执行get

* '.META.','t1,,1438153572263.7c01637130a14cb696483c9b70788ee6.'

* 会发现info:server和info:serverstartcode的时间戳和值都变了(也是随机的)

*/

admin.closeRegion(regionName, null);

// 下面这三个方法是瞬时方法,不可逆的过程,分别关闭RS,MS,CLUSTER

// admin.stopRegionServer(hrl.getHostnamePort());

// admin.stopMaster();

// admin.shutdown();

// 生产代码这里要处理异常

table.close();

admin.close();

作者 | 林钰鑫

转载请注明出处:华为云博客 https://portal.hwclouds.com/blogs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值