- Hbase是hadoop生态中的一个列式存储的非关系型数据库
- 常用的mysql数据库采用的是行式存储,但是由于行式存储造成大量的稀疏,不适用于大数据的 存储,因此出现了Hbase这样的列式存储引擎
- 列式存储是指,将数据用行键和列限定符来标识数据,将关系型表中的稀疏结构中有值的内容按行保存,节省空间并提高查询效率
- HMaster
- 监控HRegionServer
- 当在集群中启动Hbase服务的时候,在第一台启动的这台机器上默认成为HMaster,其他的均处于热备状态,服务启动时所有的机器上都会启动一个HRegionServer,而此时的HMaster就来管理这些HRegionServer
- 处理HRegionServer 故障转移
- 当众多的HRegionServer中有有机器发生问题时,HMaster负责将该机器人上的数据迁移到其他机器上
- 处理元数据的变更
- 在Hbase中创建表的时候,会默认的在一张名为MATA的表中记录所有的创建信息(region的数量以及存储的位置等)
- 处理region 的分配或移除
- 当一张表中的数据量过大时,Hmaster会将该表分解成众多的region以此来提高表的查询效率,然后将这些region交给HRegionServer来进行管理
- 在空闲时间进行数据的负载均衡
- 平衡各个HRegionServer之间的region数量
- 通过 Zookeeper 发布自己的位置给客户端
- 将自己的管理信息注册在zookeeper中,已提供给客户端方便进行查询
- HRegionServer
- 负责管理 Hbase 的实际表数据
- region其实是一个表的描述信息,真实的数据都存储在底层的HDFS上面,被分为一个个的Block且有备份
- 处理分配给它的 Region
- 刷新缓存到 HDFS
- 当表中的数据要进行增删改操作时,会先记录这些信息到缓存当中,然后再将所有的操作在HDFS上从新写一个新的修改好的文件保存在HDFS上面而不是直接在原文件上进行修改
- 维护Hlog Write-Ahead Log WAL 预写入日志
- 为了防止在数据的写入操作时,机器发生意外,所有会优先将写入操作预写入一个文件当中保存在磁盘里,即使发生宕机,待机器从新启动时也会读取该日志中的内容,从而进行数据的修改,保证数据不丢失
- 执行压缩
- 负责处理 Region 分片
- 集群关系概览
1.安装前提
正常安装并启动HDFS和Zookeeper
2.下载并解压Hbase-1.3.5
3.修改配置文件
- hbase-evn.sh
# 添加JAVA运行环境 export JAVA_HOME=/opt/jdk1.8 # 关闭Hbase自带的zk服务,使用已经搭建好的ZK服务 export Hbase_MANAGES_ZK=false # 将JDK8以上版本不需要的配置注释掉 # export Hbase_MASTER_OPTS ……… # export Hbase_REGIONSERVER_OPTS…………
- hbase-site.xml
hbase.rootdir hdfs://L00:8020/hbase hbase.cluster.distributed true hbase.zookeeper.quorum L00:2181,L01:2181,L02:2181 hbase.zookeeper.property.dataDir /opt/zookeeper-3.4.14/data
- regionservers
#设置所有安装需要启动Regionserver的机器 L00 L01 L02
4.分发安装包
scp /opt/hbase-1.3.5/ L01://opt/hbase-1.3.5/ scp /opt/hbase-1.3.5/ L02://opt/hbase-1.3.5/
5.配置环境变量
echo 'export Hbase_HOME=/opt/hbase-1.3.5' >> /etc/profile echo 'export PATH=$Hbase_HOME/bin:$PATH' >> /etc/profile source /etc/profile
6.启动服务
start-hbase.sh # Hbase会默认在执行启动命令的机器上启动HMaster服务 # 其他机器也可以启动HMaster服务,作为高可用的主备节点 如果启动执行命令提示master未初始化 可以尝试删除hadoop的data目录 格式化namenode 删除zk的data目录 重启启动zk4.Hbase的客户端操作
# 开启Hbase的命令行客户端
hbase shell
# 查看所有命令的帮助
help
# 查看具体单个命令的帮助
help 命令
直接敲命令
# 查看 命名空间(namespace,类似RDB中database)
list_namespace
# 查看 表
list
# 创建表
create '表名','列族'
# 插入数据
put '表名','行键','列族:列','值'
# 查询单行数据
get '表名','行键','列族:列'
# 扫描多行数据
scan '表名'
scan 't1',{STARTROW=>'12',STOPROW=>'13'}
5.javaAPI操作Hbase
引入相关依赖
org.apache.hbase hbase-client 1.3.5
创建实现类
public static HbaseAdmin getHbaseAdmin(String zookeeperStr){
HbaseAdmin Admin = null;
Connection connection = getConnection(zookeeperStr);
try {
Admin = (HbaseAdmin)connection.getAdmin();
} catch (IOException e) {
logger.error("获取HbaseAdmin失败",e);
}
return Admin;
}
public static Connection getConnection(){
return getConnection(zookeeperStr);
}
public static Connection getConnection(String zookeeperStr){
Connection connection = null;
// 1. 创建配置文件对象
Configuration conf = new Configuration();
// 1.1 添加集群的连接配置
conf.set("hbase.zookeeper.quorum", zookeeperStr);
// 2. 使用工厂类创建连接
try {
connection = ConnectionFactory.createConnection(conf);
} catch (IOException e) {
logger.error("连接Hbase失败",e);
}
return connection;
}



