Apache Hbase概述

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重載能不能有不同返回值類型

能,重載只關心參數一樣不一樣,返回值是什麼都沒有關係

  1. 根據位置進行查詢
  2. 根據區域進行查詢
  3. 儲存企業信息
  4. 按地理位置查詢
  5. 按區域查詢

數據傾斜

如何避免數據傾斜,創建合理的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的時間間隔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章