文章目录
Apache HBase简介
Apache HBase™是Hadoop数据库,是一个分布式,可扩展的大数据存储。
当您需要对大数据进行随机,实时读/写访问时,请使用Apache HBase™。HBase是一个分布式的、面向列的开源数据库,该技术来源于Fay Chang所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系型数据为,它是一个适合于非结构数据存储的数据库。另一个不同的是HBase是基于列的而不是基于行的模式。
HBase架构
角色关系:
角色 | 说明 |
---|---|
Client | 发起HBase读写请求的客户端 |
Zookeeper | 记载了HBase的元数据信息,其中主要是-ROOT-表所在的位置信息 |
HMaster | 用于分配RegionServer的Region,负载均衡等作用 |
HRegionServer | Hbase集群的一个服务器 |
HLog | HBase日志,用于保证数据的完整性 |
HRegion | 相当于一个表 |
Store | 抽象的表示,表示字段的存储 |
MemStore | 内存的存储 |
StoreFile | 字段数据具体存在的文件 |
HFile | 当发生溢写时,生成的文件,此文件会通过DFS Client发送到HDFS |
DataNode | HDFS上具体存储数据的地方 |
Apache HBase是构建在HDFS之上的一个组件,快速的读/写访问可以满足大数据读/写的实时性,解决了HDFS存储文件的实时性问题。
当读取数据时,HBase首先会从Zookeeper集群中获取元数据信息,以便定位数据所在的HRegion,如果MemStore存在数据,则直接返回。
当写入数据时,首先会把数据写入到StoreFile中,当StoreFile达到一定的阈值时,会溢写到HDFS中,溢写成功后,会把StoreFile文件清空。先经过StoreFile的存储是为了避免频繁访问HDFS文件太系统,提高存储性能。
下面再对HBase的读/写进行更详细的分析。
HBase读取数据流程
步骤:
- HBase客户端发出读取请求,先访问zk集群;
- zk集群返回-ROOT-表的位置信息;
- HBase客户端根据zk集群返回的信息找到-ROOT-表,一个-ROOT-表只能存储在一个HRegion中,不可切分,.-ROOT-记录了.META表的Region信息;
- 通过-ROOT-表再找到.META表的元数据信息,.META表记录了用户创建的表的Region信息,.META可以有多个Region;
- 从 .META表中获取要查询的数据的元数据信息;
- 根据.META返回的元数据信息,找到对应的HRegion;
- HRegion返回数据到客户端。
上图中描述了一个HBase客户端发起读取请求后的整体流程,下面再具体讲解一个如何从HRegion获取要查询的数据。
Memstore是内存写入缓存,BlockCache是内存读取缓存。
HBase在写入数据时,首先会把数据写入到Memstore中,达到一个阈值后会溢写到HDFS生成HFile文件。
当HBase读取数据时,如果从HDFS获取数据,首先会缓存到BlockCache中,然后再返回给客户端。
步骤分析:
- HBase客户端请求获取数据,首先从Memstore查找数据;
- 因为没有达到阈值之前,要写入的数据还会在Memstore中,所以,如果此时再读取,可以马上查找并返回。因为没有达到阈值之前,要写入的数据还会在Memstore中,所以,如果此时再读取,可以马上查找并返回;
- 当Memstore没有查找到数据时,代表数据可能已溢写到hdfs中,此时先查找一下BlockCache,BlockCache是读取缓存,如果要读取的数据之前从HDFS中读取过,会在BlockCache中缓存下来,此时查找就可能会查找到结果并立即返回;
- 当在BlockCache没有查找到数据时,此时才会从HDFS中查找数据;
- 当从HDFS查找到数据后,首先会把数据缓存到BlockCache;
- 然后再从BlockCache返回数据到HBase客户端。
注意,上面的Memstore,BlockCache和HFile都是分布式存储
HBase写入数据流程
步骤分析:
- HBase客户端请求zk集群获取表元数据;
- zk集群返回表的元数据信息,-ROOT-和.Meta表的元数据;
- HBase客户端通过-ROOT-和.Meta表的元数据获取到可以写入数据的Region,并通过RPC协议与RegionServer进行交互;
- 数据首先写入到HLog中,HLog是为了防止数据丢失,以便使数据可恢复,保证数据的完整性;
- 然后再写入到Memstore,Memstore默认大小是16kb;
- 当Memstore存储满后,会溢写到HFile中,至此,HBase写数据完成。
HBase安装部署
- 下载安装包,目前稳定版为1.4.9
https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/stable/ - 上传到服务器并解压
- 修改conf/hbase-env.sh文件
export JAVA_HOME=
export HBASE_MANAGES_ZK=false
- 修改conf/hbase-site.xml文件
<configuration>
<!--设置namenode所在的位置,通过rootdir设置-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://hd-even-01:9000/hbase</value>
</property>
<!--是否开启集群-->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!--0.98版本后的新改动,之前没有port参数,默认端口为60000-->
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<!--zookeeper集群的位置,如果使用zookeeper集群,需要把env.sh脚本中的HBASE_MANAGES_ZK设置为false-->
<property>
<name>hbase.zookeeper.quorum</name>
<value>hd-even-01:2181,hd-even-02:2181,hd-even-03:2181</value>
</property>
<!--hbase的元数据存储在zookeeper集群中,值是zookeeper指定的dataDir-->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/even/hd/zookeeper-3.4.10/zkData</value>
</property>
</configuration>
- 修改conf/regionservers,添加作为regionservers的主机
# 虽然本次配置把hd-even-01作为region-master,而region-master也可以作为regionserver使用,所以此处也添加进去
hd-even-01
hd-even-02
hd-even-03
- 解决依赖包问题
# hbase需要依赖hadoop和zookeeper,因此,lib目录下需要有hadoop和zookeeper相关的包,默认情况下已包含,但需要根据自己安装的hadoop和zookeeper进行修改
cd hbase/lib
rm -f hadoop-*
rm -f zookeeper-*
#然后把自己使用的hadoop和zookeeper相关jar包拷贝过来。
- 把hadoop的配置软连接到hbase/conf中,hbase是构建在hadoop的hdfs之上的,所以需要hadoop的配置
# 根据自己的实际情况
ln -s /hadoop/core-site.xml /hbase/conf
ln -s /hadoop/hdfs-site.xml /hbase/conf
- 启动集群
# 启动master-server,推荐使用hbase-daemon.sh命令
bin/hbase-daemon.sh start master
# 启动regionserver
bin/hbase-daemon.sh start regionserver
- 启动终端
bin/hbase shell