背景
- Nosql是非关系数据库的一种概念,目前比较成熟优秀的Nosql产品有HBase , Mongodb , Redis 等
- HBase是Hadoop平台下数据存储引擎,它能够为大数据提供实时的读/写操作,但是根据实际情况来看,HBase在实时的数据写入性能上优于查询性能。HBase具备开源、分布式、可扩展性以及面向列的存储特点,使得HBase可以部署在廉价的PC服务器集群上处理大规模的海量数据
- HBase的存储方式有2种,一种是使用操作系统的本地文件系统,另外一种则是在集群环境下使用Hadoop的HDFS,相对而言,使用HDFS将会使数据更加稳定
概述
- HBase是一个高可靠性、高性能、分布式的、可伸缩、面向列的开源数据库
- 利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为其分布式协同服务
- HBase是基于Google BigTable模型开发的,典型的key/value系统;
- Hbase主要用来存储非结构化和半结构化的松散数据。
- 从逻辑上讲,HBase将数据按照表、行和列进行存储。与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。
- 行式数据库和列式数据库:
HDFS和HBase:
HBase数据模型
HBase的存储机制
HBase架构
Zookeeper
- 通过选举,保证任何时候,集群中只有一个master,Master与RegionServers 启动时会向ZooKeeper注册
- 所有Region的寻址入口
- 实时监控Region server的上线和下线信息。并实时通知给Master
- 存储HBase的schema和table元数据
HMaster
HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行,HMaster在功能上主要负责Table和Region的管理工作:
- 管理用户对Table的增、删、改、查操作
- 管理HRegionServer的负载均衡,调整Region分布
- 在Region Split后,负责新Region的分配
- 在HRegionServer停机后,负责失效HRegionServer 上的Regions迁移
HRegionServer
- HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。
- HRegionServer内部管理了一系列HRegion对象,HRegion中由多个HStore组成。每个HStore对应了一个CF(列族)
- HRegionServer负责切分运行过程中变得过大的region
HBase Region
- Table中所有行都按照row key的字典序排列;
- Table在行的方向上分割为多个Region,每个region会保存一个表里面某段连续的数据
- Region按大小分割的,每个表开始只有一个region,随着数据增多,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region,之后会有越来越多的region
- Table中的行不断增多,就会有越来越多的region,这样一张完整的表被保存在多个RegionServer上。
- 当Table随着记录数不断增加而变大后,会逐渐分裂成多份splits,成为regions,一个region由[startkey,endkey)表示,不同的region会被Master分配给相应的RegionServer进行管理
- 相当于一个表
HStore
一、HStore存储是HBase存储的核心了,其中由两部分组成,一部分是MemStore,一部分是StoreFiles。
二、Memstore 与 storefile
- 一个region由多个store组成,一个store对应一个CF(列族)
- store包括位于内存中的memstore和位于磁盘的storefile写操作先写入memstore,当memstore中的数据达到某个阈值,hregionserver会启动flashcache进程写入storefile,每次写入形成单独的一个storefile
- 当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、major compaction),在合并过程中会进行版本合并和删除工作(major),形成更大的storefile
- 当一个region所有storefile的大小和数量超过一定阈值后,会把当前的region分割为两个,并由hmaster分配到相应的regionserver服务器,实现负载均衡
- 客户端检索数据,先在memstore找,找不到再找storefile
搭建HBase伪分布
操作
- 将 hbase-0.98.12.1-hadoop2-bin.tar.gz 上传到node01的root目录下
- tar -zxvf hbase-0.98.12.1-hadoop2-bin.tar.gz -C /opt/hpe/ --> cd /opt/hpe --> mv hbase-0.98.12.1-hadoop2/ hbase-0.98 --> vi /etc/profile --> export HBASE_HOME=/opt/hpe/hbase-0.98 --> PATH最后追加:$HBASE_HOME/bin --> . /etc/profile --> 输入hbase测试
- cd conf --> vi hbase-site.xml --> 将以下添加到configuration中
<property>
<name>hbase.rootdir</name>
<value>file:///home/testuser/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/testuser/zookeeper</value>
</property>
- 启动hbase : start-hbase.sh
- 进入hbase客户端 :hbase shell --> help帮助文档 --> create ‘psn’,‘cf’(创建表,指定至少一个列族cf,语句结尾无需加分号)–> list(查看表)–> put ‘psn’,‘111’,‘cf:name’,‘zhangsan’(向表里添加数据)–> scan ‘psn’(全表扫描查询)–> disable ‘tbl’(禁用表)–> drop ‘tbl’(删除表)–> get ‘psn’,‘111’,‘cf:age’(查询某一列数据)–> quit(退出)
搭建HBase完全分布式环境
准备
- 环境准备:hostname hosts iptables
- 时间同步:使用时间服务器 ntp:ntpdate yum install ntp -y
- 免密钥
- 配置环境变量
- 修改配置文件
①hbase-env.sh (JAVA_HOME、Zookeeper)
②hbase-site.xml (指定hbase存储数据目录、是否启用集群模式、指定ZK)
③regionservers 指定那几台服务器充当regionservers (node02 node03 node04)
④backup-master : 指定备用的master 从而实现HA高可用
⑤拷贝hdfs中的一个配置文件 hdfs-site.xml 拷贝到HBase配置目录中 - 分发配置文件 :保证集群中的每一台服务器配置相同
- 启动hbase : start-hbase.sh
- 停止hbase : stop-hbase.sh
操作步骤
- rm -rf hbase-0.98/(node01删除伪分布文件,重新解压)–> tar -zxvf hbase-0.98.12.1-hadoop2-bin.tar.gz -C /opt/hpe/ --> cd /opt/hpe --> mv hbase-0.98.12.1-hadoop2/ hbase-0.98 --> scp -r hbase-0.98/ node02:
pwd
(给node02~04均分发) - 在node01~04中 yum install ntp -y(下载时间同步器)–> ntpdate ntp1.aliyun.com
- 修改hbase-env.sh:cd /opt/hpe/hbase-0.98/conf --> vi hbase-env.sh --> 修改JAVA_HOME路径,另外修改并保存 export HBASE_MANAGES_ZK=false
- 修改hbase-site.xml : vi hbase-site.xml --> 粘贴下面配置到里面
<property>
<name>hbase.rootdir</name>
<value>hdfs://mycluster/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node02,node03,node04</value>
</property>
–> vi regionservers --> 里面内容改为node02 node03 node04(各个节点之间要换行) --> touch backup-masters (创建文件) --> vi backup-masters --> node02 (添加上备用节点) --> cp /opt/hpe/hadoop-2.7.5/etc/hadoop/hdfs-site.xml ./ --> scp ./* node02:pwd
(分发给node02~node04)
5. node01中: start-hbase.sh–> hbase shell --> create ‘member’,‘member_id’,‘address’,‘info’ --> desc ‘member’ --> alter ‘member’,{NAME=>‘member_id’,METHOD=>‘delete’}(删除列族) --> (判断表是否enable)–> put ‘member’,‘hp’,‘info:age’,‘24’ (插入数据) --> scan ‘member’(查询整个表数据)
6. 停掉服务:stop-hbase.sh(node01)–> 启动hbase服务 start-hbase.sh --> jps --> 杀掉node01中Hbase的Master进程(查看主备切换) --> stop-hbase.sh
补充
- 分布式说明可以搭建集群
- Google公布的论文:GFS MapReduce BigTable --> HBase
- ntp1.aliyun.com : 免费的时间服务器网址