我爱编程

Hbase

2017-05-02  本文已影响0人  ic_bbc

预分区

在创建Hbase表的时候默认一张表只有一个region,所有的put操作都会往这一个region中填充数据,当这个一个region过大时就会进行split。如果在创建HBase的时候就进行预分区则会减少当数据量猛增时由于region split带来的资源消耗。
HBase表的预分区需要紧密结合业务场景来选择分区的key值,每个region都有一个startKey和一个endKey来表示该region存储的rowKey范围。
创建包含预分区表的命令如下

> create 't1', 'cf', SPLITS => ['20150501000000000', '20150515000000000', '20150601000000000']
# 或者
> create 't2', 'cf', SPLITS_FILE => '/home/hadoop/splitfile.txt'
/home/hadoop/splitfile.txt中存储内容如下:
20150501000000000
20150515000000000
20150601000000000
# 能够看到四个分区
               startkey                    endkey
region0         -                           20150501000000000
region1         20150501000000000           20150515000000000
region2         20150515000000000           20150601000000000
region3         20150601000000000           -

// region0没有startKey
// region3没有endKey

// 当put的一条数据rowKey值为20150516000000000时则会放入region2中

2. hbase怎么给web前台提供接口来访问?

hbase有一个web的默认端口60010,是提供客户端用来访问hbase的

3. HBase在进行模型设计时重点在什么地方?一张表中定义多少个Column Family最合适?为什么?

具体看表的数据,一般来说划分标准是根据数据访问频度,如一张表里有些列访问相对频繁,而另一些列访问很少,这时可以把这张表划分成两个列族,分开存储,提高访问效率

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

①开启bloomfilter过滤器,开启bloomfilter比没开启要快3、4倍
②Hbase对于内存有特别的嗜好,在硬件允许的情况下配足够多的内存给它
③通过修改hbase-env.sh中的
export HBASE_HEAPSIZE=3000 #这里默认为1000m
④增大RPC数量
通过修改hbase-site.xml中的
hbase.regionserver.handler.count属性,可以适当的放大。默认值为10有点小

5. 直接将时间戳作为行健,在写入单个region 时候会发生热点问题,为什么呢?

HBase的rowkey在底层是HFile存储数据的,以键值对存放到SortedMap中。并且region中的rowkey是有序存储,若时间比较集中。就会存储到一个region中,这样一个region的数据变多,其它的region数据很好,加载数据就会很慢。直到region分裂可以解决。

6. HBase之 HTable线程不安全

在单线程环境下使用hbase的htable是没有问题,但是突然高并发多线程情况下就可能出现问题原因是什么呢?

This class is not thread safe for updates; the underlying write buffer can be corrupted  if multiple threads contend over a single HTable instance.   

从上面我们可以看到每一个HTable的实例化过程都要创建一个新的conf,我们甚至可以认为一个conf对应的是一个HTable的connection,因此如果客户端对于同一个表,每次新new 一个configuration对象的话,那么意味着这两个HTable虽然操作的是同一个table,但是建立的是两条链接connection,它们的socket不是共用的,在多线程的情况下,经常会有new Htable的情况发生,而每一次的new都可能是一个新的connection,而我们知道zk上的链接是有限制的如果链接达到一定阈值的话,那么新建立的链接很有可能挤掉原先的connection,而导致线程不安全。
因此hbase官方文档建议我们:HTable不是线程安全的。建议使用同一个HBaseConfiguration实例来创建HTable实例。这样可以共享ZooKeeper和socket实例。例如,最好这样做:

HBaseConfiguration conf = HBaseConfiguration.create();
HTable table1 = new HTable(conf, "myTable");
HTable table2 = new HTable(conf, "myTable");
// 而不是这样:
HBaseConfiguration conf1 = HBaseConfiguration.create();
HTable table1 = new HTable(conf1, "myTable");
HBaseConfiguration conf2 = HBaseConfiguration.create();
HTable table2 = new HTable(conf2, "myTable");
上一篇下一篇

猜你喜欢

热点阅读