HBase(九) HBase JAVA API - 运维API

举报
大数据小粉 发表于 2016/11/15 15:40:14 2016/11/15
【摘要】 运维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.Entry entry : 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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。