HBase
Hbase(四)MR on Hbase & Hbase的 架构
今天的更新有点晚了,对不起对不起别骂了别骂了,在骂就傻了~
一、概述
HBase(Hadoop Database),是一个基于Google BigTable论文设计的高可靠性、高性能、可伸缩的分布式存储系统。
1.1 CAP(之前说过了哦)
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
1.2 列存储(重点)
这个概念要从RDBMS说起,RDBMS操作的最小单元是行级数据
select name from user;
update user set username = 'zkf' where sex = 'false';
即使是查询或者更新某个表中某个字段,对于RDBMS来说都是加载整行数据来进行数据的修改
因此RDBMS在处理单个数据的处理方式上,性能并不高,因为会做一些无用的IO操作。
1.3 HBase
官网地址: http://hbase.apache.org/
HBase是一种构建在HDFS之上的分布式、面向列的存储系统。在需要实时读写、随机访问超大规模数据集时,可 以使用HBase。
1.3.1 特点
-
大:一个表可以有上亿行,上百万列
-
面向列:面向列表(簇)的存储和权限控制,列(簇)独立检索。 结构稀疏:对于为空(NULL)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
-
无模式:每一行都有一个可以排序的主键和任意多的列,列可以根据需要动态增加,同一张表中不同的行可 以有截然不同的列。
-
数据多版本:每个单元中的数据可以有多个版本,默认情况下,版本号自动分配,版本号就是单元格插入时 的时间戳。
-
数据类型单一:HBase中的数据都是字符串,没有类型。
1.3.2 HBase和关系数据库区别
-
数据库类型:HBase中的数据类型都是字符串类型(string)
-
数据操作:HBase只有普通的增删改查等操作,没有表之间的关联查询
-
存储模式:HBase是基于列式存储模式,而RDBMS是基于行式存储的
-
应用场景:HBase适合存储大量数据,查询效率极高
1.4 HBase 数据结构
Hbase 数据结构其实很简单,涉及4个名词:RowKey|Column Family |Cell|TimeStamps,在说数据结构之前先看一张真正的HBase的表,有助于理解HBase的数据结构
行健 | 时间戳 | 列 蔟 | 单元格(值) |
---|---|---|---|
“database.software.www” | t1 | anchor:name | John |
“database.software.www” | t2 | info:address | BeiJing |
“database.software.www” | t3 | anchor:name | James |
“database.software.www” | t4 | anchor:tel | 01012345678 |
“database.software.www” | t4 | info:PC | 100000 |
“c.software.www” | t1 | anchor:name | James |
“c.software.www” | t2 | anchor:tel | 01012345678 |
“c.software.www” | t3 | info:address | BeiJing |
观察上述表格 ,这就是HBASE中存储数据的样子,可以看到HBASE行键是域名倒置的命名方式,时间戳就是当前时间,有不用的时间戳,在冒号之前就是列蔟的名字,但是你会发现,并不是每个的人列蔟都是相同的,你会发现每个人的列蔟都有可能不同,所以这就是体现出了HBase在存储数据的时候可以做到不存储某个属性的数据(在关系型数据中创建表之后,即使该属性没有数据也需要显示为null),这就是Hbase表存储稀疏的特点。
1.4.1 Rowkey | 行键
其实行键就是用来检索记录的主键
与 NoSQL 数据库一样,Row Key 是用来检索记录的主键 。访问HBase中的行,只有三种方式:
1. 通过单个RowKey访问
2. 通过Rowkey的range(正则)
3. 全表扫描
Rowkey可以是任意字符串(注意:最大长度为64 KB),在HBase内部,Rowkey保存为字节数组。存储时,数据按照Rowkey的字典顺序(byte order)排序存储。设计Rowkey时,要充分考虑排序存储这个特性,将经常一起读取的行(IO特性相似的行)存储放到一起。(位置相关性)
1.4.2 Column Family | 列蔟
列蔟:HBase表中的每个列,都归属于某个列蔟,其实就是列的集合。列蔟是表的 Schema 的一部分(而列不是),必须在使用表之前定义。 列名都以列蔟作为前缀。
1.4.3 Cell
关键字:无类型、字节码
由rowkey、column Family :column (值),version 组成的唯一的单元,值得注意是这里的Cell并不单单指当前列蔟的值,而是指好几个属性加起来所表示唯一的值。Cell 中的数据是没有类型 的,全部是字节码形式存储。
HBase和关系数据库区别
-
数据库类型:HBase中的数据类型都是字符串类型(string)
-
数据操作:HBase只有普通的增删改查等操作,没有表之间的关联查询
-
存储模式:HBase是基于列式存储模式,而RDBMS是基于行式存储的
-
应用场景:HBase适合存储大量数据,查询效率极高
1.4.4 TimeStamps
HBase中通过rowkey和columns确定的为一个存储单元成为Cell。每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是64位整形。时间戳可以由HBase(在数据写入时 自动)赋值, 此时时间戳是精确到毫秒的当前系统时间。时间戳也 可以由客户显示赋值。如果应用程序要避 免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个 Cell 中,不同版本的数据按照时间倒序排序, 即最新的数据排在最前面。
二、HBase 环境搭建-单机
2.1 基础环境
-
Hadoop
-
Zookeeper
2.2 安装和配置
[root@HadoopNode00 ~]# tar -zxvf hbase-1.2.4-bin.tar.gz -C /home/hbase/ # 解压至对应的目录
[root@HadoopNode00 ~]# vi .bashrc # 配置habse 环境变量
export HBASE_HOME=/home/hbase/hbase-1.2.4
export HBASE_MANAGES_ZK=false # 使用外部ZK
export PATH=$PATH:$HBASE_HOME/bin
[root@HadoopNode00 ~]# source .bashrc # 使环境变量生效
[root@HadoopNode00 ~]# vi /home/hbase/hbase-1.2.4/conf/hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://HadoopNode00:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>HadoopNode00</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
</configuration>
[root@HadoopNode00 ~]# vi /home/hbase/hbase-1.2.4/conf/regionservers
HadoopNode00
2.3 启动
[root@HadoopNode00 ~]# start-dfs.sh # 首先保证hdfs启动
[root@HadoopNode00 ~]# /home/zk/zookeeper-3.4.6/bin/zkServer.sh start /home/zk/zookeeper-3.4.6/conf/zk.cfg # 首先保证zk启动
[root@HadoopNode00 ~]# start-hbase.sh # 直接通过指令启动
[root@HadoopNode00 ~]# jps
1699 NameNode
2052 SecondaryNameNode
40660 QuorumPeerMain
42020 Jps
1851 DataNode
41708 HRegionServer # 健康存活
18476 NodeManager
41548 HMaster # 健康存活
18239 ResourceManager
2.4 连接
[root@HadoopNode00 ~]# hbase shell
2.5 Web UI
http://hostname:16010
今天的分享到此结束了,希望大家有个愉悦的周末,学习的同时也要注意休息哦~
给个三连吧 爱你们哦~