HBase
Apache HBase是一个一个开源的,分布式的,可扩展的非关系数据库
HBase的集群角色:HMaster和HRegionServer
HBase架构图
- Client访问HBase上的数据并不需要HMaster参与
- 寻址访问ZooKeeper和HRegionServer
- 数据读写访问HRegionServer
- HMaster仅仅维护Table和Region的元数据信息
- Table的元数据信息保存在ZooKeeper上
- 一个HRegionServer会有多个HRegion和一个HLog
- HRegionServer中有基于LRU的Block Cache机制
- 每个Table一般只有一个HRegion,Table的每个Column对应一个Store,每个Store都会有一个MemStore和0或多个StoreFile,每个StoreFile都会对应一个HFile,HFile就是实际的存储文件
HMaster
- 对RegionServer监控
- 处理一些元数据的变更
- 对RegionServer进行故障转移
- 空闲时对数据进行负载均衡
- 对region进行管理
- HDFS上的垃圾文件回收
- 发布位置到客户端借助于zookeeper
HRegionServer
- 存储HBase实际的数据
- 刷新缓存数据到HDFS
- 处理Region
- 可以进行压缩
- 对Hlog进行维护
- 对region分片
HRegion
- 每个表一般只有一个HRegion
- 当HRegion的某个ColumnFamily达到一个阀值(默认256M)时就会分成两个新的HRegion
Store
- 每一个HRegion由一个或多个Store组成
- 每个ColumnFamily对应一个Store
- 一个Store由一个MemStore和0或者多个StoreFile组成
- HBase以Store的大小来判断是否需要切分HRegion
MemStore
- MemStore 是放在内存里,保存的数据格式为key-value
- 当MemStore的大小达到一个阀值(默认64MB)时,MemStore会被Flush到StoreFile文件
StoreFile
- MemStore内存中的数据溢出写到StoreFile文件
- StoreFile底层是以HFile的格式保存
HFile
- 二进制格式文件
- 不定长的,长度固定的是Trailer和FileInfo
- Trailer中有指针指向其他数据块的起始点
- FileInfo记录了文件的一些meta信息,不能被压缩
- 每个Data块的大小可以在创建一个Table的时候通过参数指定(默认块大小64KB)
- 每个Data块除了开头的Magic,就是一个个Key-Value对拼接而成
- Magic是一些随机数字,为了防止数据损坏
- 大号的Block有利于顺序Scan,小号的Block利于随机查询
- Data Block和Meta Block可以被压缩,大大减少网络IO和磁盘IO
HLog
- HLog记录数据的操作
- 一旦RegionServer宕机,就可以从Log中进行恢复
定位HRegion的三层结构
- 通过zk里的文件/hbase/rs得到-ROOT-表的位置。-ROOT-表只有一个region
- 通过-ROOT-表查找.META.表的第一个表中相应的HRegion位置。其实-ROOT-表是.META.表的第一个region,META.表中的每一个Region在-ROOT-表中都是一行记录
- 通过.META.表找到所要的用户表HRegion的位置。用户表的每个HRegion在.META.表中都是一行记录
安装HBase集群
(1)解压hbase-2.1.4-bin.tar.gz压缩包
tar -xvzf hbase-2.1.4-bin.tar.gz
(2)配置conf文件夹下的hbase-env.sh文件
export JAVA_HOME=/usr/local/java/jdk1.8.0_11
export HBASE_MANAGES_ZK=false
(3)配置conf文件夹下的hbase-site.xml文件
<configuration>
<!-- 设置NameNode所在位置,通过rootdir设置,也就是设置HDFS中存放的路径 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop1:9000/hbase</value>
</property>
<!-- 是否开启集群 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 默认端口为60000 -->
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<!-- zookeeper集群的位置 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
<!-- hbase的云数据信息存储在zookeeper的位置 -->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/zookeeper/data</value>
</property>
</configuration>
(4)配置conf文件夹下的regionservers文件
# 配置集群服务器名
hadoop1
hadoop2
hadoop3
(5)软链接core-site.xml和hdfs-site.xml
ln -s /usr/local/hadoop/hadoop-2.9.2/etc/hadoop/core-site.xml
ln -s /usr/local/hadoop/hadoop-2.9.2/etc/hadoop/hdfs-site.xml
(6)替换lib文件夹下的hadoop的jar包
原:
新:
# 移除lib文件夹下hadoop的jar包
rm -f hadoop-*
(7)ssh发送到其他服务器
scp -r hbase hadoop2:/usr/local/
scp -r hbase hadoop3:/usr/local/
(8)启动HBase
# 同时启动hmaster和regionserver
start-hbase.sh
# 单个启动
hbase-daemon.sh start master
hbase-daemon.sh start regionserver
# 交互式启动
hbase shell
(9)输入网址IP地址:16010