您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關HBase基本知識有哪些的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
HBase 特性:
強一致性讀寫: HBase 不是 "最終一致性(eventually consistent)" 數據存儲. 這讓它很適合高速計數聚合類任務。
自動分片(Automatic sharding): HBase 表通過region分布在集群中。數據增長時,region會自動分割并重新分布。
RegionServer 自動故障轉移
Hadoop/HDFS 集成: HBase 支持本機外HDFS 作為它的分布式文件系統。
MapReduce: HBase 通過MapReduce支持大并發處理, HBase 可以同時做源和目標.
Java 客戶端 API: HBase 支持易于使用的 Java API 進行編程訪問.
Thrift/REST API: HBase 也支持Thrift 和 REST 作為非Java 前端.
Block Cache 和 Bloom Filters: 對于大容量查詢優化, HBase支持 Block Cache 和 Bloom Filters。
運維管理: HBase提供內置網頁用于運維視角和JMX 度量.
HBase不適合所有問題.
首先,確信有足夠多數據,如果有上億或上千億行數據,HBase是很好的備選。 如果只有上千或上百萬行,則用傳統的RDBMS可能是更好的選擇。因為所有數據可以在一兩個節點保存,集群其他節點可能閑置。
其次,確信可以不依賴所有RDBMS的額外特性 (e.g., 列數據類型, 第二索引, 事物,高級查詢語言等.) 一個建立在RDBMS上應用,如不能僅通過改變一個JDBC驅動移植到HBase。相對于移植, 需考慮從RDBMS 到 HBase是一次完全的重新設計。
第三, 確信你有足夠硬件。甚至 HDFS 在小于5個數據節點時,干不好什么事情 (根據如 HDFS 塊復制具有缺省值 3), 還要加上一個 NameNode.
預寫日志 (WAL)
每個RegionServer會將更新(Puts, Deletes) 先記錄到預寫日志中(WAL),然后將其更新在Section 9.7.5, “Store”的Section 9.7.5.1, “MemStore”里面。這樣就保證了HBase的寫的可靠性。如果沒有WAL,當RegionServer宕掉的時候,MemStore還沒有flush,StoreFile還沒有保存,數據就會丟失。HLog 是HBase的一個WAL實現,一個RegionServer有一個HLog實例。
WAL 保存在HDFS 的 /hbase/.logs/ 里面,每個region一個文件。
區域
區域是表獲取和分布的基本元素,由每個列族的一個庫(Store)組成。對象層級圖如下:
Table (HBase table) Region (Regions for the table) Store (Store per ColumnFamily for each Region for the table) MemStore (MemStore for each Store for each Region for the table) StoreFile (StoreFiles for each Store for each Region for the table) Block (Blocks within a StoreFile within a Store for each Region for the table)
Region 大小
Region的大小是一個棘手的問題,需要考量如下幾個因素。
Regions是可用性和分布式的最基本單位
HBase通過將region切分在許多機器上實現分布式。也就是說,你如果有16GB的數據,只分了2個region, 你卻有20臺機器,有18臺就浪費了。
region數目太多就會造成性能下降,現在比以前好多了。但是對于同樣大小的數據,700個region比3000個要好。
region數目太少就會妨礙可擴展性,降低并行能力。有的時候導致壓力不夠分散。這就是為什么,你向一個10節點的HBase集群導入200MB的數據,大部分的節點是idle的。
RegionServer中1個region和10個region索引需要的內存量沒有太多的差別。
最好是使用默認的配置,可以把熱的表配小一點(或者受到split熱點的region把壓力分散到集群中)。如果你的cell的大小比較大(100KB或更大),就可以把region的大小調到1GB。
存儲
一個存儲包含了一個內存存儲(MemStore)和若干個文件存儲(StoreFile--HFile).一個存儲可以定位到一個列族中的一個區.
MemStore MemStores是Store中的內存Store,可以進行修改操作。修改的內容是KeyValues。當flush的是,現有的memstore會生成快照,然后清空。在執行快照的時候,HBase會繼續接收修改操作,保存在memstore外面,直到快照完成。
StoreFile (HFile) 文件存儲是數據存在的地方。
緊縮
有兩種類型的緊縮:次緊縮和主緊縮。minor緊縮通常會將數個小的相鄰的文件合并成一個大的。Minor不會刪除打上刪除標記的數據,也不會刪除過期的數據,Major緊縮會刪除過期的數據。有些時候minor緊縮就會將一個store中的全部文件緊縮,實際上這個時候他本身就是一個major壓?縮。
在執行一個major緊縮之后,一個store只會有一個sotrefile,通常情況下這樣可以提供性能。注意:major緊縮將會將store中的數據全部重寫,在一個負載很大的系統中,這個操作是很傷的。
緊縮 不會 進行分區合并。
批量裝載(Bulk Loading)
概述 HBase 有好幾種方法將數據裝載到表。最直接的方式即可以通過MapReduce任務,也可以通過普通客戶端API。但是這都不是高效方法。
批量裝載特性采用 MapReduce 任務,將表數據輸出為HBase的內部數據格式,然后可以將產生的存儲文件直接裝載到運行的集群中。批量裝載比簡單使用 HBase API 消耗更少的CPU和網絡資源。
批量裝載架構
HBase 批量裝載過程包含兩個主要步驟。
通過MapReduce 任務準備數據 批量裝載第一步,從MapReduce任務通過HFileOutputFormat產生HBase數據文件(StoreFiles) 。輸出數據為HBase的內部數據格式,以便隨后裝載到集群更高效。
為了處理高效, HFileOutputFormat 必須比配置為每個HFile適合在一個分區內。為了做到這一點,輸出將被批量裝載到HBase的任務,使用Hadoop 的TotalOrderPartitioner 類來分開map輸出為分開的鍵空間區間。對應于表內每個分區(region)的鍵空間。
HFileOutputFormat 包含一個方便的函數, configureIncrementalLoad(), 可以基于表當前分區邊界自動設置TotalOrderPartitioner。
完成數據裝載 After the data has been prepared using HFileOutputFormat, it is loaded into the cluster using completebulkload. This command line tool iterates through the prepared data files, and for each one determines the region the file belongs to. It then contacts the appropriate Region Server which adopts the HFile, moving it into its storage directory and making the data available to clients.
If the region boundaries have changed during the course of bulk load preparation, or between the preparation and completion steps, the completebulkloads utility will automatically split the data files into pieces corresponding to the new boundaries. This process is not optimally efficient, so users should take care to minimize the delay between preparing a bulk load and importing it into the cluster, especially if other clients are simultaneously loading data through other means.
表創建: 預創建區域(Region)
默認情況下HBase創建表會新建一個區域。執行批量導入,意味著所有的client會寫入這個區域,直到這個區域足夠大,以至于分裂。一個有效的提高批量導入的性能的方式,是預創建空的區域。最好稍保守一點,因為過多的區域會實實在在的降低性能。
表創建: 延遲log刷寫
Puts的缺省行為使用 Write Ahead Log (WAL),會導致 HLog 編輯立即寫盤。如果采用延遲刷寫,WAL編輯會保留在內存中,直到刷寫周期來臨。好處是集中和異步寫HLog,潛在問題是如果RegionServer退出,沒有刷寫的日志將丟失。但這也比Puts時不使用WAL安全多了。
延遲log刷寫可以通過 HTableDescriptor 在表上設置,hbase.regionserver.optionallogflushinterval缺省值是1000ms.
HBase 客戶端: 自動刷寫
當你進行大量的Put的時候,要確認你的HTable的setAutoFlush是關閉著的。否則的話,每執行一個Put就要想區域服務器發一個請求。通過 htable.add(Put) 和 htable.add( <List> Put)來將Put添加到寫緩沖中。如果 autoFlush = false,要等到寫緩沖都填滿的時候才會發起請求。要想顯式的發起請求,可以調用flushCommits。在HTable實例上進行的close操作也會發起flushCommits
HBase 客戶端: 在Puts上關閉WAL
一個經常討論的在Puts上增加吞吐量的選項是調用 writeToWAL(false)。關閉它意味著 RegionServer 不再將 Put 寫到 Write Ahead Log, 僅寫到內存。然而后果是如果出現 RegionServer 失敗,將導致數據丟失。如果調用 writeToWAL(false) ,需保持高度警惕。你會發現實際上基本沒有不同,如果你的負載很好的分布到集群中。
通常而言,最好對Puts使用WAL, 而增加負載吞吐量與使用 bulk loading 替代技術有關。
從HBase讀
Scan 緩存 如果HBase的輸入源是一個MapReduce Job,要確保輸入的Scan的setCaching值要比默認值0要大。使用默認值就意味著map-task每一行都會去請求一下region-server。可以把這個值設為500,這樣就可以一次傳輸500行。當然這也是需要權衡的,過大的值會同時消耗客戶端和服務端很大的內存,不是越大越好。
Scan 屬性選擇
當Scan用來處理大量的行的時候(尤其是作為MapReduce的輸入),要注意的是選擇了什么字段。如果調用了 scan.addFamily,這個列族的所有屬性都會返回。如果只是想過濾其中的一小部分,就指定那幾個column,否則就會造成很大浪費,影響性能。
關閉 ResultScanners
這與其說是提高性能,倒不如說是避免發生性能問題。如果你忘記了關閉ResultScanners,會導致RegionServer出現問題。所以一定要把ResultScanner包含在try/catch 塊中...
Scan scan = new Scan(); // set attrs... ResultScanner rs = htable.getScanner(scan); try { for (Result r = rs.next(); r != null; r = rs.next()) { // process result... } finally { rs.close(); // always close the ResultScanner! } htable.close();
感謝各位的閱讀!關于“HBase基本知識有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。