【HBase】帶你了解一哈HBase的各種預分區



簡單了解

概述

在這里插入圖片描述
由上圖可以看出,每一個表都有屬於自己的一個Region,但Region內的數據達到10GB時,會進行分割,但仍會在同一個RegionServer上,而預分區的作用主要是增加數據讀寫效率負載均衡防止數據傾斜方便集群容災調度Region優化Map數量


設置預分區

在設置預分區前要先明白一個概念,每一個Region都維護着從StartKey到EndKey的數據,如果加入的數據符合某個Region的rowKey范圍,就把數據交給這個Region維護
比如說,現在有三個分區,它們的StartKey和EndKey分別是1-1000,1001-2000,2001-3000,現在如果有一條rowKey為1888的數據,那么他就會被分配到第二個Region中
預分區的設置方法一共有四種:

一、手動指定預分區

進入hbase shell輸入一下命令

create 'staff','info','partition1',SPLITS => ['1000','2000','3000','4000']

二、使用16進制算法生成預分區

進入hbase shell輸入一下命令

create 'staff2','info','partition2',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}

三、將分區規則寫在文本文件中

首先在/export/servers目錄下創建splits.txt文本文件,並輸入一下內容

aaaa
bbbb
cccc
dddd

然后在hbase shell中執行以下命令

create 'staff3','partition2',SPLITS_FILE => '/export/servers/splits.txt'

四、使用JavaAPI進行預分區

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.testng.annotations.Test;

import java.io.IOException;

public class HbasePartition {
    /** * 通過javaAPI進行HBase的表的創建以及預分區操作 */
    @Test
    public void hbaseSplit() throws IOException {
        //獲取連接
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Admin admin = connection.getAdmin();
        //自定義算法,產生一系列Hash散列值存儲在二維數組中
        byte[][] splitKeys = {{1,2,3,4,5},{'a','b','c','d','e'}};


        //通過HTableDescriptor來實現我們表的參數設置,包括表名,列族等等
        HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf("stuff4"));
        //添加列族
        hTableDescriptor.addFamily(new HColumnDescriptor("f1"));
        //添加列族
        hTableDescriptor.addFamily(new HColumnDescriptor("f2"));
        admin.createTable(hTableDescriptor,splitKeys);
        admin.close();

    }
}

在這里插入圖片描述


注意
在實際工作當中,創建表時一般都需要提前做預分區處理,一般來說每台服務器上面設置兩個到五個的預分區,這么做可以更好地減少Split的過程,在設置預分區時,rowKey的設計尤為重要
關於rowKey的設計可以查看文章:【HBase】快速了解上手rowKey的設計技巧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM