Hbase入门简介
HBase是一个分布式的、面向列的开源数据库,该技术来源于 FayChang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
Hbase数据表基本概念介绍
1. 行键Row Key:主键是用来检索记录的主键,访问hbasetable中的行。
2. 列族Column Family:Table在水平方向有一个或者多个ColumnFamily组成,一个ColumnFamily中可以由任意多个Column组成,即ColumnFamily支持动态扩展,无需预先定义Column的数量以及类型,所有Column均以二进制格式存储,用户需要自行进行类型转换。
3. 列column:由Hbase中的列族ColumnFamily + 列的名称(cell)组成列。
4. 单元格cell:HBase中通过row和columns确定的为一个存贮单元称为cell。
5. 版本version:每个 cell都保存着同一份数据的多个版本。版本通过时间戳来索引。
6. Hbase数据表结构:
Hbase体系结构
Client
HBase Client使用HBase的RPC机制与HMaster和HRegion Server进行通信,对于管理类操作,Client与HMaster进行RPC;对于数据读写类操作,Client与HRegionServer进行RPC。Zookeeper
Zookeeper Quorum中除了存储了-ROOT-表的地址和HMaster的地址,HRegionServer会把自己以Ephemeral方式注册到Zookeeper中,使得HMaster可以随时感知到各个HRegionServer的健康状态。此外,Zookeeper也避免了HMaster的单点问题。HMaster
每台HRegionServer都会与HMaster进行通信,HMaster的主要任务就是要告诉每台HRegion Server它要维护哪些HRegion。
当一台新的HRegionServer登录到HMaster时,HMaster会告诉它等待分配数据。而当一台HRegion死机时,HMaster会把它负责的HRegion标记为未分配,然后再把它们分配到其他的HRegion Server中。
HBase已经解决了HMaster单点故障问题(SPFO),并且HBase中可以启动多个HMaster,那么它就能够通过Zookeeper来保证系统中总有一个Master在运行。HMaster在功能上主要负责Table和Region的管理工作,具体包括:
(1)管理用户对Table的增删改查操作
(2)管理HRegionServer的负载均衡,调整Region分布
(3)在Region Split后,负责新Region的分配
(4)在HRegionServer停机后,负责失效HRegionServer上的Region迁移HRegion
当表的大小超过设置值得时候,HBase会自动地将表划分为不同的区域,每个区域包含所有行的一个子集。对用户来说,每个表是一堆数据的集合,靠主键来区分。从物理上来说,一张表被拆分成了多块,每一块就是一个HRegion。我们用表名+开始/结束主键来区分每一个HRegion,一个HRegion会保存一个表里面某段连续的数据,从开始主键到结束主键,一张完整的表格是保存在多个HRegion上面。HRegionServer
所有的数据库数据一般都是保存在Hadoop分布式文件系统上面的,用户通过一系列HRegion服务器获取这些数据,一台机器上面一般只运行一个HRegionServer,且每一个区段的HRegion也只会被一个HRegion服务器维护.
HRegion Server主要负责响应用户的IO请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个Region,HRegion中由多个HStore组成。每个HStore对应了Table中的一个Column Family的存储,可以看出每个ColumnFamily其实就是一个集中的存储单元,因此最好将具备共同IO特性的column放在一个Column Family中,这样最高效。
HStore存储时HBas存储的核心了,其中由两部分组成,一部分是MemStore,一部分是StoreFiles。MemStore是Sorted Memory Buffer,用户写入数据首先会放入MemStore,当MemStore满了以后会flush成一个StoreFile(底层是HFile),当StoreFile文件数增长到一定阈值,会触发Compact合并操作,将多个StoreFile合并成一个StoreFile,合并过程中会进行版本合并和数据删除,因此可以看出HBase其实只有增加数据,所有的更新和删除操作都是后续的compact过程中进行的,这使得用户的写操作只要进入内存中就可以立刻返回,保证了HBase IO的高性能。当StoreFiles Compact后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一定的阈值后,会触发Split操作,同时,会把当前的Region Split成2个Region,父Region会下线,新Split出的2个孩子Region会被HMaster分配到响应的HRegion Server上,使得原先1个Region的压力得以分流道2个Region上。HBase存储格式
HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,包括上述提到的两种文件类型:
(1)HFile HBase中的KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级的包装,即StoreFile底层就是HFile。
(2)HLogFile,HBase中WAL(Write Ahead Log)的存储格式,物理上是Hadoop的Sequence FileROOT表和META表
用户表的Regions元数据被存储在.META.表中,随着Region的增多,.META.表中的数据也会增大,并分裂成多个Regions。为了定位.META.表中各个Regions的位置,把.META.表中的所有Regions的元数据保存在-ROOT-表中,最后由Zookeeper记录-ROOT-表的位置信息。所有客户端访问用户数据前,需要首先访问Zookeeper获得-ROOT-的位置,然后方位-ROOT-表获得.META.表的位置,最后根据.META.表中的信息确定用户数据存放的位置,-ROOT-表永远不会被分割,它只有一个Region,这样可以保证最多需要三次跳转就可以定位任意一个Region。为了加快访问速度,.META.表的Regions全部保存在内存中,如果.META.表中的每一行在内存中占大约1KB,且每个Region限制为128M,下图中的三层结构可以保存Regions的数目为(128M/1KB)*(128/1KB)=2^34个。
Hbase安装
HBase的安装也有三种模式:单机模式、伪分布模式和完全分布式模式,今天我们来介绍单节点分布式模式的安装过程。前提是Hadoop集群已经安装完毕,并能正确运行。
硬件环境:CentOS 6.5 服务器
软件环境:Java 1.7.0_45、hadoop-2.2、hbase-0.94.20。
1. Hbase下载
下载安装包,解压到合适位置,并将权限分配给hadoop用户(运行hadoop的账户),将其解压到/usr/local下并重命名为hbase:sudo cp hbase-0.94.20.tar.gz /usr/local sudo tar -zxf hbase-0.94.20.tar.gz sudo mv hbase-0.94.20 hbase sudo chown -R hadoop:hadoop hbase
2. 配置相关文件
(1) 配置hbase-env.sh,该文件在/usr/local/hbase/conf 设置以下值:
export JAVA_HOME=/usr/local/java/jdk1.6.0_27 #Java安装路径 export HBASE_CLASSPATH=/usr/local/hadoop/conf #HBase使用Hadoop文件路径的配置文件 export HBASE_MANAGES_ZK=true #由HBase负责启动和关闭Zookeeper
(2) 配置hbase-site.xml,该文件位于/usr/local/hbase/conf
<property> <name>hbase.master</name> <value>master:6000</value> </property> <property> <name>hbase.master.maxclockskew</name> <value>180000</value> </property> <property> <name>hbase.rootdir</name> <value>hdfs://master:9000/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>master</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/home/${user.name}/tmp/zookeeper</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property>
其中,hbase.master是指定运行HMaster的服务器及端口号;hbase.master.maxclockskew是用来防止HBase节点之间时间不一致造成regionserver启动失败,默认值是30000;hbase.rootdir指定HBase的存储目录;hbase.cluster.distributed设置集群处于分布式模式;hbase.zookeeper.quorum设置Zookeeper节点的主机名,它的值个数必须是奇数;hbase.zookeeper.property.dataDir设置Zookeeper的目录,默认为/tmp,dfs.replication设置数据备份数,集群节点小于3时需要修改,本次试验是一个节点,所以修改为1。
(3) 配置regionservers,该文件位于/usr/local/hbase/conf
设置所运行HBase的机器,此文件配置和hadoop中的slaves类似,一行指定一台机器,本次试验仅用一台机器,设置master即可。
(4) 设置HBase环境变量,文件位于/etc/profile
在文件末尾添加:
`export HBASE_HOME=/usr/local/hbase
export PATH=$PATH:$HBASE_HOME/bin`
使环境变量立即生效source /etc/profile
3. 验证
启动顺序:hadoop->hbase,如果系统中使用了自己安装的zookeeper,则启动顺序是:hadoop->zookeeper->hbase。停止顺序与启动顺序正好相反
(1) 启动hadoopcd /usr/lcoal/hadoop/ sbin/start-all.sh
(2) 启动Hbase
进入hbase的bin目录,执行 ./start-hbase.sh
(3) 检测是否启动成功
执行jps
(4) 使用Hbase shell 进行测试
进入到hbase的bin目录下,运行./hbase shell,出现如下图所示结果,表示hbase安装成功.
尽情使用强大的Hbase吧!!!!!!!!
(5) 在master节点用浏览器访问:http://master:16030可以看到hbase的管理页面