概述
HBase概述
HBase是一个分布式的、面向列的开源数据库,该技术来源于Fay Chang 所撰写的Google论文《Bigtable》一个结构化数据的分布式存储系统"。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力(低延迟的数据查询能力)。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,Hbase同BigTable一样,都是NoSQL数据库,即非关系型数据库,此外,HBase和BigTable一样,是基于列的而不是基于行的模式。
HBase利用Hadoop HDFS作为其文件存储系统,利用Hadoop的MapReduce来处理HBase中的海量数据,利用Zookeeper作为协调工具。
关系型数据库 VS NoSql数据库
1 关系型数据库的缺陷
-
高并发读写的瓶颈
目前环境下,需处理高并发的读写请求,但是关系型数据库可以支持上万次的SQL查询,但I/O硬盘无法承受上万次的SQL写入请求。
-
可拓展性的限制
在基于Web的架构中,数据库是最难以进行横向扩展的,当应用系统的用户量和访问量与日俱增时,数据库系统却无法像Web Server和App Server那样简单地通过添加更多的硬件和服务节点来扩展性能和负载能力。
-
事务一致性的负面影响
在关系型数据库中,所有的规则必须应用到事务的修改上,以便维护所有数据的完整性,这随之而来的是性能的大幅度下降。很多Web系统并不需要严格的数据库事务,对读一致性的要求很低,有些场合对写一致性要求也不高。因此数据库事务管理成了高负载下的一个沉重负担。
-
复杂SQL查询的弱化
任何大数据量的Web系统都非常忌讳几个大表间的关联查询,以及复杂的数据分析类型的SQL查询,特别是SNS类型的网站,从需求以及产品设计角度就避免了这种情况的产生。更多的情况往往只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大地弱化了,所以这部分功能不能得到充分发挥。
2 NoSQL数据库的优势
-
拓展性强
NoSQL去掉了关系型数据库的关系特性,数据之间是弱关系,容易拓展,而且通常使用KV字典式存储结构,水平拓展性能优越,很容易实现支撑数据从TB到PB的过渡。
-
并发性能好
读写性能优良
-
数据模型灵活
无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。
HBase的逻辑结构
1 列存储 VS 行存储
列存储 | 行存储 | |
---|---|---|
代表框架 | HBase | MongoDB 文档型 Lexst 二进制 |
组织表的方式 | 列 | 行 |
写入方式 | 把一行记录拆分成单列保存,写入次数多,刺头需要移动和定位,修改数据时,行存储是在指定位置写入一次,列存储是将磁盘定位到多个列上分别写入,这个过程仍是行存储的列数倍。 | 一次写入 |
读取方式 | 每次读取的数据是集合的一段或者全部,不存在冗余性问题 | 将一行数据完全读出,如果只需要其中几列数据的情况,就会存在冗余列,出于缩短处理时间的考量,消除冗余列的过程通常是在内存中进行的。 |
数据类型 | 一列都是相同的数据类型,全集合一个类型 | 一行有多种数据类型,数据解析需要在多种数据类型之间频繁转换 |
数据压缩性能 | 高 | 低 |
优点 | 在读取过程,不会产生冗余数据 | 一次性完成,消耗的时间比列存储少,并且能够保证数据的完整性 |
缺点 | 写入效率、保证数据完整性上都不如行存储 | 数据读取过程中会产生冗余数据 |
适用场景 | OLAP 在线联机分析处理系统 同一个数据列的数据重复度很高 |
每次查询涉及的数据量较小或者大部分查询都需要整行的数 |
2 HBase逻辑结构
-
行键 RowKey
HBase的主键,数据都是按照行键的字典顺序排序后存储,对于HBase的数据查询,仅有三种模式:
- 根据指定行键查询
- 根据指定行键范围查询
- 全表扫描查询
-
列族 ColumnFamily
HBase表中垂直方向保存数据的结构,列族是HBase表中的元数据的一部分,需要在定义HBase表时制定好表有哪个列族,列族可以包含一个或多个列(后面可以拓展)
-
列 Column
HBase表中列族里可以包含一个或多个列,列并不是HBase表的元数据的一部分,不需要在创建表时预先定义,而是可以在后续使用表时随时为表的列族动态的增加列。
-
单元格和时间戳
在HBase表中,水平方向的行和垂直方向的列交汇就得到了HBase中的一个存储单元,而在这个存储单元中,可以存储数据,并且可以保存数据的多个版本,这些个版本之间通过时间戳来进行区分。
所以在HBase中可以通过行键列族列时间戳来确定一个最小的存储数据的单元,这个单元就称之为单元格Cell。 单元格中的数据都以二进制形式存储,没有数据类型的区别。
HBase搭建操作
前提条件,安装jdk 和 hadoop,并配置了环境变量。
hbase-env.sh配置HBase启动时需要的相关环境变量。
hbase-site.xml配置HBase基本配置信息。
HBASE启动时默认使用hbase-default.xml中的配置,如果需要可以修改hbase-site.xml文件,此文件中的配置将会覆盖hbase-default.xml中的配置。
修改配置后要重启hbase才会起作用。
单机模式
HBase将会基于普通的磁盘文件来进行工作,也即不使用HDFS作为底层存储,优点是方便,缺点是底层数据不是分布式存储,性能和可靠性没有保证,主要用作开发测试,不应用在生产环境下。
修改conf/hbase-site.xml文件
<property>
<name>hbase.rootdir</name>
<value>file:///<path>/hbase</value> #修改为非tmp的本地路径
</property>
伪分布式
HBase采用hdfs作为存储具有完整的功能,但是只有一个节点工作,没有性能的提升,可以用作开发测试,不可用作生产环境下。
- 修改conf/hbase-env.sh 的JAVA_HOME(27行,否则不能开启hbase shell)
- 修改hbase-site.xml
<property>
<name>hbase.rootdir</name> #指定的底层存储位置
<value>hdfs://hadoop00:9000/hbase</value>
</property>
<property>
<name>dfs.replication</name>#制定底层副本的数量,与HDFS副本数匹配
<value>1</value>
</property>
完全分布式
-
修改conf/hbase-env.sh 的JAVA_HOME(27行,否则不能开启hbase shell)
-
修改hbase-site.xml
<property> <name>hbase.rootdir</name> #指定底层存储位置 <value>hdfs://hadoop00:9000/hbase</value> </property> <property> <name>dfs.replication</name>#指定底层HDFS副本数量 <value>1</value> </property> <property> <name>hbase.cluster.distributed</name>#是否开启集群模式 <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name>#配置zk <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value> </property>
-
修改conf/hbase-env.sh
export HBASE_MANAGES_ZK false
这个用来确认是否交由HBase管理zk,默认true,即HBase在关闭的时候,关闭zk
-
修改conf/regionservers文件
配置所有hbase的主机,每个主机独占一行,hbase在启动或关闭时,会按照书序启动或关闭对应主机中的HBase进程
管理指令
启动顺序:zk->hadoop->habase
启动:
备用主机:hbase-daemon.sh start master
脚本访问:hbase shell
HBase基础操作
shell命令操作
指令 | 说明 | 示例 |
---|---|---|
create | 创建表格 指定VERSIONS,配置的是当前列族在持久化到文件系统中时,要保留几个最新的版本数据,这并不影响内存中的历史数据版本 |
create ‘tab1’,‘cf1’,'cf2’ create 表名,列族名1,列族名2 create ‘tab1’,{NAME=>‘c1’,VERSIONS=>3} create 表名,{NAME=>列族名,VERSION=>版本数量} |
list | 查看共有的表格 | list |
put | 添加数据 | put ‘tab1’,‘row-1’,‘cf1:co11’,'aaa’ p |