赞
踩
一.HBase概况
HBase是一个构建在HDFS上的分布式列存储系统;
HBase是基于Google BigTable模型开发的,典型的key/value系统;
HBase是Apache Hadoop生态系统中的重要一员,主要用于海量结构化数据存储;
从逻辑上讲,HBase将数据按照表、行和列进行存储。
与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。
Hbase表的特点
大:一个表可以有数十亿行,上百万列;
无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
面向列:面向列(族)的存储和权限控制,列(族)独立检索;
稀疏:空(null)列并不占用存储空间,表可以设计的非常稀疏;
数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳;
数据类型单一:Hbase中的数据都是字符串,没有类型。
和传统数据库对比:
1、传统数据库遇到的问题:
1)数据量很大的时候无法存储;
2)没有很好的备份机制;
3)数据达到一定数量开始缓慢,很大的话基本无法支撑;
2、HBASE优势:
1)线性扩展,随着数据量增多可以通过节点扩展进行支撑;
2)数据存储在hdfs上,备份机制健全;
3)通过zookeeper协调查找数据,访问速度快。
HBase逻辑视图:
•表:HBase采用表来组织数据,表由行和列组成,列划分为若干个列族
•行:每个HBase表都由若干行组成,每个行由行键(row key)来标识。
•列族:一个HBase表被分组成许多“列族”(Column Family)的集合,它是基本的访问控制单元
•列限定符:列族里的数据通过列限定符(或列)来定位
•单元格:在HBase表中,通过行、列族和列限定符确定一个“单元格”(cell),单元格中存储的数据没有数据类型,总被视为字节数组byte[]
•时间戳:每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索引
二.HBase原理
Client:
使用HBase RPC机制与HMaster和HRegionServer进行通信
Client与HMaster进行管理类操作
Client与HRegionServer进行数据读写类操作
Zookeeper:
Zookeeper Quorum存储-ROOT-表地址、HMaster地址
HRegionServer把自己以Ephedral方式注册到Zookeeper中,HMaster随时感知各个HRegionServer的健康状况
Zookeeper避免HMaster单点问
HMaster:
HMaster没有单点问题,HBase可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master在运行
主要负责Table和Region的管理工作:
1. 管理用户对表的增删改查操作
2. 管理HRegionServer的负载均衡,调整Region分布
3. Region Split后,负责新Region的分布
4. 在HRegionServer停机后,负责失效HRegionServer上Region迁移
HRegionServer:
HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写
HStore:
HBase存储的核心。由MemStore和StoreFile组成。MemStore是Stored Memory Buffer。
HLog:
引入HLog原因:在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况。
•主服务器Master负责管理和维护HBase表的分区信息,维护Region服务器列表,分配Region,负载均衡
•Region服务器负责存储和维护分配给自己的Region,处理来自客户端的读写请求
•客户端并不是直接从Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据
•客户端并不依赖Master,而是通过Zookeeper来获得Region位置信息,大多数客户端甚至从来不和Master通信,这种设计方式使得Master负载很小
三.HBase的功能组件
•HBase的实现包括三个主要的功能组件:
–(1)库函数:链接到每个客户端
–(2)一个Master主服务器
–(3)许多个Region服务器
•主服务器Master负责管理和维护HBase表的分区信息,维护Region服务器列表,分配Region,负载均衡
•Region服务器负责存储和维护分配给自己的Region,处理来自客户端的读写请求
•客户端并不是直接从Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据
•客户端并不依赖Master,而是通过Zookeeper来获得Region位置信息,大多数客户端甚至从来不和Master通信,这种设计方式使得Master负载很小
•开始只有一个Region,后来不断分裂(如下图)
•Region拆分操作非常快,接近瞬间,因为拆分之后的Region读取的仍然是原存储文件,直到“合并”过程把存储文件异步地写到独立的文件之后,才会读取新文件
•元数据表,又名.META.表,存储了Region和Region服务器的映射关系
•当HBase表很大时, .META.表也会被分裂成多个Region
•根数据表,又名-ROOT-表,记录所有元数据的具体位置
•-ROOT-表只有唯一一个Region,名字是在程序中被写死的
•Zookeeper文件记录了-ROOT-表的位置
层次 | 名称 | 作用 |
第一层 | Zookeeper文件 | 记录了-ROOT-表的位置信息 |
第二层 | -ROOT-表 | 记录了.META.表的Region位置信息 -ROOT-表只能有一个Region。通过-ROOT-表,就可以访问.META.表中的数据 |
第三层 | .META.表 | 记录了用户数据表的Region位置信息,.META.表可以有多个Region,保存了HBase中所有用户数据表的Region位置信息 |
•为了加快访问速度,.META.表的全部Region都会被保存在内存中
•假设.META.表的每行(一个映射条目)在内存中大约占用1KB,并且每个Region限制为128MB,那么,上面的三层结构可以保存的用户数据表的Region数目的计算方法是:
•(-ROOT-表能够寻址的.META.表的Region个数)×(每个.META.表的 Region可以寻址的用户数据表的Region个数)
•一个-ROOT-表最多只能有一个Region,也就是最多只能有128MB,按照每行(一个映射条目)占用1KB内存计算,128MB空间可以容纳128MB/1KB=217行,也就是说,一个-ROOT-表可以寻址217个.META.表的Region。
•同理,每个.META.表的 Region可以寻址的用户数据表的Region个数是128MB/1KB=217。
•最终,三层结构可以保存的Region数目是(128MB/1KB) × (128MB/1KB) = 234个Region
客户端访问数据时的“三级寻址”
•为了加速寻址,客户端会缓存位置信息,同时,需要解决缓存失效问题
•寻址过程客户端只需要询问Zookeeper服务器,不需要连接Master服务器
四.HBASE系统构架
•1. 客户端
–客户端包含访问HBase的接口,同时在缓存中维护着已经访问过的Region位置信息,用来加快后续数据访问过程
•2. Zookeeper服务器
–Zookeeper可以帮助选举出一个Master作为集群的总管,并保证在任何时刻总有唯一一个Master在运行,这就避免了Master的“单点失效”问题
•3. Master
•主服务器Master主要负责表和Region的管理工作:
–管理用户对表的增加、删除、修改、查询等操作
–实现不同Region服务器之间的负载均衡
–在Region分裂或合并后,负责重新调整Region的分布
–对发生故障失效的Region服务器上的Region进行迁移
•4. Region服务器
–Region服务器是HBase中最核心的模块,负责维护分配给自己的Region,并响应用户的读写请求
四.Region服务器机制
图中 Region服务器向HDFS文件系统中读写数据
1. 用户读写数据过程
•用户写入数据时,被分配到相应Region服务器去执行
•用户数据首先被写入到MemStore和Hlog中
•只有当操作写入Hlog之后,commit()调用才会将其返回给客户端
•当用户读取数据时,Region服务器会首先访问MemStore缓存,如果找不到,再去磁盘上面的StoreFile中寻找
2. 缓存的刷新
•系统会周期性地把MemStore缓存里的内容刷写到磁盘的StoreFile文件中,清空缓存,并在Hlog里面写入一个标记
•每次刷写都生成一个新的StoreFile文件,因此,每个Store包含多个StoreFile文件
•每个Region服务器都有一个自己的HLog 文件,每次启动都检查该文件,确认最近一次执行缓存刷新操作之后是否发生新的写入操作;如果发现更新,则先写入MemStore,再刷写到StoreFile,最后删除旧的Hlog文件,开始为用户提供服务
3. StoreFile的合并
•每次刷写都生成一个新的StoreFile,数量太多,影响查找速度
•调用Store.compact()把多个合并成一个
•合并操作比较耗费资源,只有数量达到一个阈值才启动合并
•Store是Region服务器的核心
•多个StoreFile合并成一个
•单个StoreFile过大时,又触发分裂操作,1个父Region被分裂成两个子Region
五.安装和配置Hbase
解压安装包hbase-1.1.2-bin.tar.gz至路径 /usr/local:
sudo tar -zxf ~/下载/hbase-1.1.2-bin.tar.gz -C /usr/local
将解压的文件名hbase-1.1.2改为hbase:
sudo mv /usr/local/hbase-1.1.2 /usr/local/hbase
- 编辑~/.bashrc文件
- vi ~/.bashrc
- 如果没有引入过PATH在~/.bashrc文件尾行添加如下内容:
- export PATH=$PATH:/usr/local/hbase/bin
- 编辑完成后,再执行source命令使上述配置在当前终端立即生效,命令如下:
- source ~/.bashrc
- 添加HBase权限
- cd /usr/local
- sudo chown -R hadoop ./hbase #将hbase下的所有文件的所有者改为hadoop,hadoop是当前用户的用户名。
HBase安装时有三种模式:单机模式、伪分布式模式和分布式模式。部署比较复杂 ,网上教程多,我是用伪分布式部署的
四.创建Hbase
先启动hadoop
- cd /usr/local/hadoop
- ./sbin/start-all.sh
输入jps命令查看是否启动成功:
jps
如果少了以下其中一个进程,说明启动失败。
- 2375 SecondaryNameNode
- 2169 DataNode
- 2667 NodeManager
- 2972 Jps
- 2045 NameNode
- 2541 ResourceManager
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。