您的位置:首页 > 职场人生

大数据面试题知识点分析(三)

2018-01-23 18:06 274 查看

为了保证效率和质量,每篇文章发布6个知识点,由简单及难,下面我们开始Hbase:



1)介绍一下 hbase 过滤器。

HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行键,列明,时间戳定位)。通常来说,通过行键,值来筛选数据的应用场景较多。


2)简述一下 HBase 数据库架构组成部分。

HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog等。

3)怎么实现 hbase 的预分区。

首先就是要想明白数据的key是如何分布的,然后规划一下要分成多少region,每个region的startkey和endkey是多少,然后将规划的key写到一个文件中。比如,key的前几位字符串都是从0001~0010的数字,这样可以分成10个region。

hbase shell中建分区表,指定分区文件:

create 'split_table_test', 'cf', {SPLITS_FILE => 'region_split_info.txt'}


4)Hbase
设计表的时候 rowkey 和分区考虑哪个?还是都考虑?

Hbase默认建表时有一个region,这个region的rowkey是没有边界的,即没有startkey和endkey,在数据写入时,所有数据都会写入这个默认的region,随着数据量的不断 增加,此region已经不能承受不断增长的数据量,会进行split,分成2个region。在此过程中,会产生两个问题:1.数据往一个region上写,会有写热点问题。2.region
split会消耗宝贵的集群I/O资源。基于此我们可以控制在建表的时候,创建多个空region,并确定每个region的起始和终止rowky,这样只要我们的rowkey设计能均匀的命中各个region,就不会存在写热点问题。自然split的几率也会大大降低。当然随着数据量的不断增长,该split的还是要进行split。

5)Hbase 过滤器实现原则。

 采用bloomfilter进行过滤,Bloom Filter是一种空间效率很高的随机数据结构

(1)BLOOMFILTER在HBase的作用

HBase利用 BLOOMFILTER来提供随机读(GET)的性能,对于顺序读(Scan),设置BLOOMFILTER是没有作用的。

(2)BLOOMFILTER在HBase的开销

BLOOMFILTER是一个列族级别的配置,如果你表中设置了BLOOMFILTER,那么HBase在生成StoreFile时候包含一份BLOOMFILTER的结构数据,称为MetaBlock;开启BLOOMFILTER会有一定的存储以及内存的开销。

(3)BLOOMFILTER如何提供随机读(GET)的性能

对于某个region的随机读,HBase会遍历读memstore及storefile(按照一定的顺序),将结果合并返回给客户端。如果你设置了bloomfilter,那么在遍历读storefile时,就可以利用bloomfilter,忽略某些storefile。

(4)Region的StoreFile数目越多,BLOOMFILTER效果越好。

(5)Region下的storefile数目越少,HBase读性能越好。

6)如何提高
HBase 客户端的读写性能?请举例说明。

(1)开启bloomfilter过滤器,开启bloomfilter比没开启要快3、4倍。

(2)hbase对于内存有特别的嗜好,在硬件允许的情况下配足够多的内存给它通过修改hbase-env.sh中的:

export HBASE_HEAPSIZE=3000 #这里默认为1000m

(3)修改Java虚拟机属性

替换掉默认的垃圾回收器,因为默认的垃圾回收器在多线程环境下会有更多的wait等待:  

export HBASE_OPTS="-server -XX:NewSize=6m -XX:MaxNewSize=6m -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode"

(4)增大RPC数量

通过修改hbase-site.xml中的hbase.regionserver.handler.count属性,可以适当的放大。默认值为10有点小。

(5)做程序开发需要注意的地方

//需要判断所求的数据行是否存在时,尽量不要用下面这个方法
HTable.exists(final byte [] row)
//而用带列族的方法替代,比如:
HTable.exists(final byte [] row, final byte[]column)
//判断所求的数据是否存在不要使用
HTable.get(final byte [] row, final byte []column) == null
//而应该用下面的方法替代:
HTable.exists(final byte [] row, final byte[] column)


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息