HBase的特點:

  • 海量存儲: 底層基於HDFS存儲海量數據
  • 列式存儲:HBase錶的數據是基於列族進行存儲的,一個列族包含若幹列
  • 極易擴展:底層依賴HDFS,當磁盤空間不足的時候,只需要動態增加DataNode服務節點就可以
  • 高並發:支持高並發的讀寫請求
  • 稀疏:稀疏主要是針對HBase列的靈活性,在列族中,你可以指定任意多的列,在列數據為空的情 况下,是不會占用存儲空間的。
  • 數據的多版本:HBase錶中的數據可以有多個版本值,默認情况下是根據版本號去區分,版本號就 是插入數據的時間戳
  • 數據類型單一:所有的數據在HBase中是以字節數組進行存儲

HBase的應用場景:

  HBase適合海量明細數據的存儲,並且後期需要有很好的查詢性能(單錶超千萬、上億, 且並發要求高)

HBase數據模型:

HBase整體架構:

Zookeeper

  • 實現了HMaster的高可用
  • 保存了HBase的元數據信息,是所有HBase錶的尋址入口
  • 對HMaster和HRegionServer實現了監控

HMaster(Master)

  • 為HRegionServer分配Region 維護整個集群的負載均衡
  • 維護集群的元數據信息
  • 發現失效的Region,並將失效的Region分配到正常的HRegionServer上

HRegionServer(RegionServer)

  • 負責管理Region 接受客戶端的讀寫數據請求
  • 切分在運行過程中變大的Region

Region

  • 每個HRegion由多個Store構成, 每個Store保存一個列族(Columns Family),錶有幾個列族,則有幾個Store,
  • 每個Store由一個MemStore和多個StoreFile組成,MemStore是Store在內存中的內容,寫到文件 後就是StoreFile。
  • StoreFile底層是以HFile的格式保存

HBase shell 基本操作:

入口:hbase shell

hbase(main):001:0> create 'lagou', 'base_info', 'extra_info'
或者(Hbase建錶必須指定列族信息)
create 'lagou', {NAME => 'base_info', VERSIONS => '3'},{NAME =>
'extra_info',VERSIONS => '3'}
VERSIONS 是指此單元格內的數據可以保留最近的 3 個版本

添加數據操作:

向lagou錶中插入信息,row key為 rk1,列族base_info中添加name列標示符,值為wang
put 'lagou', 'rk1', 'base_info:name', 'wang' 向lagou錶中插入信息,row key為rk1,列族base_info中添加age列標示符,值為30
put 'lagou', 'rk1', 'base_info:age', 30

向lagou錶中插入信息,row key為rk1,列族extra_info中添加address列標示符,值為shanghai
put 'lagou', 'rk1', 'extra_info:address', 'shanghai'

查詢,更新,删除:

獲取錶中row key為rk1的所有信息
get 'lagou', 'rk1'
獲取lagou錶中row key為rk1,base_info列族的所有信息
get 'lagou', 'rk1', 'base_info'
獲取錶中row key為rk1,base_info列族的name、age列標示符的信息
get 'lagou', 'rk1', 'base_info:name', 'base_info:age' 獲取lagou錶中row key為rk1,base_info、extra_info列族的信息
hbase(main):010:0> get 'lagou', 'rk1', 'base_info', 'extra_info'
或者
hbase(main):011:0> get 'lagou', 'rk1', {COLUMN => ['base_info', 'extra_info']}
或者
hbase(main):012:0> get 'lagou', 'rk1', {COLUMN => ['base_info:name',
'extra_info:address']} 獲取錶中row key為rk1,cell的值為wang的信息
get 'lagou', 'rk1', {FILTER => "ValueFilter(=,
'binary:wang')"} 獲取錶中row key為rk1,列標示符中含有a的信息
get 'lagou', 'rk1', {FILTER => "
(QualifierFilter(=,'substring:a'))"} 查詢lagou錶中的所有信息:
scan 'lagou' 查詢錶中列族為 base_info 的信息:
hbase(main):001:0> scan 'lagou', {COLUMNS => 'base_info'}
hbase(main):002:0> scan 'lagou', {COLUMNS => 'base_info', RAW => true, VERSIONS
=> 3}
## Scan時可以設置是否開啟Raw模式,開啟Raw模式會返回包括已添加删除標記但是未實際删除的數據
## VERSIONS指定查詢的最大版本數 指定多個列族與按照數據值模糊查詢:
查詢lagou錶中列族為 base_info 和 extra_info且列標示符中含有a字符的信息 hbase(main):001:0> scan 'lagou', {COLUMNS => ['base_info', 'extra_info'], FILTER
=> "(QualifierFilter(=,'substring:a'))"} rowkey的範圍值查詢(非常重要)
查詢lagou錶中列族為base_info,rk範圍是[rk1, rk3)的數據(rowkey底層存儲是字典序)
按rowkey順序存儲。
scan 'lagou', {COLUMNS => 'base_info', STARTROW => 'rk1',
ENDROW => 'rk3'} 查詢lagou錶中row key以rk字符開頭的
hbase(main):001:0> scan 'lagou',{FILTER=>"PrefixFilter('rk')"} 更新數據值:
把lagou錶中rowkey為rk1的base_info列族下的列name修改為liang
put 'lagou', 'rk1', 'base_info:name', 'liang' 删除數據和錶:
删除lagou錶row key為rk1,列標示符為 base_info:name 的數據
> delete 'lagou', 'rk1', 'base_info:name' 指定rowkey,列名以及時間戳信息進行删除
删除lagou錶row key為rk1,列標示符為base_info:name的數據
delete 'lagou', 'rk1', 'base_info:name',1600660619655 删除 base_info 列族
alter 'lagou', 'delete' => 'base_info' 删除lagou錶數據
truncate 'lagou' 删除lagou錶
#先disable 再drop
hbase(main):036:0> disable 'lagou'
hbase(main):037:0> drop 'lagou'
#如果不進行disable,直接drop會報錯
ERROR: Table user is enabled. Disable it first.

HBase JAVA  API:

<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
</dependencies>

創建連接:

package com.lagou.hbase.client;

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 org.junit.After;
import org.junit.Before;
import org.junit.Test; import java.io.IOException; public class HbaseClientDemo {
Configuration conf = null;
Connection conn = null; @Before
public void init() throws IOException {
//獲取一個配置文件對象
conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "linux121,linux122");
conf.set("hbase.zookeeper.property.clientPort", "2181");
//通過conf獲取到hbase集群的連接
conn = ConnectionFactory.createConnection(conf);
} //釋放連接
@After
public void realse() {
if (conn != null) {
try {
conn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

創建錶:

 //創建一張hbase錶
@Test
public void createTable() throws IOException {
//獲取HbaseAdmin對象用來創建錶
HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();
//創建Htabledesc描述器,錶描述器
final HTableDescriptor worker = new HTableDescriptor(TableName.valueOf("worker"));
//指定列族
worker.addFamily(new HColumnDescriptor("info"));
admin.createTable(worker);
System.out.println("worker錶創建成功!!");
}

插入數據:

  //插入一條數據
@Test
public void putData() throws IOException {
//需要獲取一個table對象
final Table worker = conn.getTable(TableName.valueOf("worker")); //准備put對象
final Put put = new Put(Bytes.toBytes("110"));//指定rowkey put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("addr"), Bytes.toBytes("beijing"));
//插入數據,參數類型是put
worker.put(put);
//准備list<puts>,可以執行批量插入
//關閉table對象
worker.close();
System.out.println("插入數據到worker錶成功!!");
}

查詢數據:

//查詢數據
@Test
public void getData() throws IOException {
//准備table對象
final Table worker = conn.getTable(TableName.valueOf("worker"));
//准備get對象
final Get get = new Get(Bytes.toBytes("110"));
//指定查詢某個列族或者列
get.addFamily(Bytes.toBytes("info"));
//執行查詢
final Result result = worker.get(get);
//獲取到result中所有cell對象
final Cell[] cells = result.rawCells();
//遍曆打印
for (Cell cell : cells) {
final String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
final String f = Bytes.toString(CellUtil.cloneFamily(cell));
final String column = Bytes.toString(CellUtil.cloneQualifier(cell));
final String value = Bytes.toString(CellUtil.cloneValue(cell)); System.out.println("rowkey-->" + rowkey + "--;cf-->" + f + "---;column--->" + column + "--;value-->" + value);
}
worker.close();
}

删除數據:

   //删除一條數據
@Test
public void deleteData() throws IOException {
//需要獲取一個table對象
final Table worker = conn.getTable(TableName.valueOf("worker")); //准備delete對象
final Delete delete = new Delete(Bytes.toBytes("110"));
//執行删除
worker.delete(delete);
//關閉table對象
worker.close();
System.out.println("删除數據成功!!");
}

通過Scan全錶掃描:

/**
* 全錶掃描
*/
@Test
public void scanAllData() throws IOException {
HTable teacher = (HTable) conn.getTable(TableName.valueOf("teacher"));
Scan scan = new Scan();
ResultScanner resultScanner = teacher.getScanner(scan);
for (Result result : resultScanner) {
Cell[] cells = result.rawCells();//獲取改行的所有cell對象
for (Cell cell : cells) {
//通過cell獲取rowkey,cf,column,value
String cf = Bytes.toString(CellUtil.cloneFamily(cell));
String column = Bytes.toString(CellUtil.cloneQualifier(cell));
String value = Bytes.toString(CellUtil.cloneValue(cell));
String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
System.out.println(rowkey + "----" + cf + "--" + column + "---"
+ value);
}
}
teacher.close(); }

通過startRowKey和endRowKey進行掃描:

//指定scan 開始rowkey和結束rowkey,這種查詢方式建議使用,指定開始和結束rowkey區間避免全錶掃描
@Test
public void scanStartEndData() throws IOException {
//准備table對象
final Table worker = conn.getTable(TableName.valueOf("worker"));
//准備scan對象
final Scan scan = new Scan();
//指定查詢的rowkey區間,rowkey在hbase中是以字典序排序
scan.setStartRow(Bytes.toBytes("001"));
scan.setStopRow(Bytes.toBytes("004"));
//執行掃描
final ResultScanner resultScanner = worker.getScanner(scan);
for (Result result : resultScanner) {
//獲取到result中所有cell對象
final Cell[] cells = result.rawCells();
//遍曆打印
for (Cell cell : cells) {
final String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
final String f = Bytes.toString(CellUtil.cloneFamily(cell));
final String column = Bytes.toString(CellUtil.cloneQualifier(cell));
final String value = Bytes.toString(CellUtil.cloneValue(cell));
System.out.println("rowkey-->" + rowkey + "--;cf-->" + f + ";column--->" + column + "--;value-->" + value);
}
} worker.close();
}

海量列式非關系數據庫HBase 架構,shell與API的更多相關文章

  1. 列式存儲hbase系統架構學習

    一.Hbase簡介 HBase是一個開源的非關系型分布式數據庫(NoSQL),它參考了穀歌的BigTable建模,實現的編程語言為 Java.它是Apache軟件基金會的Hadoop項目的一部分,運行 ...

  2. HBase 是列式存儲數據庫嗎

    在介紹 HBase 是不是列式存儲數據庫之前,我們先來了解一下什麼是行式數據庫和列式數據庫. 行式數據庫和列式數據庫 在維基百科裏面,對行式數據庫和列式數據庫的定義為:列式數據庫是以列相關存儲架構進行 ...

  3. 【HBase】與關系型數據庫區別、行式/列式存儲

    [HBase]與關系型數據庫區別 1.本質區別 mysql:關系型數據庫,行式存儲,ACID,SQL,只能存儲結構化數據 事務的原子性(Atomicity):是指一個事務要麼全部執行,要麼不執行,也就 ...

  4. Hbase與Oracle比較(列式數據庫與行式數據庫)

    Hbase與Oracle比較(列式數據庫與行式數據庫) 1 主要區別 Hbase適合大量插入同時又有讀的情况 Hbase的瓶頸是硬盤傳輸速度,Oracle的瓶頸是硬盤尋道時間.   Hbase本質上只 ...

  5. HBase:分布式列式NoSQL數據庫

    傳統的ACID數據庫,可擴展性上受到了巨大的挑戰.而HBase這類系統,兼具可擴展性的同時,也提出了類SQL的接口. HBase架構組成 HBase采用Master/Slave架構搭建集群,它隸屬於H ...

  6. Hadoop HBase概念學習系列之HBase裏的列式數據庫(十七)

    列式數據庫,從數據存儲方式上有別於行式數據庫,所有數據按列存取. 行式數據庫在做一些列分析時,必須將所有列的信息全部讀取出來 而列式數據庫由於其是按列存取,因此只需在特定列做I/O即可完成查詢與分析, ...

  7. Hbase架構與原理

    Hbase架構與原理 HBase是一個分布式的.面向列的開源數據庫,該技術來源於 Fay Chang所撰寫的Google論文"Bigtable:一個結構化數據的分布式存儲系統".就 ...

  8. Hbase架構與原理(轉)

    Hbase架構與原理 HBase是一個分布式的.面向列的開源數據庫,該技術來源於 Fay Chang所撰寫的Google論文“Bigtable:一個結構化數據的分布式存儲系統”.就像Bigtable利 ...

  9. NoSQL數據庫探討之一 - 為什麼要用非關系數據庫?

    隨著互聯網web2.0網站的興起,非關系型的數據庫現在成了一個極其熱門的新領域,非關系數據庫產品的發展非常迅速.而傳統的關系數據庫在應付 web2.0網站,特別是超大規模和高並發的SNS類型的web2 ...

  10. hadoop生態圈列式存儲系統--kudu

    介紹 Kudu 是一個針對 Apache Hadoop 平臺而開發的列式存儲管理器.Kudu 共享 Hadoop 生態系統應用的常見技術特性: 它在 commodity hardware(商品硬件)上 ...

隨機推薦

  1. 在html中添加script脚本的方法和注意事項

    在html中添加script脚本有兩種方法,直接將javascript代碼添加到html中與添加外部js文件,這兩種方法都比較常用,大家可以根據自己需要自由選擇 在html中添加<script& ...

  2. mysql replace 替換函數

    UPDATE ecm_goods SET description = replace(description,'原字符串', '替換為') WHERE 條件;

  3. NSURLConnection下載

    @interface AppDelegate () <NSURLConnectionDataDelegate> {    NSMutableData *mData;} @end @impl ...

  4. keybd_event 對應錶

    Option Explicit Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bSc ...

  5. NVIDA 提到的 深度框架庫

    BidMachBlocksCaffeChainerCNTKcuda-convnetcuda-convnet2Deeplearning4jkaldiKerasLasagneMarvinMatConvNe ...

  6. 看懂Azure ML、Windows ML和ML.NET

    最新2018微軟中國人工智能大會剛剛落下帷幕,對於.NET開發者,可能早已被眼花繚亂的微軟家AI體系弄暈了.我特意整理了幾張圖,以示區別. Azure ML提供了大量認知API服務,外加一個機器學習的 ...

  7. Nginx:413 Request Entity Too Large

    現象:在 Post 文件的時候遇到413 錯誤 :Request Entity Too Large: 原因:Nginx 限制了上傳文件的大小,需在Nginx中修改/增加允許的最大文件大小: 操作:編輯 ...

  8. TFS二次開發02——連接TFS

    在上一篇<TFS二次開發01——TeamProjectsPicher>介紹了  TeamProjectsPicher 對象,使用該對象可以很簡單的實現連接TFS. 但是如果我們要實現自定義 ...

  9. OracleServer總結進階之系統分析(進階完結)

    個人原創,轉載請在文章頭部明顯比特置注明出處:https://www.cnblogs.com/sunshine5683/p/10080102.html 在上一篇進階中大概講解了一些關於進階方面的知識,今 ...

  10. DW2.0

    一.DW2.0從企業的角度,吸引企業的原因: 1.數據倉庫基礎設施的成本不再持續增長.在第一代數據倉庫中,技術基礎設施的成本是不斷增長的,隨著數據量的增長,基礎設施的成本會以指數級增長.但是使用DW2 ...