1.HBase如何保證讀的高效?
緩存
* HBase 有兩塊主要的內(nèi)存緩存,MemStore 和 BlockCache。 * 一個查詢過來 RegionServer 后,首先用 MemStoreScanner 搜索 MemStore 里是否有所查的 rowKey ,這一步在內(nèi)存中,所以是很快的。 * 如果不在 memstore 中,會經(jīng)過一系列的索引尋址定位到 Block 的位置。如果 Block 在 BlockCache 緩存中則可以直接在內(nèi)存中操作,速度很快,不需要再進行一次 IO 將整個 Block 讀取到內(nèi)存中。
過濾
* RegionServer 啟動的時候就會把每個 HFile 的起止 Rowkey 加載到內(nèi)存中,在定位 HFile 的時候可以過濾掉大部分 HFile * 加載到內(nèi)存中的Bloom Block也會通過BloomFilte也會過濾掉大部分一定不包含所查RowKey的HFile。
索引
* 經(jīng)過了上面的過濾,其實只剩下很少一部分的 HFile 需要去檢索了,HBase 有三級索引,第一級索引會常駐內(nèi)存,二三級的索引會以 Block 的形式存在 HFile 中。 * 另外因為 HBase 是多版本共存的,所以結果可能是會有多個的,因此檢索的過程不是找到一個就返回了,而是要找到所有的,然后將結果合并。
2.HBase 如何保證數(shù)據(jù)的強一致性?
HBase 是犧牲了數(shù)據(jù)的部分可用性來保證它的數(shù)據(jù)強一致性的,即CAP原理中舍棄了一部分的可用性,HBase 是個 CP系統(tǒng)。
* HBase 中每一條數(shù)據(jù)只會出現(xiàn)在一個 Region,它的數(shù)據(jù)冗余備份不是在 Region 這個層面做的,還是依賴 HDFS 來做的冗余。而且同一時間一個 Region 只會被分配給一個 RegionServer,這就保證了系統(tǒng)中只會有一條可以使用的數(shù)據(jù)。HBase 支持行級事物,即一個 put 操作要么成功,要么失敗。
* 另外當有 RegionServer 宕機的時候,Region 會被分配到其他的 RegionServer 上,同時重寫 WAL Log,這個過程中整個 Region 中的數(shù)據(jù)是不可用的,因為它是缺失的。如果可用性強的話那么必定會有數(shù)據(jù)不一致的問題(即寫入過的數(shù)據(jù)查詢不到),所以這里用可用性來換取了強一致性,等到 WAL 寫完,保證了數(shù)據(jù)完整性之后,才可重新訪問。
更多關于“大數(shù)據(jù)培訓”的問題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學,課程大綱緊跟企業(yè)需求,更科學更嚴謹,每年培養(yǎng)泛IT人才近2萬人。不論你是零基礎還是想提升,都可以找到適合的班型,千鋒教育隨時歡迎你來試聽。