Hbase

作者: ic_bbc | 来源:发表于2017-05-02 11:31 被阅读0次

    预分区

    在创建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");
    

    相关文章

      网友评论

        本文标题:Hbase

        本文链接:https://www.haomeiwen.com/subject/cojctxtx.html