1.HBase如何保证读的高效?
缓存
* HBase 有两块主要的内存缓存,MemStore 和 BlockCache。 * 一个查询过来 RegionServer 后,首先用 MemStoreScanner 搜索 MemStore 里是否有所查的 rowKey ,这一步在内存中,所以是很快的。 * 如果不在 memstore 中,会经过一系列的索引寻址定位到 Block 的位置。如果 Block 在 BlockCache 缓存中则可以直接在内存中操作,速度很快,不需要再进行一次 IO 将整个 Block 读取到内存中。
过滤
* RegionServer 启动的时候就会把每个 HFile 的起止 Rowkey 加载到内存中,在定位 HFile 的时候可以过滤掉大部分 HFile * 加载到内存中的Bloom Block也会通过BloomFilte也会过滤掉大部分一定不包含所查RowKey的HFile。
索引
* 经过了上面的过滤,其实只剩下很少一部分的 HFile 需要去检索了,HBase 有三级索引,第一级索引会常驻内存,二三级的索引会以 Block 的形式存在 HFile 中。 * 另外因为 HBase 是多版本共存的,所以结果可能是会有多个的,因此检索的过程不是找到一个就返回了,而是要找到所有的,然后将结果合并。
2.HBase 如何保证数据的强一致性?
HBase 是牺牲了数据的部分可用性来保证它的数据强一致性的,即CAP原理中舍弃了一部分的可用性,HBase 是个 CP系统。
* HBase 中每一条数据只会出现在一个 Region,它的数据冗余备份不是在 Region 这个层面做的,还是依赖 HDFS 来做的冗余。而且同一时间一个 Region 只会被分配给一个 RegionServer,这就保证了系统中只会有一条可以使用的数据。HBase 支持行级事物,即一个 put 操作要么成功,要么失败。
* 另外当有 RegionServer 宕机的时候,Region 会被分配到其他的 RegionServer 上,同时重写 WAL Log,这个过程中整个 Region 中的数据是不可用的,因为它是缺失的。如果可用性强的话那么必定会有数据不一致的问题(即写入过的数据查询不到),所以这里用可用性来换取了强一致性,等到 WAL 写完,保证了数据完整性之后,才可重新访问。
更多关于“大数据培训”的问题,欢迎咨询千锋教育在线名师。千锋教育多年办学,课程大纲紧跟企业需求,更科学更严谨,每年培养泛IT人才近2万人。不论你是零基础还是想提升,都可以找到适合的班型,千锋教育随时欢迎你来试听。