Ⅰ region下所有的hfile默認存放
HBase 是 Google Bigtable 的開源實現,是一個 sparse, distributed, persistent multi- dimensional sorted map,map 的 key 由 rowkey,column family,qualifier,timestamp,type 組成,並據此排序。
架構圖
Hbase 的架構是存算分離的,方便擴展,底層存儲使用 HDFS,HBase 相關組件提供計算功能,部分元數據存儲在 ZK 中。架構圖如下:
數據模型
table:表,一個表包含多行數據
row:行,一行數據包含一個唯一標識 rowkey、多個 column 以及對應的值。在 HBase 中,一張表中所有 row 都按照 rowkey 的字典序由小到大排序。
column:列,與關系型資料庫中的列不同,HBase 中的 column 由 column family(列簇)以及 qualifier(列名)兩部分組成,兩者中間使用":"相連。比如 contents:html,其中 contents 為列簇,html 為列簇下具體的一列。column family 在表創建的時候需要指定,不能隨意增減。一個 column family 下可以有任意多個 qualifier,也就是 HBase 中的列可以動態增加,理論上甚至可以擴展到上百萬列。
timestamp:時間戳,每個 cell 在寫入 HBase 的時候都會默認分配一個時間戳作為該 cell 的版本,當然,用戶也可以在寫入的時候自帶時間戳。HBase 支持多版本特性,即同一 rowkey、column 下可以有多個 value 存在,這些 value 使用 timestamp 作為版本號,版本越大,表示數據越新。
cell:單元格,由五元組(row, column, timestamp, type, value)組成的結構,其中 type 表示 Put/Delete 這樣的操作類型,timestamp 代表這個 cell 的版本。這個結構在資料庫中實際是以 KV 結構存儲的,其中(row, column, timestamp, type)是 K,value 欄位對應 KV 結構的 V。在每個 HFile 文件中,KV 按序存儲,按照 KV 中 key 的字典序進行排序。先比較 rowkey,rowkey 小的排在前面;如果 rowkey 相同,再比較 column,即 column family:qualifier,column 小的排在前面;如果 column 還相同,再比較時間戳 timestamp,即版本信息,timestamp 大的排在前面(也就是最新的排在前面)。
數據文件的物理存儲
HFile 在 HDFS 上按照 table、region、column family 分目錄存儲,如下所示:
/hbase/data/default/table-name/region-name/column-family-name/hfile-name
其中 default 是默認 namespace,一個列簇下的所有 HFile 文件都在同一個列簇目錄下,按照文件的新舊程度放置在 LSM-tree 的不同 level,每個 level 只有一個 HFile 文件。
Compact
Minor Compact:選取部分尺寸小的、LSM-tree 中相鄰 level 的 HFile,將它們合並成更大的 HFile,但是不清理 type 為 deletes 或 expired versions 的數據。
Major Compact:將一個 Store 中所有的 HFile 合並成一個 HFile,由於只有一個 HFile 文件,這個文件可能會很大,這也是 HFile 文件結構中索引是多層結構的原因。這個過程還會完全清理三類無意義數據:被刪除的數據、TTL 過期數據、版本號超過設定版本號的數據。
RegionServer
一個 RegionServe r由一個(或多個)HLog、一個 BlockCache 以及多個 Region 組成。其中,HLog 用作 WAL;BlockCache 可以將 block 緩存在內存中以提升數據讀取性能;Region 是 HBase 中數據表的一個數據分片,一個 RegionServer 通常會負責多個 Region 的數據讀寫,Region 可以來自相同或不同表。Region 由多個 Store 組成,一個 Store 負責一個列簇的數據,比如一個表中有兩個列簇,這個表的所有 Region 就都會包含兩個 Store。每個 Store 包含一個 MemStore 和多個 HFile,用戶數據寫入時會先寫 HLog,然後將對應列簇數據寫入相應的 MemStore,一旦 MemStore 大小超過設定閾值,系統就會將 MemStore 中的數據落盤形成 HFile 文件,HFile 存放在HDFS上。
這里 HLog、MemStore、HFile 與 LevelDB 中對應的相關文件:日誌文件、memtable、sstable,格式也有相似之處,先不展開介紹。
ACID
HBase 保證單行事務的 ACID 特性,跨行無法保證。作為該限制的結果之一就是不支持輔助索引,對數據項的更新需要同時對輔助索引進行更新,而這不是原子的。單行事務的保證是通過將單行中涉及的多個 column 修改編碼為一條 WAL 來完成的,即使跨多個 column family 也可以。
hbase:meta 表
hbase:meta 表就是分區表,分區表作用可以參考
狂奔的蝸牛:可擴展性之數據分區
該表存儲了 Region 到 Region Server 的映射,用來路由 client 讀寫請求、進行負載均衡等操作。該表的所在 RS 節點存儲在 ZK 上。表結構如下:
Key
Region key of the format ([table],[region start key],[region id])
Values
info:regioninfo (serialized HRegionInfo instance for this region)
info:server (server:port of the RegionServer containing this region)
info:serverstartcode (start-time of the RegionServer process containing this region)
當 Region 發生 split 時候,values 中會新建兩列:info:splitA 和 info:splitB。這兩列代表兩個新的子 Region,列值同 info:regioninfo 一樣,也是 serialized HRegionInfo instance,在 Region 完成 split 後,對應的舊行將被刪除。
空的 start key 表示 HBase 一張表的 start 或者 end,hbase:meta 表中如果一個 Region 有空的 start key,那麼這個 Region 是對應表的第一個 Region,如果 start key 和 end key 都為空,那麼這個 Region 是表的唯一 Region。
Region 的劃分使用范圍分區策略,按照 rowkey 劃分。
數據寫入
客戶端將用戶的寫入請求進行預處理,並根據集群元數據定位寫入數據所在的 RegionServer,將請求發送給對應的 RegionServer。
RegionServer 接收到寫入請求之後,先寫 WAL,再寫入對應 Region 列簇的 MemStore。
當 Region 中 MemStore 容量超過一定閾值,系統會非同步執行 flush 操作,將內存中的數據寫入 HFile。
數據讀取
讀取有 get 和 scan 兩種 API,get 通常根據給定 rowkey 查找一行記錄,scan 通常根據給定的 start key 和 stop key查找多行滿足條件的記錄。技術實現上,get 是特殊的 scan,scan 的條數為 1。scan 並沒有設計為一次 RPC 請求,因為一次 scan 操作的掃描結果可能數據量非常大。HBase 會根據設置條件將一次大的 scan 拆分為多個 RPC 請求,每個 RPC 請求稱為一次 next 請求,每次只返回規定數量的結果。
1、client 根據集群元數據定位查詢數據所在的 RegionServer,將請求發送給對應的 RegionServer。
2、對包含用戶查詢數據的 Region 的 HFile 進行過濾,過濾方法主要有三種:
根據 KeyRange 過濾:因為 HFile 中所有 KeyValue 數據都是有序的,所以如果待檢索 row 范圍 [ start row,stop row ] 與文件起始 key 范圍 [ first key,last key ] 沒有交集,就可以過濾掉該 HFIle。
根據 TimeRange 過濾:HFile 中元數據有一個關於該 File 的 TimeRange 屬性 [ miniTimestamp, maxTimestamp ],如果待檢索的 TimeRange 與該文件時間范圍沒有交集,就可以過濾掉該 HFile;另外,如果該文件所有數據已經過期,也可以過濾淘汰。
根據布隆過濾器進行過濾:根據待檢索的 rowkey 獲取對應的 Bloom Block 並載入到內存(通常情況下,熱點 Bloom Block 常駐內存),使用布隆過濾器中的數據確定待檢索 rowkey 是否一定不存在於該 HFile。
3、從剩餘 HFile 中讀取待查找 key:首先根據 HFile 中的索引定位目標 block,然後看 Block Cache 中是否存在,不存在則從 HDFS 中 seek 讀取,之後在 block 中順序查找指定 key。由於不同 HFile 文件之間的數據是無序的,因此需要歸並排序,實際上 MemStore 使用 MemStoreScanner 讀取數據,HFile 使用 StoreFileScanner 讀取數據,最後 KeyValueScanner 將使用 MemStoreScanner 和多個 StoreFileScanner 來構建最小堆,保證所有數據有序。
Ⅱ C#中的region怎麼用
#region 注釋內容
代碼塊
#endregion
我拿他當注釋代碼塊用了,表明一塊代碼什麼意思,呵呵
Ⅲ 資料庫里region是啥意思
#region和#endregion配合使用,用於把代碼折疊起來
比如:
#region
資料庫連接相關
///
<summary>
///
獲取資料庫聯接對像
///
</summary>
///
<returns>資料庫聯接對像</returns>
public
static
sqlconnection
sqlconn()
{
//從web.config中獲取連接字元串
return
new
sqlconnection(system.configuration.configurationmanager.appsettings["connstring"]);
}
#endregion
可以折疊為一行:
〔資料庫連接相關〕
Ⅳ 說明#region與#endregion的作用
加#region和#endregion的作用主要是 :可以將這塊區域的代碼折疊起來,便於查看。
利用 #region,可以指定在使用 Visual Studio Code 編輯器的大綱功能時可展開或折疊的代碼塊。 在較長的代碼文件中,能夠折疊或隱藏一個或多個區域會十分便利,這樣,可將精力集中於當前處理的文件部分。
#region是一個分塊預處理命令,它主要用於編輯代碼的分段,在編譯時會被自動刪除。#region可以在使用VS代碼編輯器的大綱顯示功能時指定可展開或折疊的代碼塊。
(4)資料庫region怎麼用擴展閱讀:
相關事項:
1、#region塊必須通過#endregion指令終止。
2、#region塊不能與#if塊重疊。但是,可以將#region塊嵌套在#if塊內,或將#if塊嵌套在#region塊內。
3、#region 不適合在大方法中使用,當在一個方法中使用#region 的時候,可以將這些代碼段獨立成一個函數。
Ⅳ 區域用於存儲什麼
區域用於存儲一個或多個DNS域名信息的資料庫。一個DNS伺服器可以管理多個區域。區域是用於存放網路運行、管理和維護使用位元組的區域。C語言在內存中一共分為內存棧區、內存堆區、常數區等區域。
Ⅵ Region 在C#中的用法
(msdn中有它的用法介紹)
因為區域的坐標是在全局坐標中指定的,所以可對它進行縮放。然而,在繪製表面上,它的內部取決於表示它的像素的大小和形狀。應用程序可以使用若干區域來剪輯繪圖操作的輸出。窗口管理器則使用區域來定義窗口的繪制區域。這些區域被稱為剪輯區域。應用程序還可以在命中檢測的操作中使用區域,例如檢查一個點或矩形是否與某個區域相交。應用程序可通過使用 Brush 對象來填充一個區域。
Ⅶ 資料庫里region是啥意思
#region和#endregion配合使用,用於把代碼折疊起來
比如:
#region 資料庫連接相關
/// <summary>
/// 獲取資料庫聯接對像
/// </summary>
/// <returns>資料庫聯接對像</returns>
public static SqlConnection SqlConn()
{
//從web.config中獲取連接字元串
return new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["connString"]);
}
#endregion
可以折疊為一行:
〔資料庫連接相關〕