文章目录
- 大数据数据库之hbase
- 一、课前准备
- 二、课堂主题
- 三、课堂目标
- 四、知识要点
- 五、拓展点、未来计划、行业趋势 (5分钟)
- 六、总结
- 七、作业
- 八、互动问答
- 九、题库 - 本堂课知识点
大数据数据库之hbase
一、课前准备
- 安装好对应版本的hadoop集群
- 安装好对应版本的zookeeper集群
二、课堂主题
本堂课主要围绕hbase的基础知识点进行讲解。主要包括以下几个方面
- hbase的核心概念
- hbase的特点
- hbase的架构图
- hbase存储数据结构
- hbase的安装部署
- hbase shell命令基本操作
三、课堂目标
- 理解hbase的核心概念
- 掌握hbase的特点
- 掌握hbase的架构
- 掌握hbase存储数据结构
- 掌握hbase的安装部署
- 掌握hbase shell命令基本操作
四、知识要点
1. hbase是什么(15分钟)
漫画学习hbase----最易懂的Hbase架构原理解析
http://developer.51cto.com/art/201904/595698.htm
1.1 hbase的概念
- hbase基于Google的BigTable论文,是建立的hdfs之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的分布式数据库系统。在需要实时读写随机访问超大规模数据集时,可以使用hbase。
1.2 hbase的特点
-
海量存储
- 可以存储大批量的数据
-
列式存储
- hbase表的数据是基于列族进行存储的,列族是在列的方向上的划分。
- hbase表的数据是基于列族进行存储的,列族是在列的方向上的划分。
-
极易扩展
- 底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加datanode节点服务(机器)就可以了
- 可以通过增加服务器来提高集群的存储能力
-
高并发
- 支持高并发的读写请求(支持大量的客户端同时访问hbase表)
-
稀疏
- 稀疏主要是针对Hbase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。
-
数据的多版本
- hbase表中的数据可以有多个版本值,默认情况下是根据版本号去区分,版本号就是插入数据的时间戳
-
数据类型单一
- 所有的数据在hbase中是以字节数组 进行存储
-
和hive的区别
-
hive只是一个工具(通过SQL语句处理后转换成了mr程序),hive是对数据分析,hbase是对数据进行海量的存储(查询效率非常高),hbase支持数据的实时读写,性能非常的高。
-
hbase是数据库,hive是工具(通过写mr程序对大量数据进行分析)
2、hbase整体架构(20分钟)
-
1、Client
- 客户端
- Client包含了访问Hbase的接口
- 另外Client还维护了对应的cache(对于经常访问的数据做cache缓存)来加速Hbase的访问,比如cache的.META.元数据的信息
- 客户端
-
2、Zookeeper
- zookeeper集群
- 作用
- 实现了HMaster的高可用
- 保存了hbase的元数据信息,是所有hbase表的寻址入口
- 对HMaster和HRegionServer实现了监控
- 作用
- zookeeper集群
-
3、HMaster
- hbase集群的老大
- 作用
- 为HRegionServer分配Region
- 维护整个集群的负载均衡
- 维护集群的元数据信息
- 发现失效的Region,并将失效的Region分配到正常的HRegionServer上
- 作用
- hbase集群的老大
-
4、HRegionServer
- hbase集群中的小弟
- 负责管理Region
- 接受客户端的读写数据请求
- 切分在运行过程中变大的region
- hbase集群中的小弟
-
5、Region
-
hbase集群中分布式存储的最小单元
3、hbase表的数据模型(20分钟)
-
rowkey
- 行键
- table的主键,table中的记录按照rowkey 的字典序进行排序
- table的主键,table中的记录按照rowkey 的字典序进行排序
- 行键
-
Column Family
- 列族
- hbase表中的每个列,都归属与某个列族。列族是表的schema的一部分(而列不是),必须在使用表之前定义。
- 列族
-
Timestamp
- 时间戳
- 每次数据操作对应的时间戳,可以看作是数据的version number版本号
- 每次数据操作对应的时间戳,可以看作是数据的version number版本号
- 时间戳
-
Column
- 列
- 列族下面的具体列
- 属于某一个ColumnFamily,类似于我们mysql当中创建的具体的列
- 列
-
cell
- 单元格
- 由{row key, column( = +
- cell中的数据是没有类型的,全部是以字节数组进行存储
- 单元格
4、hbase集群安装部署(5分钟)
-
1、下载安装包
- http://archive.apache.org/dist/hbase/1.2.1/hbase-1.2.1-bin.tar.gz
- hbase-1.2.1-bin.tar.gz
-
2、规划安装目录
- /opt/bigdata
-
3、上传安装包到服务器
-
4、解压安装包到指定的规划目录
- tar -zxvf hbase-1.2.1-bin.tar.gz -C /opt/bigdata
-
5、重命名解压目录
- mv hbase-1.2.1 hbase
-
6、修改配置文件
-
1、需要把hadoop中的配置core-site.xml 、hdfs-site.xml拷贝到hbase安装目录下的conf文件夹中
-
2、修改conf目录下配置文件
- 修改 hbase-env.sh
#添加java环境变量 export JAVA_HOME=/opt/bigdata/jdk #指定使用外部的zk集群 export HBASE_MANAGES_ZK=FALSE
- 修改 hbase-site.xml
<configuration> <!-- 指定hbase在HDFS上存储的路径 --> <property> <name>hbase.rootdir</name> <value>hdfs://node1:9000/hbase</value> </property> <!-- 指定hbase是分布式的 --> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 指定zk的地址,多个用“,”分割 --> <property> <name>hbase.zookeeper.quorum</name> <value>node1:2181,node2:2181,node3:2181</value> </property> </configuration>
- 修改regionservers
#指定regionserver节点 node2 node3
- 修改backup-masters(指定hbase集群备用的hmaster地址)
node2
-
-
7、配置hbase的环境变量
export HBASE_HOME=/opt/bigdata/hbase(这里要按照自己的jave安装目录来配置) export PATH=$PATH:$HBASE_HOME/bin
-
8、分发hbase目录和环境变量到其他节点
scp -r hbase node2:/opt/bigdata scp -r hbase node3:/opt/bigdata scp /etc/profile node2:/etc scp /etc/profile nod3:/etc
-
9、让所有节点的hbase环境变量生效
- 在所有节点执行
- source /etc/profile
- 在所有节点执行
5、hbase集群的启动和停止(5分钟)
5.1 启动
- 前提条件:先启动hadoop和zk集群
- 启动hbase
- start-hbase.sh
我们启动zk的时候要每个节点分别启动有些麻烦,后期如果节点非常多的话会很麻烦,因此可以通过写一个脚本来实现同时启动多台机器的zkServer.sh
- 一键启动zk脚本
- 一键关闭zk的脚本
5.2 停止
- 停止hbase
- stop-hbase.sh
6、hbase集群的web管理界面(5分钟)
启动好hbase集群之后,可以访问地址:HMaster的主机名:16010
例如:
http://node1:16010
可以看到整个hbase集群的相关信息.
7、hbase shell 命令基本操作(25分钟)
详细见《HBase常用shell操作.md》操作文档
HBase常用shell操作
1、进入Hbase客户端命令操作界面
hbase shell
2、查看帮助命令
hbase(main):001:0> help
3、查看当前数据库中有哪些表
hbase(main):006:0> list
4、创建一张表
- 创建user表, 包含base_info、extra_info两个列族
hbase(main):007:0> create 'user', 'base_info', 'extra_info'
或者
create 'user', {NAME => 'base_info', VERSIONS => '3'},{NAME => 'extra_info'}
5、添加数据操作
- 向user表在这里插入图片描述中插入信息,row key为 rk0001,列族base_info中添加name列标示符,值为zhangsan
hbase(main):008:0> put 'user', 'rk0001', 'base_info:name', 'zhangsan'
- 向user表中插入信息,row key为rk0001,列族base_info中添加gender列标示符,值为female
hbase(main):009:0> put 'user', 'rk0001', 'base_info:gender', 'female'
- 向user表中插入信息,row key为rk0001,列族base_info中添加age列标示符,值为20
hbase(main):010:0> put 'user', 'rk0001', 'base_info:age', 20
- 向user表中插入信息,row key为rk0001,列族extra_info中添加address列标示符,值为beijing
hbase(main):011:0> put 'user', 'rk0001', 'extra_info:address', 'beijing'
6、查询数据
6.1 通过rowkey进行查询
- 获取user表中row key为rk0001的所有信息
hbase(main):006:0> get 'user', 'rk0001'
6.2 查看rowkey下面的某个列族的信息
- 获取user表中row key为rk0001,base_info列族的所有信息
hbase(main):007:0> get 'user', 'rk0001', 'base_info'
6.3 查看rowkey指定列族指定字段的值
- 获取user表中row key为rk0001,base_info列族的name、age列标示符的信息
hbase(main):008:0> get 'user', 'rk0001', 'base_info:name', 'base_info:age'
6.4 查看rowkey指定多个列族的信息
- 获取user表中row key为rk0001,base_info、extra_info列族的信息
hbase(main):010:0> get 'user', 'rk0001', 'base_info', 'extra_info'
或者
hbase(main):011:0> get 'user', 'rk0001', {COLUMN => ['base_info', 'extra_info']}
或者
hbase(main):012:0> get 'user', 'rk0001', {COLUMN => ['base_info:name', 'extra_info:address']}
6.5 指定rowkey与列值查询
- 获取user表中row key为rk0001,cell的值为zhangsan的信息
hbase(main):013:0> get 'user', 'rk0001', {FILTER => "ValueFilter(=, 'binary:zhangsan')"}
6.6 指定rowkey与列值模糊查询
- 获取user表中row key为rk0001,列标示符中含有a的信息
hbase(main):015:0> get 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}
6.7 继续插入一批数据
hbase(main):016:0> put 'user', 'rk0002', 'base_info:name', 'fanbingbing'
hbase(main):017:0> put 'user', 'rk0002', 'base_info:gender', 'female'
hbase(main):018:0> put 'user', 'rk0002', 'base_info:birthday', '2000-06-06'
hbase(main):019:0> put 'user', 'rk0002', 'extra_info:address', 'shanghai'
6.8 查询所有数据
- 查询user表中的所有信息
hbase(main):020:0> scan 'user'
6.9 列族查询
- 查询user表中列族为 base_info 的信息
hbase(main):021:0> scan 'user', {COLUMNS => 'base_info'}
hbase(main):022:0> scan 'user', {COLUMNS => 'base_info', RAW => true, VERSIONS => 5}
## Scan时可以设置是否开启Raw模式,开启Raw模式会返回包括已添加删除标记但是未实际删除的数据
## VERSIONS指定查询的最大版本数
6.10 多列族查询
- 查询user表中列族为info和data的信息
hbase(main):023:0> scan 'user', {COLUMNS => ['base_info', 'extra_info']}
hbase(main):024:0> scan 'user', {COLUMNS => ['base_info:name', 'extra_info:address']}
6.11 指定列族与某个列名查询
- 查询user表中列族为base_info、列标示符为name的信息
hbase(main):025:0> scan 'user', {COLUMNS => 'base_info:name'}
6.12 指定列族与列名以及限定版本查询
- 查询user表中列族为base_info、列标示符为name的信息,并且版本最新的5个
hbase(main):026:0> scan 'user', {COLUMNS => 'base_info:name', VERSIONS => 5}
6.13 指定多个列族与按照数据值模糊查询
- 查询user表中列族为 base_info 和 extra_info且列标示符中含有a字符的信息
hbase(main):027:0> scan 'user', {COLUMNS => ['base_info', 'extra_info'], FILTER => "(QualifierFilter(=,'substring:a'))"}
6.14 rowkey的范围值查询
- 查询user表中列族为info,rk范围是[rk0001, rk0003)的数据
hbase(main):028:0> scan 'user', {COLUMNS => 'base_info', STARTROW => 'rk0001', ENDROW => 'rk0003'}
6.15 指定rowkey模糊查询
- 查询user表中row key以rk字符开头的
hbase(main):029:0> scan 'user',{FILTER=>"PrefixFilter('rk')"}
7、更新数据
- 更新操作同插入操作一模一样,只不过有数据就更新,没数据就添加
7.1 更新数据值
- 把user表中rowkey为rk0001的base_info列族下的列name修改为zhangsansan
hbase(main):030:0> put 'user', 'rk0001', 'base_info:name', 'zhangsansan'
7.2 更新版本号
- 将user表的 base_info 列族版本号改为5
hbase(main):031:0> alter 'user', NAME => 'base_info', VERSIONS => 5
8、删除数据和表
8.1 指定rowkey以及列名进行删除
- 删除user表row key为rk0001,列标示符为 base_info:name 的数据
hbase(main):032:0> delete 'user', 'rk0001', 'base_info:name'
8.2 指定rowkey,列名以及字段值进行删除
- 删除user表row key为rk0001,列标示符为base_info:name,timestamp为1392383705316的数据
hbase(main):033:0> delete 'user', 'rk0001', 'base_info:age', 1564745324798
8.3 删除列族
- 删除 base_info 列族
hbase(main):034:0> alter 'user', NAME => 'base_info', METHOD => 'delete'
或者
hbase(main):035:0> alter 'user', 'delete' => 'base_info'
8.4 清空表数据
- 删除user表数据
hbase(main):036:0> truncate 'user'
8.5 删除表
- 删除user表
#先disable 再drop
hbase(main):036:0> disable 'user'
hbase(main):037:0> drop 'user'
#如果不进行disable,直接drop会报错
ERROR: Table user is enabled. Disable it first.
五、拓展点、未来计划、行业趋势 (5分钟)
8、Hbase在实际场景中的应用
8.1、交通方面
- 船舶GPS信息,全长江的船舶GPS信息,每天有1千万左右的数据存储。
8.2、金融方面
- 消费信息、贷款信息、信用卡还款信息等
8.3、电商方面
- 电商网站的交易信息、物流信息、游览信息等
8.4、电信方面
- 通话信息、语音详单等
总结:海量明细数据的存储,并且后期需要有很好的查询性能
六、总结
[外链图片转存失败(img-2u2gf5wC-1566567066432)(hbase_day01课程设计.assets/hbase基础知识点.png)]