1)hbase表查行
可以在shell中进行,命令如下:
count ’tablename’,CACHE=>10000,INTERVAL=>10000
CACHE是客户端缓存条数,INTERVAL是分隔多久显示一次结果
上述方法实现是走scan客户端完成,一旦表较大,查起来很慢。
另外一种方式如下:
bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter ’tablename’
通过yarn调度mr任务完成查行,速度较快。
2)客户端连接hbase集群时,与zookeeper建立起连接,需要加载两个配置,一个是zookeeper的ip地址,还有是hbase在zookeeper上的根节点。
客户端从zookeeper中获得meta表的地址,然后从meta表中获取表的region在regionserver间的分布,至于数据读写请求则直接发往数据所在的regionserver。
hbase的client端会与zookeeper保持一个长连接,并在其上注册一个watcher,用于检测hbase集群可能发生的变化,包括meta表位置的变化,regionserver的上下线以及region分布的变化等等
3)hbase的bulkload
bulkload是高负载hbase的一种常见的优化方式,简单来说就是先写hdfs文件,然后直接装载到hbase集群,这种数据写入方式不走client端的rpc通信,可以极大地节省集群的I/O
形式上类似于solr的全量创建索引,线下搞定,然后线上只是装载
4)blockcache的大小
当前blockcache的大小可以从regionserver页的block cache信息栏查看到。
调整参数
hfile.block.cache.size可以修改block cache的大小,默认是0.4,表示使用整个堆大小(hbase-env.sh中配置的-Xmx)的40%作为block cache,当内存紧张时可以考虑调小此值,但是不推荐。
hbase的blockcache机制是采用LRUBlockCache实现的。
5)hbase的IN_MEMORY属性
hbase在LRU缓存基础之上采用了分层设计,整个blockcache分成了三个部分,分别是single、multi和inMemory。三者区别如下:
single:如果一个block第一次被访问,放在该优先队列中;
multi:如果一个block被多次访问,则从single队列转移到multi队列
inMemory:优先级最高,常驻cache,因此一般只有hbase系统的元数据,如meta表之类的才会放到inMemory队列中。普通的hbase列族也可以指定IN_MEMORY属性,方法如下:
create 'table', {NAME => 'f', IN_MEMORY => true}