快速上手NoSQL数据库HBase-1
1 快速了解HBase
HBase简介
1 | 在前面我们学习过了Hive,一句话概括Hive就是一个数据仓库,更像一个传统意义上的SQL数据库,主要用作数据仓库数据分析,更加强调离线的数据分析,为公司各个业务部门提供数据支撑。 |
1 | 比如有这么一个例子:公司原来的业务系统使用的是Oracle,目前数据量大约10亿条,处理响应非常慢。为了平缓的迁移到大数据平台,那么决定使用hive替换oracle,这种方案怎么样? |
1 | 那么,HBase到底是一个怎么样的NoSQL数据库呢?我们来看一下。 |
列式存储简介
1 | 传统的关系型数据库,如MySQL、Oracle等采用行存储的方式来存储数据 |
1 | 缺点是不适合查询少量字段的情况。就算是你只需要查询某一个列的数据,底层也需要读取这一行中所有列的数据,最后只过滤出来你需要的某个列,这是由它的底层数据结构而定的。 |
1 | 在基于行式存储的数据库中,数据是按照行数据为基础逻辑存储单元进行存储的,一行中的数据在存储介质中以连续存储形式存在。 |
列式存储的优点
1 | 行式数据库在做一些列分析时,必须将所有列的信息全部读取出来,而列式数据库由于其是按列存取,因此只需在特定列做I/O即可完成查询与分析,效率节省90%。 |

1 | Row-based(Row-based store):行式存储。 |
1 | 从这个图里面可以看出来: |
HBase典型应用场景

1 | 1.半结构化或非结构化数据 |
1 | 2.记录非常稀疏 |
1 | 3.多版本数据 |
1 | 4.超大数据量 |
HBase应用案例

1 | 淘宝在2011年之前所有的后端持久化存储基本上都是在MySQL上进行的,MySQL由于开源,并且生态系统良好,本身拥有分库分表等多种解决方案,因此很长一段时间内都可以满足淘宝大量业务的需求。 |
1 | 腾讯产品与技术的发展迅速,几乎任何一个与用户相关的在线业务的数据量都在亿级别,每日系统调用次数从亿到百亿,对海量数据的高效插入和快速读取变得越来越重要。 |
HBase的优缺点总结
HBase的优点

1 | 解释: |
HBase的缺点

1 | 解释: |
HBase逻辑存储模型之名词解释

1 | 解释: |
1 | 什么是逻辑存储模型呢?简单来说就是我们操作HBase的时候能够直观看到的一些东西 |

1 | 这个图的意思表示在HBase中有一张表,表里面有2个列族,c1和c2 |
1 | 想要达到图中这个数据效果,需要对表执行以下这些步骤: |
1 | HBase是 三维(三个维度) 有序存储的,是指Rowkey,Column key(Column Family和Column)和 TimeStamp 这三个维度是依照ASCII码表排序的。 |

1 | 这个图里面表示对HBase的表t1进行全表扫描,在扫描的时候会返回同一个列的最多2个历史版本数据(VERSIONS=>2)。 |
2 快速上手使用HBase
HBase安装部署
1 | HBase需要依赖于Hadoop(HDFS)和Zookeeper服务 |

1 | HBase与Hadoop版本对应关系如下: |

1 | 咱们本套课程中JDK使用的是1.8版本,HBase的所有版本都是支持的。 |
分布式集群
1 | 在这里就直接演示分布式集群的安装步骤了,伪分布集群和分布式集群的安装基本上没有多少区别。 |
1 | 下面开始安装部署: |
1 | 接下来修改hbase-site.xml |
1 | 前面这几个已有的参数修改完毕以后,还需要向hbase-site.xml中添加下面这些参数 |
1 | 4:将bigdata01中修改完配置的HBase目录远程拷贝到bigdata02和bigdata03上 |

1 | HBase提供的有web界面,可以通过浏览器确认集群是否正常启动,端口默认是16010 |
HBase常用Shell命令
1 | HBase集群启动之后,下面我们来操作一下HBase |
1 | 在这里我们先看一下HBase中常用的一些shell命令 |
1 | 如何进入HBase的shell命令行? |
1 | 为了后期方便操作HBase,建议在PATH中配置一下HBASE_HOME |


基础命令
1 | 命令 解释 |
1 | hbase(main):001:0> status |
DDL命令
1 | 命令 解释 |
创建表
1 | 命令:create ‘表名’,‘列族1’,‘列族2’,'列族N’ |
列出所有表
1 | hbase(main):005:0> list |
禁用表/验证表是否被禁用
1 | hbase(main):006:0> disable 'student' |
启用表/验证表是否已启用
1 | 启用表 |
查看表的详细信息
1 | 命令:desc ‘表名’ 或者 desc ‘表名’ |
修改表结构
修改列族(版本数)
1 | 使用alter命令可以完成更改列族参数信息、增加列族、删除列族以及更改表等操作,在这里主要演示一下增加列族、修改列族和删除列族 |
1 | 注意: |
增加列族
1 | 2:增加列族 |
删除列族
1 | 3:删除列族 |
1 | 注意:HBase中的表至少要包含一个列族,因此当表中只有一个列族时,无法将其删除。 |
验证表是否存在
1 | 命令:exists '表名’ |
删除表/清空表(删除重建)
1 | 先创建一个表t1,包含1个列族info |
清空表
1 | 清空表其实包含了两步,删除+重建 |
增删改查命令(DML)
1 | 命令 解释 |
添加数据/修改数据
1 | HBase中没有insert方法,它也属于key-value类型的NoSQL数据库,类似于HashMap这种数据结构,所以它提供了put方法添加数据 |
1 | hbase(main):001:0> put 'student','jack','info:sex','man' |
查看数据
1 | 在查看数据的时候有这么几种用法 |
1 | 查询student中rowkey等于jack的info列族中的age列的数据 |
查看表中数据总条数
1 | 命令:count ‘表名’ |
扫描表中的数据
1 | 命令:scan '表名’ |
1 | scan后面可以添加过滤条件,扫描满足条件的数据,后面再分析 |
删除数据
1 | delete有这么几种用法: |
1 | 删除指定Rowkey中指定列族中指定列的数据 |
1 | 删除指定Rowkey中指定列族中指定列中时间戳小于2的数据 |
1 | 注意:delete 命令不能跨列族操作,如果需要删除表中的某一行数据,则需要使用 deleteall 命令,此时不需要指定列族和列的名称 |
HBase的namespace(命名空间)
1 | HBase的命名空间相当于MySQL中的Database |
1 | 使用list_namespace命令可以查看所有的命名空间,我们创建的表默认在default这个命名空间里面 |
1 | 可以选择创建一个新的namespace |
1 | 在创建表的时候可以选择创建到n1这个namespace中,如何实现呢? |
1 | 此时使用list查看所有的表 |
1 | 如果只想查看n1这个命名空间中的表,如何实现呢? |
HBase JavaAPI的使用
1 | 创建maven项目:db_hbase |
1 | 在src/main/java目录中创建package:com.imooc.hbase |
对表中的数据进行增删改查(DML)
1 | 首先需要获取HBase数据库连接 |
1 | 因为我们在连接HBase集群的时候在代码中指定的是zookeeper集群的地址信息,通过Zookeeper去查找HBase,HBase会在zookeeper里面存储自己的地址信息,存储的是主机名。 |
1 | 注意:代码在windows中执行的时候会提示缺少winutils.exe |
添加数据
1 | //获取Table对象,指定要操作的表名,表需要提前创建好 |
查询数据
1 | //获取Table对象,指定要操作的表名,表需要提前创建好 |
查询多版本数据
1 | //获取Table对象,指定要操作的表名,表需要提前创建好 |
删除数据
1 | //获取Table对象,指定要操作的表名,表需要提前创建好 |
创建和删除表(DDL)
1 | 想要操作表,也就是执行DDL操作,需要获取管理员权限,通过HBase获取 |
创建表
1 | //指定列族信息 |
删除表
1 | //删除表,先禁用表 |
完整代码
1 | 最后对代码进行抽取,便于查看,完整代码如下: |
1 | package com.imooc.hbase; |