1. 程式人生 > >Hbase Region Load Balance on Table Level

Hbase Region Load Balance on Table Level

Table Level Load Balancer
針對 自己搭建的hbase叢集可以採用如下配置,但是,未做測試

針對表的region來均衡需要配置:

<property>
<name>hbase.master.loadbalance.bytable</name>
<value>true</value>
</property>

說明hbase 提供region balance,但是針對所有region server進行region的重分配,但是不能達到表級別的region平均分配到各個regionServer上。
下面程式碼實現了表級別的region分配邏輯,在此給大家分享下。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;
import java.util.*;

/**
 *  @author sh04595
 *  Created by sh04595 on 2017/11/29.
 *  優化策略 : 在table級別,對多於平局值部分的region,採用最少region節點分配策略,替代 admin.balancer();
* 最終效果 : 在table級別,每個regionServer的region個數都在平均值上下 * balance region on table level */ public class HbaseBalancer { public static final String tableStr = "tablename";public static final String ZK_QUORUM = "zk-srv1:2181"; public static final Integer BUCKETS_PER_NODE = 50; public static void
main(String[] args) throws IOException { Configuration config = HBaseConfiguration.create(); //config.set(HConstants.ZOOKEEPER_CLIENT_PORT, "2181" ); config.set(HConstants.ZOOKEEPER_QUORUM, ZK_QUORUM); Connection conn = ConnectionFactory.createConnection(config); Admin admin = conn.getAdmin(); ClusterStatus clusterStatus = admin.getClusterStatus(); Collection<ServerName> hServers = clusterStatus.getServers(); System.out.println("region servers :"); Map<String,RegionServer> allRegionServers = new HashMap<>(15); // 根據region server建立 hostname 和regionServer的對映,對allRegionServers進行初始化 for(ServerName server : hServers){ RegionServer rs = new RegionServer(); rs.setServerName(server); allRegionServers.put( server.getHostname(), rs ) ; String getHostAndPort = server.getHostAndPort(); String getHostname = server.getHostname(); Long startCode = server.getStartcode(); System.out.println(startCode +" "+getHostname +" " +getHostAndPort); //List<HRegionInfo> regionInfos = admin.getOnlineRegions(server); allRegionServers .put(server.getHostname(), rs); } Table table = conn.getTable(TableName.valueOf(tableStr )); // 獲取region的位置資訊 RegionLocator locator = conn.getRegionLocator(table.getName()); List<HRegionLocation> hRegionLocations= locator.getAllRegionLocations(); int avgCnt = (( int)hRegionLocations.size())/ hServers.size(); List<HRegionLocation> toAssign = new ArrayList<>(); // 當一個region server 的region的數量大於平均值的時候,儲存需要進行重新分配的region System.out.println("=============== get Region Location end =============== "); // 根據已有的regionLocation資訊進行最大程度的分配到各自節點上 for (HRegionLocation hRegionLocation: hRegionLocations) { String hostname =hRegionLocation.getHostname(); //RegionServer rs = allRegionServers.getOrDefault(hostname , new RegionServer() ); RegionServer rs = allRegionServers.get(hostname); // 上面預先建立的allRegionServers,已經進行初始化,保證這裡不會取空值 if (rs.getRegions().size() == 0) { rs.setServerName( hRegionLocation.getServerName()); } if (rs.getRegions().size() < avgCnt) { rs.addRegion(hRegionLocation.getRegionInfo().getRegionNameAsString()); } else { toAssign.add(hRegionLocation); } allRegionServers.putIfAbsent(hostname,rs); // move to rs.add System.out.println(" one of the" + hRegionLocation.toString()); } System.out.println("=============== get Region Location end =============== "); // get all table regions which need to move // move to erery serve System.out.println(" region reassign"); Iterator<HRegionLocation> assign = toAssign.iterator(); for (HRegionLocation assignRegion: toAssign) { System.out.println("all need to reassign region " + assignRegion.toString()); } System.out.println("=============== region reassign began ==============="); while (assign.hasNext()){ HRegionLocation region = assign.next(); ServerName sn = region.getServerName(); HRegionInfo regionInfo = region.getRegionInfo(); String getEncodedName = regionInfo.getEncodedName(); String sourceHostname = region.getHostname(); String sourceName = sn.getServerName(); Random rand = new Random(); //String destServerKey = allRegionServers.keySet().toArray()[rand .nextInt(toAssign.size())].toString(); String destServerKey = getMinRegionServer(allRegionServers); RegionServer rs = allRegionServers.get(destServerKey); if (rs.getRegions().size() > avgCnt ){ // 當所有的regionServer中的region個數大於 平均個數的是停止分配,保證每個節點的region的個數儘可能的平均分配到各個節點上, // 不會導致最後每個regionServer的region 個數已經達到平均值,但是某些regionServer的region個數仍然> (avgCnt+ 1) break; } System.out.println(" get region toAssign" + region); String destServerName = rs.getServerName().getServerName(); admin.move(regionInfo.getEncodedNameAsBytes(),Bytes.toBytes(destServerName)); System.out.println(" reassign to " + destServerName); rs.addRegion(regionInfo.getRegionNameAsString()); } System.out.println("=============== region reassign end ==============="); } /** * 從regionserver中遍歷得到最小的 region server 的hostname * @param allRegionServers * @return region server host name */ public static String getMinRegionServer(Map<String,RegionServer> allRegionServers ){ String key = ""; Integer cnt = Integer.MAX_VALUE ; for (String hostname : allRegionServers.keySet() ) { if ( allRegionServers.get(hostname).getRegions().size() < cnt ){ cnt = allRegionServers.get(hostname).getRegions().size(); key = hostname; } } return key; } }

import org.apache.hadoop.hbase.ServerName;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by sh04595 on 2017/11/29.
 */
public class RegionServer {

    private ServerName serverName;

    private List<String> regions ;

    public RegionServer(){
        super();
        this.regions = new ArrayList<String>();
    }

    public ServerName getServerName() {
        return serverName;
    }

    public void setServerName(ServerName serverName) {
        this.serverName = serverName;
    }


    public List<String> getRegions() {
        return regions;
    }

    public void setRegions(List<String> regions) {
        this.regions = regions;
    }
     public void addRegion ( String region ) {
        this.regions.add(region);
    }

}

相關推薦

Hbase Region Load Balance on Table Level

Table Level Load Balancer針對 自己搭建的hbase叢集可以採用如下配置,但是,未做測試:針對表的region來均衡需要配置:<property> <name>hbase.master.loadbalance.bytable&

golang JSON webservice - nginx load balance

golang lis hal fun options clean lan class list func main() { http.HandleFunc("/api", apiHandler) http.HandleFunc("/query/main",

UVA 122 -- Trees on the level (二叉樹 BFS)

返回 錯誤 符號 pri false font width else print Trees on the level UVA - 122 解題思路:   首先要解決讀數據問題,根據題意,當輸入為“()”時,結束該組數據讀入,當沒有字符串時,整個輸入結束。因此可以專門編

ZK—zookeeper無法啟動,報“Unable to load database on dis”

zookeeper問題描述:部署zookeeper的服務器磁盤滿了,引起服務異常,將zookeeper進程殺掉之後,重新啟動zookeeper啟動的時候顯示成功了: [root@slave-2 bin]# ./zkServer.sh start ZooKeeper JMX enabled by default

UVa 122 Trees on the level(鏈式二叉樹的建立和層次遍歷)

構建 void target .net color 鏈接 struct failed div 題目鏈接: https://cn.vjudge.net/problem/UVA-122 1 /* 2 問題 3 給出每個節點的權值和路線,輸出該二叉樹的層次遍歷序列。

淺析HBase region的單點問題

mas 思路 沒有 分布式 atan 磁盤 額外 行數 目前 很長一段時間以來,一個region同一時間只能在一臺RS(Region Server)中打開。如果一個region同時在多個RS上打開,就是multi-assign問題,會導致數據不一致甚至丟數據的情況,這是要避

Flume的load-balance、failover

gen com eve mar sin priority event 根據 true 負載均衡是用於解決一臺機器(一個進程)無法解決所有請求而產生的一種算法。Load balancing Sink Processor能夠實現load balance功能,如下圖Agent1是

UVa122-Trees on the level

構建 max 二叉樹 .net print while 超過 stdin ack 1.題目描述:點擊鏈接 2.問題分析: 簡單地來說,就是輸入一組字符串,表示二叉樹上某些節點的值和位置,這些節點不一定可以組成一顆完整的二叉樹,可能出現缺少某個節點或者某個節點冗余的情況。 需

Trees On the Level

tree %d memset 坑爹 code ++ \n ont -s Trees On the Level 竟然還有 (,) () 這種東西!!! #include <cstdio> #include <cstring> #include <

UVa 122 - Trees on the level(BFS層序遍歷 &&strchr&&sscanf)

題目連結:    原型: char *strchr(const char *s,char c); #include<string.h> 查詢字串s中首次出現字元c的位置,返回首次出現c的位置的指標(可以當作陣列

Hbase Region in transition (RIT) 異常解決

檢視Hbase狀態,突然發現出現了RIT,並且很長時間了~ 查看了一些相關RIT介紹 (部分介紹和Hbase2.0不同,如:RIT狀態資訊2.0已不在zookeeper儲存) https://mp.weixin.qq.com/s?__biz=MzU5OTQ1MDEzMA==

HBase region is not online 問題修復

一年多沒有搞HBase了,回想前年和營神一起戰鬥的日子,~~~。今天線上遇到下面一個問題: hbase(main):002:0> get 'mynamespace:user_basic_info','BAC3510A922CF026500874EA3975E123' COLUM

java B2B2C Springcloud電子商城系統--------負載均衡(Load Balance

負載均衡(Load Balance) 由於目前現有網路的各個核心部分隨著業務量的提高,訪問量和資料流量的快速增長,其處理能力和計算強度也相應地增大,使得單一的伺服器裝置根本無法承擔。在此情況下,如果扔掉現有裝置去做大量的硬體升級,這樣將造成現有資源的浪費,而且如果再面臨下一次業務量的提升時,這又將導致再一次

HBase Region合併分析

1.概述 HBase中表的基本單位是Region,日常在呼叫HBase API操作一個表時,互動的資料也會以Region的形式進行呈現。一個表可以有若干個Region,今天筆者就來和大家分享一下Region合併的一些問題和解決方法。 2.內容 在分析合併Region之前,我們先來了解一下Region的體

負載均衡(Load Balance)的簡單而又透徹的理解

負載均衡(Load Balance)是分散式系統架構設計中必須考慮的因素之一。 它通常是指,將請求/資料【均勻】分攤到多個操作單元上執行,負載均衡的關鍵在於【均勻】。 這裡的均勻,可不是我們想象的10 ÷ 2 = 5 ,這就算均勻啦。不是的。 常見網際網路分散式架構如上,分

HBase(08)——HBase Region管理及容錯性

Region管理 1、region分配 任何時刻,一個region只能分配給一個region server。 master記錄了當前有哪些可用的region server。以及當前哪些region分配給了哪些region server,哪些region還沒有分配

大資料之hbase(五) --- 匯出Hbase的表文件到HDFS,Hbase Bulk Load Hbase,MySQL資料通過MR匯入到Hbase表中

一、匯出Hbase的表文件到HDFS -------------------------------------------------------------------------- 1.複製hbase的jar檔案和metrices-core-xxx.jar檔案到

【轉載】負載均衡Load Balance學習

轉載於 https://www.cnblogs.com/LittleHann/p/3963255.html   目錄 1. 負載均衡簡介 2. 負載均衡演算法 3. Nginx負載均衡排程演算法原始碼調研   1. 負載均衡簡介 0x1: 負載均衡是什麼

HA,cluster,Load-Balance 區別[轉載,原出處不詳 ]

叢集(Cluster) 所謂叢集是指一組獨立的計算機系統構成的一個鬆耦合的多處理器系統,它們之間通過網路實現程序間的通訊。應用程式可以通過網路共享記憶體進行訊息傳送,實現分散式計算機。負載均衡(Load Balance) 網路的負載均衡是一種動態均衡技術,通過一些工具實時地分

HA,cluster,Load-Balance 區別

叢集(Cluster)所謂叢集是指一組獨立的計算機系統構成的一個鬆耦合的多處理器系統,它們之間通過網路實現程序間的通訊。應用程式可以通過網路共享記憶體進行訊息傳送,實現分散式計算機。負載均衡(Load Balance)網路的負載均衡是一種動態均衡技術,通過一些工具實時地分析資