HBase是一個領先的No-SQL數據庫,它在HDFS上存儲數據
HBase是面向列的數據庫
HBase是一個分佈式哈希映射
HBase是基於Google Big Table論文
HBase使用HDFS作爲存儲,並利用其可靠性
數據訪問速度快,響應時間約2-20毫秒
支持每個節點20k到100k以上ops/s的數據庫讀寫操作
擴展到20,000多個節點
關係型數據庫一般都有外鍵約束,代表了數據和數據之間的聯繫,數據生成過程不一定是一致的;關係型數據庫保證數據不會冗餘。非關係型數據庫就是把很多數據放到一起。
Hbase不是面向文檔的,應用於數據查詢,可以存數據,查數據,很少會寫數據;Hive應用於數據分析擅長複雜數據處理,分析可以拼數據,所以Hive比較慢
Apache HBase用例:
捕獲增量數據——時間序列數據
高容量,高速寫入
信息交換——消息傳遞
高容量,高速讀寫
內容服務——Web應用程序後端
高容量,高速度讀取
示例—Facebook中的HBase:
9000個分佈式緩存實例
4000 mysql碎片
自2011年以來移動到Hbase
示例—阿里巴巴搜索中的HBase:
自2010年以來,HBase一直是阿里巴巴搜索系統的核心存儲
目前的規模:
3個集羣每個集羣1000 +集羣
分享Flink紗
服務每天操作超過10M+/s
Apache HBase生態系統:
Lily——HBase中的CRM
OpenTSDB——時間序列數據的HBase
Kylin——HBase中的OLAP系統
Phoenix——HBase中的SQL
Splice Machine——HBase中的OLTP系統,在HBase增加足夠多的功能,使它能夠替代關係型數據庫
Apache Tephra——HBase事務功能支持
TiDB——分配SQL數據
Apache Omid——正面的事務管理
Yarn應用時間軸服務器v.2移動到HBase
Hive元數據存儲正在遷移到HBase
Ambari Metrics服務器將使用HBase作爲數據存儲
HBase整體物理架構:
HBase RegionServer(區域服務器)與HDFS DataNode配置在一起
HBase Client(客戶端)直接與區域服務器通信以發送和接收數據
HBase Maste管理區域分配並處理DDL操作
在ZooKeeper中維護在線配置狀態
HBase Master和ZooKeeper不涉及數據路徑,HBase Master要通過ZooKeeper保證穩定性,一旦HBase Master掉電或者出現錯誤,ZooKeeper就會接替HBase Maste,使得服務不會出錯
RegionServer是HBase集羣中最重要的部分,具有真正處理數據,存儲數據的功能,與HDFS DataNode配置在一起,RegionServer和HBase Master直接通信,一旦RegionServer把HBase Master交付給HBase Client,兩者就會直接通信,數據就會從客戶端傳入RegionServer,ZooKeeper和HBase Maste並不會參與數據處理
RegionServer(處理讀數據和寫數據)區域服務器物理架構
RegionServer寫數據的時候,先把數據寫到HLog(WAL)裏,數據寫滿WAL以後會把數據flash到HRegion中HStore中的HFile中去,在寫數據的時候爲了保證數據的安全性會在WAL和MemStore中寫兩份數據,然後把文件存到Hadoop的HDFS文件中,這個文件就叫做HFile,然後WAL就會清空,再次填入新數據,WAL就相當於數據的備份地區
HBase就相當於一個集羣
HBase讀的時候對應讀的區域BlockCache,如果檢測到了讀的請求就會先去memory中查把數據直接返回,但是如果沒有直接在memory中找到數據,就會去Hadoop的HFile中去查
區域服務器包含單個WAL,單個塊緩存(讀緩存)和多個區域
區域包含多個存儲,每個Column Family(列族)對應一個存儲
一個存儲由多個存儲文件和一個MemStore(寫/編輯緩存)組成
一個StoreFile對應於一個HFile和Column Familay(列族)
HFiles和WAL作爲序列文件保存在HDFS上。
區域和表的邏輯架構
單個表被劃分爲大小大致相同的Regions。
Regions被分配到跨集羣的Regions服務器。
一個區域只分配到一臺服務器
Regions服務器承載的Regions數量大致相同。
在區域內拆分列族以將設置列分組在一起
客戶端直接與區域服務器對話
行的邏輯結構:
Rowkey(行鍵)是唯一的和排序的
Schema可以定義何時插入記錄
每一行都可以定義自己的列,即使其他行不使用它們
將相關列分組進保存在不同的文件中的Column Families(列族)(首選<3)
Column qualifier是真正的列名
使用唯一的timestamps(時間戳)維護多個行版本,對每條數據都生成一個時間戳,這樣找到每一個數據都十分方便
Value(值)類型可以在不同版本之間更改
HBase只知道字節,客戶端必須傳遞意義
單元格的物理座標:
Region directory(區域目錄) => CF Directory(CF目錄) => Row Key(行鍵) => Column Family(列族) => Column Qualifier(列限定符) => timestamp(時間戳) => Version(版本)
數據管理:
在三個位置可以追蹤到什麼
系統目錄表hbase:meta,整個查詢過程中用到的元數據
在元數據中找一個數據HMaster先找到Region,然後找到RegionServer,找到其中的表,找到具體的RowKey
HDFS目錄中的文件
打開服務器上的區域實例
系統將這些位置對齊
有時(非常罕見)可能需要使用HBase Fsck進行修復
冗餘信息對於修復損壞的表非常有用
HBase架構的優勢:
強一致性模型:
當寫返回時,所有閱讀器將看到相同的值
自動縮放:
當區域變得太大時就會分裂
使用HDFS來傳播數據和管理空間
內置的復甦:
使用寫前日誌,類似於在文件系統上寫日誌
使用Hadoop集成:
HBase上的MapReduce很簡單
如何訪問HBase — hbase shell
HBase shell是一種使用HBase的交互模式
它支持完整的hbase命令集
CMD Category |
CMDs |
General |
version, status, whoami, help |
DDL |
alter, create, describe, disable, drop, enable, exists, is_disabled, is_enabled, list |
DML |
count, delete, deleteall, get, get_counter, incr, put, scan, truncate |
Tools |
assign, balance_switch, balancer, close_region, compact, flush, major_compact, move, split, unassign, zk_dump |
Replication |
add_peer, disable_peer, enable_peer, remove_peer, start_replication, stop_replication |
HBase 常用命令:
通用命令:
hbase shell:進入HBase Shell
Status:提供HBase的狀態,例如,服務器的數量。
Version:提供正在使用HBase版本。
table_help:表引用命令提供幫助。
Whoami:提供有關用戶的信息。
List:查看當前HBase有哪些表
數據定義語言:表操作
Create:創建一個表。
List:列出HBase的所有表。
Disable:禁用表。
is_disabled:驗證表是否被禁用。
Enable:啓用一個表。
is_enabled:驗證表是否已啓用。
Describe:提供了一個表的描述。
Alter:改變一個表。
Exists:驗證表是否存在。
Drop:從HBase中刪除表。
drop_all:丟棄在命令中給出匹配“regex”的表。
數據操縱語言:
Put:把指定列在指定的行中單元格的值在一個特定的表。
Get:取行或單元格的內容。
Delete:刪除表中的單元格值。
Deleteall:刪除給定行的所有單元格。
Scan:掃描並返回表數據。
Count:計數並返回表中的行的數目。
Truncate:禁用,刪除和重新創建一個指定的表。
具體操作:
//進入HBase Shell
hbase shell
//查看當前HBase有哪些表
list
//創建表t_user,後兩項是列族,列族一般不超過3個
create 't_user',{NAME=>'name'},{NAME=>'password'}
//獲得表t_user的描述信息
describe 't_user'
//禁用表
disable 't_user'
//刪除表,刪除表之前要先把表禁用掉
drop 't_user'
//查詢表是否存在
exists 't_user'
//查看全表數據
scan 't_user'
//插入數據,分別是表名、key、列(列族:具體列)、值。HBase是面向列的數據庫,列可無限擴充
put 't_user' ,'001','cf1:name','chenxj'
put 't_user' ,'001','cf1:age','18'
put 't_user' ,'001','cf2:sex','man'
put 't_user' ,'002','cf1:name','chenxj'
put 't_user' ,'002','cf1:address','fuzhou'
put 't_user' ,'002','cf2:sex','man'
//獲取數據,可根據key、key和列族等進行查詢
get 't_user','001'
get 't_user','002','cf1'
get 't_user','001','cf1:age'
//刪除表中的rowkey
deleteall ‘t_user’,’002’
//刪除表中的列column
delete 't_user' ,'002','cf1:address'
//刪除表中的值
delete 't_user' ,'002','cf1:address',時間戳
//刪除表中的列族,column family
alter 't_user', ’delete=>’cf1’
//批量導入數據
hdfs dfs put -f hbase_import_data.csv /demo/data/
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv
-Dimporttsv.separator=,
-Dimporttsv.columns="HBASE_ROW_KEY , order:numb , order:date"
customer /demo/data/hbase_import_data.csv
//整體示例
Create ‘xuanke’,’stu’,’crs’
Create ‘xuanke’,{NAME=>’stu’},{NAME=>’crs’,VERSIONS=>3}
scan ‘xuanke’,{STARTROW=>’j’,STOPROW=>’m’}
describe ‘xuanke’
put ‘xuanke’,’2015001’,’stu:sname’,’zhangsan’
put ‘xuanke’,’2015001’,’stu:sex’,’male’
put ‘xuanke’,’2015001’,’stu:age’,’25
put ‘xuanke’,’2015001’,’crs:cname’,’math’
put ‘xuanke’,’2015001’,’crs:points’,2.0
put ‘xuanke’,’2015001’,’crs:score,86
get ‘xuanke’,’2015001’,
//改變表增加VERSIONS
alter ‘xuanke’, NAME=>’stu’, VERSIONS=>5
瞭解HBase JavaAPI:
Configuration 創建配置
Connection 建立連接
ConnectionFactory 工廠方法
Admin 管理類
Connection.getAdmin()
描述符:
表Table,
表名TableDescriptor,
列族ColumnFamily,
列
創建配置HBaseConfiguration
建立連接Connection
獲取管理對象Admin
通過管理對象進行操作:
建表
表名TableName
列族描述符
ColumnFamilyDescriptor
表名,RowKey,列族,列,值
Java重載能不能有不同返回值類型
能,重載只關心參數一樣不一樣,返回值是什麼都沒有關係
- 根據位置進行查詢
- 根據區域進行查詢
- 儲存企業信息
- 按地理位置查詢
- 按區域查詢
數據傾斜
如何避免數據傾斜,創建合理的rowkey散列到不同的節點上
HBase Rest API:
Start/Stop rest service
./hbase-daemon.sh start rest -p 9081
./hbase-daemon.sh stop rest -p 9081
Curl -v -X PUT
'http://localhost:9081/test/schema'
-H 'Accept: application/ json"
-H "ContentType: application/ json"
之前都是固定的
-d '{"@name":"test","ColumnSchema":[{"name":"data"}]}'
"@name":"test":代表表的名字
TABLE='test'
FAMILY= ' data '
KEY=$(echo 'row1' | tr -d "n" | base64)
COLUMN=$(echo 'data:test' | tr -d "\n" | base64)
DATA=$(echo 'some data' | tr -d "\n" | base64)
curl -v -X PUT
‘http://localhost :9081/ test/ row1/ data:test'
-H "Accept: application/ json"
-H "Content-Type: application/json"
-d '{"Row":[f"key":"'$KEY'", "Cell":[{" column":"'$COLUMN'","$":"' $DATA'"}]}]}’
如何訪問HBase:
Phoenix是:
HBase的一個SQL皮膚。
提供了一個在HBase SQL接口來管理數據。
創建表、插入、更新數據和執行低延遲通過JDBC查詢。
PhoenixJDBC驅動程序很容易嵌入到任何支持JDBC應用程序。
Phoenix的整體架構
Phoenix提供了類似sql的語法:
API代碼 |
Phoenix DDL |
HBaseAdmin hbase = new HBaseAdmin(conf); HTableDescriptor desc = new HTableDescriptor("us_population"); HColumnDescriptor state = new HColumnDescriptor("state".getBytes()); HColumnDescriptor city = new HColumnDescriptor("city".getBytes()); HColumnDescriptor population = new HColumnDescriptor("population".getBytes()); desc.addFamily(state); desc.addFamily(city); desc.addFamily(population); hbase.createTable(desc); |
CREATE TABLE us_population ( state CHAR(2) NOT NULL, city VARCHAR NOT NULL, population BIGINT CONSTRAINT my_pk PRIMARY KEY (state, city) ); |
更加靈活 |
熟悉的SQL語法 |
集成 |
提供附加約束檢查。 |
Phoenix支持關鍵:
支持的SQL語句 |
|
標準SQL數據類型 |
UNION ALL |
SELECT, UPSERT, DELETE |
窗口函數 |
JOINs: Inner and Outer |
Transactions |
Subqueries |
Cross Joins |
Secondary Indexes |
Authorization |
GROUP BY, ORDER BY, HAVING |
Replication Management |
AVG, COUNT, MIN, MAX, SUM |
|
Primary Keys, Constraints |
|
CASE, COALESCE |
|
VIEWs |
|
PERCENT_RANK, LAST|FIRST VALUE |
|
Phoenix示例:
增加修改:
Upstart into mytest value(‘stu001’,’zhangsan’,27)
Upstart into mytest(sex varchar) value(‘stu003’,’wangwu’,27,’male’)
Phoenix和Hbase原有的數據映射:
CREATE TABLE “student” (“id”,varchar(20) primary key,”f1”.”name” varchar(50)) column_encoded_bytes=0;
Phoenix非常適合的情況:
快速而容易地構建由HBase支持的應用程序
SQL應用程序需要極大的規模、性能和併發性
在轉換到Hadoop時重用現有的SQL技能
BI工具
分析和特別報表
考慮其他工具的情況:
涉及大型連接或高級SQL特性的複雜SQL查詢
全表掃描
ETL作業(之類的)
應用程序驅動程序/接口
HBase上Hive的用戶模式
使用HBase作爲Hive源(數據倉庫分析)
使用HBase作爲Hive Sink(批量加載數據到HBase表)
同時使用HBase(計算和存儲摘要)
Hive HBase外部表:
只支持select和insert,不支持HBase中的版本控制
性能是好的
create external table customer(
name string,
order_numb string,
order_date string,
addr_city string,
addr_state string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with
serdeproperties ("hbase.columns.mapping"=":key,order:numb,order:date,addr:city,addr:state")
tblproperties("hbase.table.name"="customer");
HBase高級主題和優化:
命名空間:
什麼是命名空間 — 一種易於表管理的機制
可以創建、刪除或更改名稱空間
通過指定表單的完全限定表名,可以在創建表時確定名稱空間成員關係
#創建一個命名空間
create_namespace 'my_ns’
#在my_ns命名空間中創建my_table
create 'my_ns:my_table', 'fam'
#刪除命名空間
drop_namespace 'my_ns’
#改變命名空間
alter_namespace 'my_ns', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}
GRANT的安全性:
使用grant命令將表上的特定/更新權限(如讀、寫、執行和管理)授予特定的用戶。
grant命令的語法如下:
grant <user> <permissions> <table> [<column family> [<column; qualifier>]]
我們可以爲RWXCA集合中的用戶授予零個或多個特權,其中:
R — 表示讀特權
W — 代表寫的特權
C — 表示創建特權
A — 表示管理權限
示例:grant 'will', 'RWCA', 'my_hbase_table'
具有Revoke & user_permission的安全性
使用revoke命令刪除表中用戶的所有權限
grant命令的語法如下:
revoke <user> <table> [<column family> [<column; qualifier>]]
示例:revoke 'will', 'my_hbase_table'
使用user_permission命令列出特定表的所有權限
user_permission的語法如下所示:
user_permission 'tablename'
示例:user_permission 'my_hbase_table'
Region分割:
什麼是分裂:
“分割”或“區域分割”是將一個區域劃分爲兩個區域
通常是因爲它太大了
這兩個分割通常會在不同的服務器上結束
區域分割的策略:
自動(最常見)
手動(或按代碼預分割)
可插入分割政策
乎每個人都使用“ConstantSizeRegionSplitPolicy”
當存儲文件變得比hbase.hregion.max.filesize更大時,就會發生分割
僅限專家:存在其他分割策略,您可以編寫自己的策略
Compactions:動機
日誌結構合併(LSM)
傳統數據庫的架構是更新現有數據
大多數現代數據庫使用某種日誌結構的合併(LSM)
這意味着只需要將值寫到日誌的末尾,然後進行排序
Pro:插入和更新非常快
Con:使用更多的空間,所以我們需要進行壓縮
Compaction的實現
小的Compaction:
將文件合併成更少的大型文件
主要的Compaction:
Compactions控制:
Compactions:
Compaction:重寫日誌文件並丟棄舊值
節省空間,使讀取和恢復更快
Compaction:昂貴的I/O密集型操作。通常希望這發生在非高峯時間
有些人從外部安排compactions,compactions很少完全禁用
Flush -> Minor Compaction -> Major Compaction:
Flush:將memstore寫到一個新的存儲文件中。事件觸發
Minor Compaction:將最近的存儲文件合併到更大的存儲文件中。事件觸發。
Major Compaction:主要重寫存儲數據以最小化空間利用率。時間觸發。
相關的控制:
Flush:hbase.hregion.memstore.flush.size
Minor Compaction:hbase.hstore.compaction.min/max:最大和最小的存儲文件(由刷新創建),必須存在這些文件才能觸發minor compaction
Major Compaction: hbase.hregion.majorcompaction:Major Compaction的時間間隔