hbase 学习笔记一---基本概念(一)

2014-11-24 11:17:00 · 作者: · 浏览: 1
说在前面,本文部分内容来源于社区官网经过适度翻译,部分根据经验总结,部分是抄袭网络博文,(不一一列举引用,在此致歉)一并列在一起,本文的目的,希望能总结出一些有用的,应该注意到的东西,基本思路是先提出一个话题,在此话题内,把相关联的东西加进去,而不是单独分出章节单独介绍,虽然条理性欠差,但有利于后期根据关键词查找。
Apache HBase 是Hadoop database的简称,hbase 是一个分布式,可扩展的,面向大数据存储的 数据库
HBase 基本概念
1、region
region 是部分数据,所以是所有数据的一个自己,但region包括完整的行,所以region 是行为单位 表的一个子集。
每个region 有三个主要要素:
它所属于哪张表
它所包含的的第一行(第一个region 没有首行)
他所包含的最后一行(末一个region 没有末行)
当表初写数据时,此时表只有一个region ,当随着数据的增多,region 开始变大,等到它达到限定的阀值大小时,变化把region 分裂为两个大小基本相同的region,
而这个阀值就是storefile 的设定大小(参数:hbase.hregion.max.filesize 新版本默认10G) ,在第一次分裂region之前,所有加载的数据都放在原始区域的那台服务器上,随着表的变大
region 的个数也会相应的增加,而region 是Hbase集群分布数据的最小单位。
(但region 也是由block组成,具体这个block和hdfs block什么样的关系后面再说,region是属于单一的regionserver,除非这个regionserver 宕机,或者其它方式挂掉,再或者执行balance时,才可能会将这部分region的信息转移到其它机器上。)
* 这也就是 为什么region比较少的时候,导致region分配不均,总是分派到少数的节点上,读写并发效果不显著,这就是hbase 读写效率比较低的原因。
2、加锁
HBase的锁 是行锁,无论对行进行访问的事物有多少列,那对此行的更新都会是原子操作,要么成功,要么失败,不会存在部分成功的情况。这就说明,如果只更新一个行1000个列
中的一个列,那也会对正行加锁。
3、Hbase元数据表
HBase内部维护着两个元数据表,分别是-ROOT- 和 .META. 表 他们分别维护者当前集群所有region 的列表、状态和位置。-ROOT-表包含.META.表的region 列表,因为.META.
表可能会因为超过region的大小而进行分裂,所以-ROOT-才会保存.META.表的region索引,-ROOT-表是不会分裂的。而.META. 表中则包含所有用户region(user-space region)
的列表。表中的项使用region 名作为键。region名由所属的表名、region的起始行、创建的时间 以及对其整体进行 MD5 hash值。
比如:
award_week_2013,201311:170100626,1371697714559.f7f37b98c01f68b7b5cc6c1c3734a666
|--表名-------------|-----起始行---------|--创建时间戳---|----整体进行MD5 hash 值------------|
由此我们联想到 表scan 的过程中如果加了 STARTROW 和 ENDROW 的属性后,查找是很迅速的,就是因为根据给定rowkey从.META.表中 找到所在的region,然后再从
region去查找。
这个表的值什么时候会变化?
当region 进行split、disable、enable、drop或者 balance 导致region重新分配 或者由于regionserver 挂掉而导致重新分配region时,.META.表的数据会进行及时的更新,
这样才能保证根据meta访问到的表是存在的。
4、访问流程
客户端client 首先连接到ZooKeeper 这是就要先查找-ROOT-的位置。
然后client通过-ROOT- 获取所请求行所在范围 所属的.META.region的位置。
client接着查找.META.region来获取user-space region 所在的节点和位置。
接着client 就可以直接和管理者那个region的RegionServer 进行交互。
注:
每个行操作可能要访问三次远程节点,为了节省这些代价,client会缓存他们遍历-ROOT-和.META. 的位置以及user-space region的开始行和结束行,这样每次访问就不
会再从表中去查询了,但如果变动了怎么办?却是存在这个问题,这样的话client 会出现错误,那此时region毫无疑问是移动了,这时,client 会再次从.META.查找region 的
新位置并再次将其放入到缓存中去,周而复始。同样道理如果.META.的region移动了,client 也才会去-ROOT-表查询.META.region的新位置。
不过由于hbase 设计的问题,所以在MapReduce过程中如果用到hbase时,访问缓存中的region就会出现错误,出现错误后,缓存更新,task再次尝试就能正确通过
下面是我们常遇到的bug:
2013-09-24 01:26:15,487 ERROR org.apache.hadoop.hbase.regionserver.HRegionServer:
Closing scanner for tmp_toplist_gold_total_1001,,1379956828778.4a8e5f51eafc48aed247913c715a8cc1.
org.apache.hadoop.hbase.NotServingRegionException: Region is not online: tmp_toplist_gold_total_1001,,1379956828778.4a8e5f51eafc48aed247913c715a8cc1.
基于这种情况会时常发生, 建议不要让task 尝试的次数改为1,这样会导致很多job fail
这两个参数分别是:
mapred.map.max.attempts map 任务最大尝试次数 默认是4
mapred.reduce.max.attempts reduce 任务最大尝试次数 默认是4
5、Zookeeper的作用
Zookeeper简单说就是协调和服务于分布式应用程序的服务。
Zookeeper Quorum 中除