HBase简介
什么是HBase
- HBase是一个分布式的、面向列的开源数据库
- HBase是Google BigTable的开源实现
- HBase不同于一般的关系型数据库,适合非结构化数据存储
BigTable
- Big Table是Google设计的分布式数据存储系统,用来处理海量数据的一种非关系型数据库
- 适合大规模海量数据,PB级数据
- 分布式、并发数据处理,效率极高
- 易于拓展,支持动态伸缩
- 适用于廉价设备
- 不适用于传统关系型数据存储
面向列的数据库
HBase 与 传统关系数据库的区别
HBase | 关系型数据库 | |
---|---|---|
数据库大小 | PB级别 | GB TB |
数据类型 | Bytes | 丰富的数据类型 |
事务支持 | ACID只支持单个Row级别 | 全面的ACID支持, 对Row和表 |
索引 | 只支持Row-key | 支持 |
吞吐量 | 百万写入/秒 | 数千写入/秒 |
- 关系型数据库中数据示例
ID | FILE NAME | FILE PATH | FILE TYPE | FILE SIZE | CREATOR |
---|---|---|---|---|---|
1 | file1.txt | /home | txt | 1024 | tom |
2 | file2.txt | /home/pics | jpg | 5032 | jerry |
- 同样数据保存到列式数据库中
RowKey | FILE INFO | SAVE INFO |
---|---|---|
1 | name:file1.txt type:txt size:1024 | path:/home/pics creator:Jerry |
2 | name:file2.jpg type:jpg size:5032 | path:/home creator:Tom |
非结构化数据存储
- 结构化数据
- 适合二维表来展示数据
- 非结构化数据
- 非结构化数据是数据结构不规则或不完整
- 没有预定义的数据模型
- 不方便用数据库二维逻辑来表现
- 文本、图片、XML、HTML、各类报表、图像和音频视频信息等
HBase在Hadoop生态中的地位
- HBase是Apache基金会顶级项目
- HBase基于HDFS进行数据存储
- HBase可以存储超大数据并适合用来进行大数据实时查询
HBase与HDFS
- HBase建立在Hadoop文件系统上,利用了HDFS的容错能力
- HBase提供对数据的随机实时读/写访问功能
- HBase内部使用哈希表,并存储索引,可以快速查找HDFS中数据
HBase使用场景
- 瞬间写入量很大
- 大量数据需要长期保存,且数量会持续增长
- HBase不适合有join,多级索引,表关系复杂的数据模型
HBase的数据模型
- NameSpace:对应关系型数据库的“数据库”(database)
- 表(table):用于存储管理数据,具有稀疏性、面向列的特点。Hbase中的每一张表,可以有上亿行,上百万列,对于为值为空的列,并不占用存储空间,因此表可以设计的非常稀疏。
- 行(Row):在表里面,每一行代表着一个数据对象,每一行都是以一个行键(Row Key)来进行唯一标识的,行键并没有什么特定的数据类型,以二进制的字节来存储
- 列(Column):HBase的列由Column family和Column qualifier组成,由冒号:进行行间隔,如family:qualifier
- 行键(RoeKey):类似于MySQL中的主键,HBase根据行键来快速索引数据,一个行键对应一条记录。于MySQL主键不同的是,HBase的行键是天然固有的,每一行都有且仅有一个行键
- 列族(ColumnFamily):是列的集合。列族在表定义时需要指定,而列在插入数据时动态指定。列中的数据都是以二进制形式存在,没有数据类型。在物理存储结构上,每个表中的每个列族单独以一个文件存储。一个表可以有多个列族。
- 时间戳(TimeStamp):是列的一个属性,是一个64位整数。由行键和列确定的单元格,可以存储多个数据,每个数据含有时间戳属性,数据具有版本特性。可根据版本(VERSIONS)或时间戳来指定查询历史版本数据,如果都不指定,则默认返回最新版本数据。
- 区域(Region):HBase自动把表水平划分成多个区域,划分的区域随着数据的增大而增多。
HBase安装和shell操作
HBase的安装
下载安装包http://archive.cloudera.com/cdh5/cdh/5/hbase-1.2.0-cdh5.7.0.tar.gz
配置伪分布式环境
- 环境变量配置
1
2export HBASE_HOME=/root/bigdata/hbase
export PATH=$HBASE_HOME/bin:$PATH- 配置hbase-evn.sh
1
2export JAVA_HOME=/root/bigdata/jdk
export HBASE_MANAGES_ZK=false --如果你是使用hbase自带的zk就是true,如果使用自己的zk就是false- 配置hbase-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop-master:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>hadoop-master:60000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop-master:2181</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/root/bigdata/zookeeper-3.4.14/dataDir</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
</configuration>- 启动hbase(在hadoop集群已经启动的情况下)
1
/hbase/bin/start-hbase.sh
- 输入hbase shell(进入shell命令行)
HBase shell
- HBase DDL和DML命令
名称 | 命令表达式 |
---|---|
创建表 | create ‘表名’, ‘列族名1’,’列族名2’,’列族名n’ |
添加记录 | put ‘表名’,’行名’,’列名:’,’值 |
查看记录 | get ‘表名’,’行名’ |
查看表中的记录总数 | count ‘表名’ |
删除记录 | delete ‘表名’, ‘行名’,’列名’ |
删除一张表 | 第一步 disable ‘表名’ 第二步 drop ‘表名’ |
查看所有记录 | scan “表名称” |
查看指定表指定列所有数据 | scan ‘表名’ ,{COLUMNS=>’列族名:列名’} |
更新记录 | 重写覆盖 |
1 | 连接集群 |
- 命令表
使用HappyBase操作HBase
1 | 安装 |
HBase组件
HBase基础组件
Client
- 与zookeeper通信,找到数据入口地址
- 使用HBase RPC机制与HMaster和HRegionServer进行通信
- Client与HMaster进行通信进行管理类操作
- Client与HRegionServer进行数据读写类操作
Zookeeper
- 保证任何时候,集群中只有一个running master,避免单点问题
- 存储所有Region的寻址入口,包括ROOT表地址、HMaster地址
- 实时监控Region Server的状态,将Region Server的上线和下线信息,实时通知给Master
- 存储HBase的schema,包括有哪些table,每个table有哪些column family。
HMaster
- 可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行
- 角色功能:
- 为Region server分配region
- 负责region server的负载均衡
- 发现失效的region serve并重新分配上其他的region
- HDFS上的垃圾文件回收
- 处理用户对表的增删改查操作
HRegionServer
- HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写数据
- 作用:
- 维护Master分配给它的region,处理对这些region的IO请求
- 负责切分在运行过程中变得过大得region
- 此外,HRegionServer管理一系列HRegion对象,每个HRegion对应Table中一个Region,HRegion由多个HStore组成,每个HStore对应Table中一个Column Family的存储,Column Family就是一个集中的存储单元,故将具有相同IO特性的Column放在一个Column Family会更高效。
HStore
- HBase存储核心,由MemStore和StoreFile组成
- 用户写入数据流程为:Client访问ZK,ZK返回RefionServer地址–>Client访问RegionServer写入数据–>数据存入MemStore,一直到MemStore满–>存入StoreFile
HRegion
- 一个表最开始存储得时候,是一个region。
- 一个Region中会有多个store,每个store用来存储一个列族。如果只有一个column family,就只有一个store。
- region会随着插入数据越来越多,会进行拆分。默认大小10G一个
HLog
- 在分布式系统中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况。
HBase模块协作
- HBase启动
- HMaster启动,注册到Zookeeper,等待RegionServer汇报
- RegionServer注册到Zookeeper,并向HMaster汇报
- 对各个RegionServer(包括失效的)的数据进行整理,分配Region和meta信息
- RegionServer失效
- HMaster将失效RegionServer上的Region分配到其他节点
- HMaster更新hbase:meta表以保证数据正常访问
- HMaster失效
- 处于Backup状态的其他HMaster节点推选出一个转为Active状态
- 数据能正常读写,但是不能创建删除表,也不能更改表结构
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 zoubinbf@163.com