資料倉庫元件:HBase叢集環境搭建和應用案例
阿新 • • 發佈:2021-01-11
本文原始碼:[GitHub](https://github.com/cicadasmile/big-data-parent) || [GitEE](https://gitee.com/cicadasmile/big-data-parent)
# 一、Hbase簡介
**1、基礎描述**
Hadoop原生的特點是解決大規模資料的離線批量處理場景,HDFS具備強大儲存能力,但是並沒有提供很強的資料查詢機制。HBase元件則是基於HDFS檔案系統之上提供類似於BigTable服務。
HBase是一種分散式、可擴充套件、支援海量結構化資料儲存的NoSQL資料庫。HBase在Hadoop之上提供了類似於Bigtable的能力,基於列儲存模式的而不是基於行的模式。儲存資料特點:非結構化或者鬆散的半結構化資料,儲存大表自然是需要具備水平擴充套件的能力,基於服務叢集處理海量龐大資料。
**2、資料模型**
基於Hbase的資料結構的基本描述;
- 表-Table:由行和列組成,列劃分為若干個列族;
- 行-Row:行鍵(Key)作標識,行代表資料物件;
- 列族:列族支援動態擴充套件,以字串形式儲存;
- 列標識:列族中的資料通過列識別符號來定位;
- 單元格:行鍵,列族,列識別符號共同確定一個單元;
- 單元資料:儲存在單元裡的資料稱為單元資料;
- 時間戳:預設基於時間戳來進行版本標識;
HBase的資料模型同關係型資料庫很類似,資料儲存在一張表中,有行有列。但從HBase的底層物理儲存結構看更像是Map(K-V)集合。
- 資料管理是基於列儲存的特點;
- 簡單的資料模型,內容儲存為字串;
- 沒有複雜的表關係,簡單的增刪查操作;
從整體上看資料模型,HBase是一個稀疏、多維度、排序的對映表,這張表的索引是行鍵、列族、列限定符和時間戳每個值是一個未經解釋的字串。
# 二、搭建叢集環境
**1、解壓檔案**
```
tar -zxvf hbase-1.3.1-bin.tar.gz
```
**2、配置環境變數**
```
vim /etc/profile
export HBASE_HOME=/opt/hbase-1.3.1
export PATH=$PATH:$HBASE_HOME/bin
source /etc/profile
```
**3、配置:hbase-env**
```
vim /opt/hbase-1.3.1/conf/hbase-env.sh
export JAVA_HOME=/opt/jdk1.8
export HBASE_MANAGES_ZK=false
```
**4、配置:hbase-site**
```xml
vim /opt/hbase-1.3.1/conf/hbase-site.xml
```
**5、配置:regionservers**
```
vim /opt/hbase-1.3.1/conf/regionservers
hop01
hop02
hop03
```
**6、配置:軟連線**
軟連線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
```
**7、同步叢集服務環境**
也可以手動配置叢集,或者使用同步命令。
```
xsync hbase/
```
**8、啟動叢集**
在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
```
**9、檢視狀態**
```
jps
HMaster:主節點
HRegionServer:分割槽節點
```
**10、停止叢集**
在hop01節點停止即可。
```
/opt/hbase-1.3.1/bin/stop-hbase.sh
```
**11、檢視介面**
```
http://hop01:16010
```
![](https://img2020.cnblogs.com/blog/1691717/202101/1691717-20210110223421815-888147579.png)
# 三、基礎Shell命令
**1、切入客戶端**
```
/opt/hbase-1.3.1/bin/hbase shell
```
**2、查看錶**
```
hbase(main):002:0> list
```
**3、建立表**
```
hbase(main):003:0> create 'user','info'
0 row(s) in 2.7910 seconds
=> Hbase::Table - user
```
**4、查看錶結構**
```
hbase(main):010:0> describe 'user'
```
**5、新增資料**
```
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'
```
**6、查看錶資料**
```
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
```
這些表結構和資料會在叢集之間自動同步。
**7、查詢指定列**
```
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
```
**8、統計行數**
```
hbase(main):013:0> count 'user'
```
**9、刪除行資料**
```
hbase(main):014:0> deleteall 'user','id02'
```
**10、清空表資料**
```
hbase(main):016:0> truncate 'user'
```
**11、刪除表**
```
hbase(main):018:0> disable 'user'
hbase(main):019:0> drop 'user'
```
# 四、JDBC基礎查詢
**1、核心依賴**
```xml
```
**2、基礎配置**
這裡連線zookeeper叢集地址即可。
```
zookeeper:
address: 叢集地址Url,逗號分隔
```
編寫HBase配置和常用工具方法。
```java
@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;
}
}
```
**3、查詢案例**
查詢資料參考上述全表掃描結果:
```java
@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){
Navi