Hbase读数据: client->zookeeper->.ROOT->.META-> 用户数据表zookeeper记录了.ROOT的路径信息(root只有一个region),.ROOT里记录了.META的region信息, (.META可能有多个region),.META里面记录了region的信息。
补充1: 在 HBase中,所有的存储文件都被划分成了若干个小存储块,这些小存储块在get或scan操作时会加载到内存中,他们类似于RDBMS中的存储单元页。 这个参数的默认大小是64K。通过以上方式设置:void setBlocksize(int s);(HBase中Hfile的默认大小就是64K跟 HDFS的块是64M没关系)HBase顺序地读取一个数据块到内存缓存中,其读取相邻的数据时就可以再内存中读取而不需要从磁盘中再次读取,有效地减少 了磁盘I/O的次数。这个参数默认为TRUE,这意味着每次读取的块都会缓存到内存中。但是,如果用户顺序读取某个特定的列族,最好将这个属性设置为 FALSE,从而禁止使用缓存快。上面这样描述的原因:如果我们访问特定的列族,但是我们还是启用了这个功能,这个时候我们的机制会把我们其它不需要的列 族的数据也加载到了内存中,增加了我们的负担,我们使用的条件是,我们获取相邻数据。 void setBlockCacheEnabled(boolean blockCacheEnable);
补充2: 1:禁止自动刷写。 我们有大批数据要插入时,如果我们没有禁止,Put实例会被逐个的传送到regio服务器 ,如果用户禁止了自动刷写的功能,put操作会在写缓冲区被填满时才会被送出。 2:使用扫描缓存。 如果HBase被用作一个mapreduce作业的输入源,请最好将作为mapreduce作业输入扫描 器实例的缓存用setCaching()方法设置为比默认值1更大的数。使用默认值意味着map 任务会在处理每条记录时都请求region服务器。不过,这个值要是500的话,则一次 可传送500条数据到客户端进行处理,当然了这数据也是根据你的情况定的。 这个是行级的,在我们的119页有说明。 3:限定扫描范围。 这个是很好理解的,比如我们要处理大量行(特别是作为mapreduce的输入源),其中 用到scan的时候我们有Scan.addFamily();的方法,这个时候我们如果只是需要到 这个列族中的几个列,那么我们一定要精确。因为过多的列会导致效率的损失。 4:关闭resultScanner 当然了这个不能提高我们的效率,但是如果没关就会对效率有影响。 5:块缓存的用法 首先我们的块缓存是通过Scan.setCacheBolcks();的启动的,那些被频繁访问的行 我们应该使用缓存块,但是mapreduce作业使用扫描大量的行,我们就不该使用这个 了。(这个块缓存跟我在第四节中提到的那个块是不一样的)。 6:优化获取行健的方式 当然用这个的前提是,我们只需要表中的行健时,才能用。那么怎么用在411页有说明。 7:关闭Put上的WAL 书上是这么说,但是我个人觉得这个功能还是不用的好,因为我们关闭了这个功能, 服务器就不会把put写入到WAL,而是直接写到memstore里,这样一旦服务器出现故障 我们的数据就丢失了。
更多:
优化hbase的查询提升读写速率优化案例及性能提升的几种方法 http://www.aboutyun.com/forum.php?mod=viewthread&tid=7468
|