數據倉庫組件:HBase集羣環境搭建和應用案例

本文源碼:GitHub || GitEEjava

1、Hbase簡介

一、基礎描述git

Hadoop原生的特色是解決大規模數據的離線批量處理場景,HDFS具有強大存儲能力,可是並無提供很強的數據查詢機制。HBase組件則是基於HDFS文件系統之上提供相似於BigTable服務。github

HBase是一種分佈式、可擴展、支持海量結構化數據存儲的NoSQL數據庫。HBase在Hadoop之上提供了相似於Bigtable的能力,基於列存儲模式的而不是基於行的模式。存儲數據特色:非結構化或者鬆散的半結構化數據,存儲大表天然是須要具有水平擴展的能力,基於服務集羣處理海量龐大數據。算法

二、數據模型spring

基於Hbase的數據結構的基本描述;shell

  • 表-Table:由行和列組成,列劃分爲若干個列族;
  • 行-Row:行鍵(Key)做標識,行表明數據對象;
  • 列族:列族支持動態擴展,以字符串形式存儲;
  • 列標識:列族中的數據經過列標識符來定位;
  • 單元格:行鍵,列族,列標識符共同肯定一個單元;
  • 單元數據:存儲在單元裏的數據稱爲單元數據;
  • 時間戳:默認基於時間戳來進行版本標識;

HBase的數據模型同關係型數據庫很相似,數據存儲在一張表中,有行有列。但從HBase的底層物理存儲結構看更像是Map(K-V)集合。數據庫

  • 數據管理是基於列存儲的特色;
  • 簡單的數據模型,內容存儲爲字符串;
  • 沒有複雜的表關係,簡單的增刪查操做;

從總體上看數據模型,HBase是一個稀疏、多維度、排序的映射表,這張表的索引是行鍵、列族、列限定符和時間戳每一個值是一個未經解釋的字符串。apache

2、搭建集羣環境

一、解壓文件編程

tar -zxvf hbase-1.3.1-bin.tar.gz

二、配置環境變量vim

vim /etc/profile

export HBASE_HOME=/opt/hbase-1.3.1
export PATH=$PATH:$HBASE_HOME/bin

source /etc/profile

三、配置:hbase-env

vim /opt/hbase-1.3.1/conf/hbase-env.sh

export JAVA_HOME=/opt/jdk1.8
export HBASE_MANAGES_ZK=false

四、配置:hbase-site

vim /opt/hbase-1.3.1/conf/hbase-site.xml

<configuration>
    <!--HDFS存儲-->
	<property>
		<name>hbase.rootdir</name>
		<value>hdfs://hop01:9000/HBase</value>
	</property>
    <!--開啓集羣-->
	<property>
		<name>hbase.cluster.distributed</name>
		<value>true</value>
	</property>
	<!-- 端口 -->
	<property>
		<name>hbase.master.port</name>
		<value>16000</value>
	</property>
    <!--ZK集羣-->
	<property>   
		<name>hbase.zookeeper.quorum</name>
	     <value>hop01,hop02,hop03</value>
	</property>
    <!--ZK數據--> 
	<property>   
		<name>hbase.zookeeper.property.dataDir</name>
	     <value>/data/zookeeper/data/</value>
	</property>
</configuration>

五、配置:regionservers

vim /opt/hbase-1.3.1/conf/regionservers

hop01
hop02
hop03

六、配置:軟鏈接

軟鏈接hadoop配置文件到HBase

ln -s /opt/hadoop2.7/etc/hadoop/core-site.xml /opt/hbase-1.3.1/conf/core-site.xml
ln -s /opt/hadoop2.7/etc/hadoop/hdfs-site.xml /opt/hbase-1.3.1/conf/hdfs-site.xml

七、同步集羣服務環境

也能夠手動配置集羣,或者使用同步命令。

xsync hbase/

八、啓動集羣

在hop01節點啓動便可。

/opt/hbase-1.3.1/bin/start-hbase.sh

啓動日誌:

hop03: starting regionserver, logging to /opt/hbase-1.3.1/bin/../logs/hbase-root-regionserver-hop03.out
hop02: starting regionserver, logging to /opt/hbase-1.3.1/bin/../logs/hbase-root-regionserver-hop02.out
hop01: starting regionserver, logging to /opt/hbase-1.3.1/bin/../logs/hbase-root-regionserver-hop01.out

九、查看狀態

jps

HMaster:主節點
HRegionServer:分區節點

十、中止集羣

在hop01節點中止便可。

/opt/hbase-1.3.1/bin/stop-hbase.sh

十一、查看界面

http://hop01:16010

3、基礎Shell命令

一、切入客戶端

/opt/hbase-1.3.1/bin/hbase shell

二、查看錶

hbase(main):002:0> list

三、建立表

hbase(main):003:0> create 'user','info'
0 row(s) in 2.7910 seconds
=> Hbase::Table - user

四、查看錶結構

hbase(main):010:0> describe 'user'

五、添加數據

put 'user','id01','info:name','tom'
put 'user','id01','info:age','18'
put 'user','id01','info:sex','male'
put 'user','id02','info:name','jack'
put 'user','id02','info:age','20'
put 'user','id02','info:sex','female'

六、查看錶數據

hbase(main):010:0> scan 'user'
ROW     COLUMN+CELL                                                                             
id01    column=info:age, timestamp=1594448524308, value=18                                      
id01    column=info:name, timestamp=1594448513534, value=tom                                    
id01    column=info:sex, timestamp=1594448530817, value=male                                    
id02    column=info:age, timestamp=1594448542631, value=20                                      
id02    column=info:name, timestamp=1594448536520, value=jack                                   
id02    column=info:sex, timestamp=1594448548005, value=female

這些表結構和數據會在集羣之間自動同步。

七、查詢指定列

hbase(main):012:0> get 'user','id01'
COLUMN      CELL                                                                                    
info:age    timestamp=1594448524308, value=18                                                       
info:name   timestamp=1594448513534, value=tom                                                       
info:sex    timestamp=1594448530817, value=male

八、統計行數

hbase(main):013:0> count 'user'

九、刪除行數據

hbase(main):014:0> deleteall 'user','id02'

十、清空表數據

hbase(main):016:0> truncate 'user'

十一、刪除表

hbase(main):018:0> disable 'user'
hbase(main):019:0> drop 'user'

4、JDBC基礎查詢

一、核心依賴

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>1.3.1</version>
</dependency>

二、基礎配置

這裏鏈接zookeeper集羣地址便可。

zookeeper:
  address: 集羣地址Url,逗號分隔

編寫HBase配置和經常使用工具方法。

@Component
public class HBaseConfig {

    private static String address;
    private static final Object lock=new Object();
    public static Configuration configuration = null;
    public static ExecutorService executor = null;
    public static Connection connection = null;

    /**
     * 獲取鏈接
     */
    public static Connection getConnection(){
        if(null == connection){
            synchronized (lock) {
                if(null == connection){
                    configuration = new Configuration();
                    configuration.set("hbase.zookeeper.quorum", address);
                    try {
                        executor = Executors.newFixedThreadPool(10);
                        connection = ConnectionFactory.createConnection(configuration, executor);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return connection;
    }

    /**
     * 獲取 HBaseAdmin
     */
    public static HBaseAdmin getHBaseAdmin(){
        HBaseAdmin admin = null;
        try{
            admin = (HBaseAdmin)getConnection().getAdmin();
        }catch(Exception e){
            e.printStackTrace();
        }
        return admin;
    }
    /**
     * 獲取 Table
     */
    public static Table getTable(TableName tableName) {
        Table table = null ;
        try{
            table = getConnection().getTable(tableName);
        }catch(Exception e){
            e.printStackTrace();
        }
        return table ;
    }
    /**
     * 關閉資源
     */
    public static void close(HBaseAdmin admin,Table table){
        try {
            if(admin!=null) {
                admin.close();
            }
            if(table!=null) {
                table.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Value("${zookeeper.address}")
    public void setAddress (String address) {
        HBaseConfig.address = address;
    }
}

三、查詢案例

查詢數據參考上述全表掃描結果:

@RestController
public class HBaseController {

    /**
     * 掃描全表
     */
    @GetMapping("/scanTable")
    public String scanTable () throws Exception {
        Table table = HBaseConfig.getTable(TableName.valueOf("user"));
        try {
            ResultScanner resultScanner = table.getScanner(new Scan());
            for (Result result : resultScanner) {
                printResult(result);
            }
        } finally {
            HBaseConfig.close(null, table);
        }
        return "success";
    }

    /**
     * 根據RowKey掃描
     */
    @GetMapping("/scanRowKey")
    public void scanRowKey() throws Exception {
        String rowKey = "id02";
        Table table = HBaseConfig.getTable(TableName.valueOf("user"));
        try {
            Result result = table.get(new Get(rowKey.getBytes()));
            printResult(result);
        } finally {
            HBaseConfig.close(null, table);
        }
    }

    /**
     * 輸出 Result
     */
    private void printResult (Result result){
        NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
        Set<Map.Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>>> set = map.entrySet();
        for (Map.Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> entry : set) {
            Set<Map.Entry<byte[], NavigableMap<Long, byte[]>>> entrySet = entry.getValue().entrySet();
            for (Map.Entry<byte[], NavigableMap<Long, byte[]>> entry2 : entrySet) {
                System.out.print(new String(result.getRow()));
                System.out.print("\t");
                System.out.print(new String(entry.getKey()));
                System.out.print(":");
                System.out.print(new String(entry2.getKey()));
                System.out.print(" value = ");
                System.out.println(new String(entry2.getValue().firstEntry().getValue()));
            }
        }
    }
}

5、源代碼地址

GitHub·地址
https://github.com/cicadasmile/big-data-parent
GitEE·地址
https://gitee.com/cicadasmile/big-data-parent

推薦閱讀:編程體系整理

序號 項目名稱 GitHub地址 GitEE地址 推薦指數
01 Java描述設計模式,算法,數據結構 GitHub·點這裏 GitEE·點這裏 ☆☆☆☆☆
02 Java基礎、併發、面向對象、Web開發 GitHub·點這裏 GitEE·點這裏 ☆☆☆☆
03 SpringCloud微服務基礎組件案例詳解 GitHub·點這裏 GitEE·點這裏 ☆☆☆
04 SpringCloud微服務架構實戰綜合案例 GitHub·點這裏 GitEE·點這裏 ☆☆☆☆☆
05 SpringBoot框架基礎應用入門到進階 GitHub·點這裏 GitEE·點這裏 ☆☆☆☆
06 SpringBoot框架整合開發經常使用中間件 GitHub·點這裏 GitEE·點這裏 ☆☆☆☆☆
07 數據管理、分佈式、架構設計基礎案例 GitHub·點這裏 GitEE·點這裏 ☆☆☆☆☆
08 大數據系列、存儲、組件、計算等框架 GitHub·點這裏 GitEE·點這裏 ☆☆☆☆☆
相關文章
相關標籤/搜索