HBase
第一部分 初始 HBase
第1节 HBase简介
1.1 HBase是什么
HBase基于Google的BigTable论文而来,是一个分布式海量列式非关系型数据库系统,可以提供超大规模数据集的实时随机读写
接下来通过一个场景,初步认识HBase列式存储
如下是Mysql存储机制,空值字段会浪费存储空间
id | name | age | salary | job |
---|---|---|---|---|
1 | 小明 | 23 | 学生 | |
2 | 小红 | 10w | 律师 | |
如果是列式存储可以这样
rowkey :1 name:小明
rowkey :1 age:23
rowkey :1 job:学生
rowkey :2 name:小红
rowkey :2 salary:10w
rowkey :2 job:律师
列式存储的优点
-
减少存储空间占用
-
支持好多列
1.2 HBase的特点
-
海量存储:底层基于hdfs存储海量数据
-
列式存储: HBase表的数据是基于列族进行存储的,一个列族包含若干列
-
极易扩展:底层依赖HDFS,当磁盘不足时,增加dataNode节点就可以
-
高并发:支持高并发读写请求
-
稀疏:列的灵活性,在列族中,可以指定任意多的列,空不占空间
-
数据的多版本:HBase表中数据有多个版本,默认通过版本号区分,值为插入时的时间戳
-
数据类型单元:以字节数组存储
第2节 HBase数据模型
2.1 逻辑架构
-
列族,建表时指定,存储时写入文件以列族为整体存储
-
列 每个列族下包含多个列
-
rowkey 主键唯一标识 按字典顺序排序
-
region 横向切分表的一部分,大了可以再切
-
store 保存一个列族,有几个列族就有几个store
2.2 物理存储
storeFile 以列族为整体存储,store中有写其他属性
timestamp 版本号 写入的时间戳
type put写 delete 删除
关键字
概念 | 描述 |
---|---|
命名空间 | 类似于关系型数据库的database概念,每个命名空间下有多个表。HBase两个⾃带的命名空间,分别是hbase和default,hbase中存放的是HBase内置的表,default表是⽤户默认使⽤的命名空间。⼀个表可以⾃由选择是否有命名空间,如果创建表的时候加上了命名空间后,这个表名字以:作为区分! |
Table | 类似于关系型数据库的表概念。不同的是,HBase定义表时只需要声明列族即可,数据属性,⽐如超时时间(TTL),压缩算法(COMPRESSION)等,都在列族的定义中定义,不需要声明具体的列。 |
Row(⼀⾏逻辑数据) | HBase表中的每⾏数据都由⼀个RowKey和多个Column(列)组成。⼀个⾏包含了多个列,这些列通过列族来分类,⾏中的数据所属列族只能从该表所定义的列族中选取,不能定义这个表中不存在的列族,否则报错NoSuchColumnFamilyException。 |
RowKey(每⾏数据主键) | Rowkey由⽤户指定的⼀串不重复的字符串定义,是⼀⾏的唯⼀标识!数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进⾏检索,所以RowKey的设计⼗分重要。如果使⽤了之前已经定义的RowKey,那么会将之前的数据更新掉! |
ColumnFamily(列族) | 列族是多个列的集合。⼀个列族可以动态地灵活定义多个列。表的相关属性⼤部分都定义在列族上,同⼀个表⾥的不同列族可以有完全不同的属性配置,但是同⼀个列族内的所有列都会有相同的属性。列族存在的意义是HBase会把相同列族的列尽量放在同⼀台机器上,所以说,如果想让某⼏个列被放到⼀起,你就给他们定义相同的列族。 |
ColumnQualifier(列) | Hbase中的列是可以随意定义的,⼀个⾏中的列不限名字、不限数量,只限定列族。因此列必须依赖于列族存在!列的名称前必须带着其所属的列族!例如info:name,info:age |
TimeStamp(时间戳--》版本) | ⽤于标识数据的不同版本(version)。时间戳默认由系统指定,也可以由⽤户显式指定。在读取单元格的数据时,版本号可以省略,如果不指定,Hbase默认会获取最后⼀个版本的数据返回! |
Cell | ⼀个列中可以存储多个版本的数据。⽽每个版本就称为⼀个单元格(Cell)。 |
Region(表的分区) | Region由⼀个表的若⼲⾏组成!在Region中⾏的排序按照⾏键(rowkey)字典排序。Region不能跨RegionSever,且当数据量⼤的时候,HBase会拆分Region。 |
第3节 HBase整体架构
zookeeper
-
实现HMaster高可用
-
保存HBase的元数据信息,是所有HBase表的寻址入口(存储的地址信息,元数据表在哪个regionServer上)
-
监控HMaster和HRegionServer
HMaster
-
为HRegionServer分配Region
-
维护整个集群的负载均衡
-
管理和维护元数据信息
-
发现失效的Region,将region移动到正常的HRegionServer上
HRegionServer
-
管理Region
-
接受客户端读写请求
-
切换运行中变大的Region
Region
-
每个HRegion由多个store组成
store
-
每个store保存一个列族(columns family),有几个列族就有几个store
-
由一个metaStore和多个storeFile组成,metaStore是store在内存中的内容,写到文件后就是storeFile,StoreFile底层是以HFile的格式保存
第4节 HBase集群安装部署
-
下载安装包
-
hbase-1.3.1-bin.tar.gz
-
规划安装目录
/opt/lagou/servers/
-
上传安装包
rz
-
解压到安装目录
tar -zxvf hbase-1.3.1-bin.tar.gz -C /opt/lagou/servers
-
修改配置文件
-
把hadoop的hdfs-site.xml core-site.xml拷贝到hbase的conf目录
ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/core-site.xml /opt/lagou/servers/hbase-1.3.1/conf/core-site.xml
ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml /opt/lagou/servers/hbase-1.3.1/conf/hdfs-site.xml-
修改hbase conf下的配置文件
-
hbase-env.sh
#添加java环境变量
export JAVA_HOME=/opt/lagou/servers/jdk1.8.0_231/
#指定使⽤外部的zk集群
export HBASE_MANAGES_ZK=false -
hbase-site.xml
<configuration>
<!-- 指定hbase在HDFS上存储的路径 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://lxl20:9000/hbase</value>
</property>
<!-- 指定hbase是分布式的 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定zk的地址,多个⽤“,”分割 -->
<property>
<name>hbase.zookeeper.quorum</name> <value>lxl20:2181,lxl21:2181,lxl22:2181</value>
</property>
</configuration> -
-
-