HBase

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
    2
    export HBASE_HOME=/root/bigdata/hbase
    export PATH=$HBASE_HOME/bin:$PATH
    • 配置hbase-evn.sh
    1
    2
    export 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
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 连接集群
hbase shell
# 创建表
create '表名', '列族名'
# 删除表
disable '表名'
drop '表名'
# 创建名称空间
create_namespace '库名'
# 展示现有名称空间
list_namespace
# 创建表的时候添加namespace
create '库名:表名', '列族名'
# 显示某个命名空间下由哪些表
list_namespace_tables '库名'
# 插入数据
put '表名', 'RowKey', '列族:列标识符', '值'
# 查询表中所有数据
scan '表名'
# scan 条件查询 通过COLUMNS LIMIT STARTROW 等条件缩小查询范围
scan '名称空间:表名', {COLUMNS => ['列族1', '列族1'], LIMIT => 显示条数, STARTROW => '起始的rowkey'}
# scan查询添加rowkey前置过滤器
scan '表名', {ROWPREFIXFILTER => "rowkey前缀"}
# 删除表中数据
delete '表名', 'rowkey', '列族名:列修饰符'
# 清空数据
truncate '表名'
# 操作列簇
alter '表名', NAME => '列族名'
alter 'user', 'delete' => '列族名'
# HBase 追加型数据库 会保留多个版本数据 VERSIONS=>'1'说明最多可以显示一个版本 修改数据
desc 'user' Table user is ENABLED user COLUMN FAMILIES DESCRIPTION
{NAME => 'base_info', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_B
HE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MI
ER => 'NONE', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOM
se', COMPRESSION => 'NONE', BLOCKCACHE => 'false', BLOCKSIZE => '65536'}
# 指定显示多个版本
get '表名','rowkey',{COLUMN=>'列族名:列修饰符',VERSIONS=>2}
# 修改可以显示的版本数
alter '表名',NAME=>'列族名',VERSIONS=>10
# 指定时间戳查询
scan '表名',{COLUMNS => '列族名', TIMERANGE => [时间戳, 时间戳]}
get '表名', 'rowkey', {COLUMN=>'列族名:列修饰符',VERSIONS=>2,TIMERANGE => [时间戳, 时间戳]}
# 通过时间戳过滤器 指定具体时间戳的值
scan '表名',{FILTER => 'TimestampsFilter (时间戳, 时间戳)'}
get '表名','rowkey',{COLUMN=>'列族名:列修饰符',VERSIONS=>2,FILTER => 'TimestampsFilter (时间戳, 时间戳)'}
# 获取最近多个版本的数据
get '表名','rowkey',{COLUMN=>'列族名:列修饰符',VERSIONS=>10}
# 通过指定时间戳获取不同版本的数据
get '表名','rowkey',{COLUMN=>'列族名:列修饰符',TIMESTAMP=>时间戳}
  • 命令表

使用HappyBase操作HBase

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
# 安装
pip install happybase
# 建立连接
import happybase
conn = happybase.Connection('IP')
# 关闭连接
conn.close()
# 获取HBase中所有的表
conn.tables()
# 创建表
conn.create_table('表名', {'列族': dict()})
# 创建表之后可以传入表名获取Table实例
table = conn.table('表名')
# 全表查询
table.scan()
# 查询一行
table.row('rowkey')
# 查询多行
table.rows(['rowkey','rowkey'])
# 插入数据
table.put('rowkey', {'列族名:列修饰符':'值'})
# 删除数据
table.delete('rowkey', ['列族名:列修饰符'])
# 删除表
conn.delete_table('表名', True)

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

×

喜欢就点赞,疼爱就打赏