文章目录

一、HBASE概述

HBase是一个分布式的、面向列的开源数据库。HBase不同于一般关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase是基于列而不是基于行的模式。
HBase利用hadoopHDFS作为其文件存储系统,利用Hadoop的MapReduce中的海量数据,利用zookeeper作为协调工具。提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。
它介于nosql和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务。主要用来存储非结构化和半结构化的松散数据。与Hadoop相同,HBase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。
HBase中的表一般有这样的特点:
    1、大:一个表可以有上亿行,上百万列
    2、面向列:面向列(族)的存储和权限控制,列(族)独立检索
    3、稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏

学习的链接

二、安装配置

将安装包直接解压修改配置就可以了。
1、单机模式
    修改 conf/hbase-sit.xml,配置hbase使用的数据文件的位置,默认在/tmp/hbase-[username],此目录是linux 的临时文件,之后可能被清空,所以最后修改一下
<property>
    <name>hbase.rootdir</name>
    <value>file:///<path>/hbase</value>
</property>

2、伪分布模式 修改conf/hbase-env.sh修改JAVA_HOME 修改hase-site.xml配置使用hdfs

<property>
    <name>hbase.rootdir</name>
    <value>hdfs://hadoop:9000/hbase</value>
</property>
<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>

3、完全分布式模式 修改conf/hbase-env.sh修改JAVA_HOME 修改hbase-site.xml,配置开启完全分布式模式 配置hbase.cluster.distributed为true。 配置hbase.rootdir设置为HDFS访问地址

<property>
    <name>hbase.rootdir</name>
    <value>hdfs://hadoop00:9000/hbase</value>
</property>
<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
</property>
    配置region服务器,修改conf/regionservers文件,其中配置所有hbase主机,每个主机名独占一行,hbase启动或关闭时会按照该配置顺序启动或关闭主机中的hbase
    使用已有的zookeeper集群。这种方式下zookeeper脱离了hbase,不会随着hbase的启动关闭而启动关闭。需要自己来启动关闭。
    hbase默认使用自带的zookeeper,如果需要使用外部zookeeper,需要先关闭
    修改conf/hbase-env.sh禁用内部zookeeper
    export HBASE_MANAGES_ZK false
在hbase-site.xml中配置Zookeeper的连接地址与端口号
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>

启动集群: 启动zookeeper,后启动hdfs,在启动hbase。 可以通过访问http://xxxx:60010来访问页面,通过web来管理hbase

三、HBASE原理

HBase的工作方式:
    hbase中的在行的方向上分隔为多个HRegion,分散在多个RegionService中,这样做的目的是在查询时可以将工作量分布到多个RegionService中以提高速度,region由[startkey,endkey)表示,HRegion是hbase分布式存储和负载均衡的最小单元。
    要注意的是HRegion不是在hdfs中的,而是在RegionService内存中,在内存(其实也有数据在本地系统中,因为内存空间毕竟有限)中存储数据以提高查询性能,对于修改会将数据最终同步到hdfs中,以持久化数据。
    hbase中的数据是按照rowkey的字典顺序存储。所以当以rowkey查询数据是,可以提高速度。
    hregion的分裂:当hregion变的很大会分裂成两个,存放到不同的RegionService中,防止一个Region过大,导致查询其中数据时很慢

为什么hbase可以很快:
    从逻辑结构上来说:
        表按照行键进行了排序,所以查询时可以很快定位。
        数据按照行键切分为多个HRegion,分布在多个RegionService中,查询大量数据时,多个RegionService可以一起工作,从而提高速度

从物理结构上说:
    HRegion是存货在Region Service的内存中,读写会非常高效
    还有Hive的支持可以保证大量的数据可以持久化的保存
    数据最终落地到HDFS中,分布式的存储,保证数据可靠性和可扩展性

为什么说hbase可以存储很多数据:
    基于hdfs,所以支持可扩展性,可以通过大量的廉价硬件提高存储容量
    按列存储,空的数据不占用空间,当存储稀疏数据时,不会浪费空间
    按列存储,同一列的数据存放在一起,而同一列的数据一般都是同样的类型的内容相似的数据,可以实现非常高效的压缩,节省空间

为什么hbase的数据是可靠的:
    基于hdfs,由hdfs的可靠性保证了hbase的可靠性--即数据可以有多个备份
    利用zookeeper实现了HA,即使某一台机器挂掉另外的机器也可以很快的替换它

hbase和hive和传统的关系型数据库的比较:
    比起传统的关系型数据库,可以存储半结构化非结构化的数据,可以存储和处理更大级别的数据,提供高效的查询,对于稀疏数据的处理更好,具有更好的横向扩展性,免费开源性价比很高。但是不能支持非常好的事务特性,只支持行级的事务。只能通过行键来查询,表设计时难度更高。而mysql用来存储结构化的数据提供更好的事务控制。
    比起hive,hive只是在mapreduce上包了一层壳,本质上还是离线数据的处理的工具,实时查询性能有限,本质上是一个基于hadoop的数据仓库工具,不能支持行级别的新增修改和删除。hbase可以提供实时的数据的处理能力,适用于在线数据查询处理,本质上是一种数据库工具。