文章目录
HBASE的基本概念
hive和HBASE区别
- hive是数据仓库的工具, hive不是真正保存数据的, 而是对HDFS上的数据的一个映射, 而HBASE是一个数据库, 数据是由HBASE来保存的.
- hive主要是用来分析数据, 而HBASE主要是用来保存数据的
HBASE与HDFS的区别
- HDFS是一个分布式存储系统, 能够存储大量的数据, 但是不支持查询等操作, 而HBASE是建立在HDFS上的数据库
- HDFS不支持单条记录的快速检索, 而HBASE是数据库, 检索是最基本的功能
- HDFS提供的是一个高延迟的处理, HBASE提供了单行记录低延迟的随机访问
HBASE与关系型数据库的区别
HBASE没有事务的支持, HBASE存储的数据都是非结构化或者半结构化的数据 , 而关系型数据库存储的都是结构化的数据
HBASE的来源
hadoop的诞生源自于谷歌的三大论文
谷歌论文 | 山寨框架 |
---|---|
GFS | HDFS |
mapreduce | mapreduce |
bigtable | HBASE(hadoop base) |
bigtable背景
谷歌搜索引擎爬取的网页, 都是非结构化数据, 如何存储数据变成了一个难题. bigtable的设计思想为多行三列的一个大表
HBASE继承了bigtable的思想, 开发了 面向列的, 可扩展的, 非关系型的数据库
非关系型数据库
- MongoDB : c++编写, 基于文档方式的存储, 存储格式是json格式
- redis: 基于内存的, key-value的形式, 通过key快速找到value
关系型数据库
- mysql
- Oracle
- SQLserver
HBASE解决的问题与诞生背景
-
互联网的公司数据一般都是爬取过来的, 大量的数据, 并且都是非结构化, 传统的数据库已经不能满足需求了
-
交通部门的摄像头, 每天拍摄的内容都是图象, 不能保存在关系型数据库
HBASE适合存储海量数据, 能够将查询速度范围控制在秒的级别, 并且HBASE是面向列存储的.
HBASE的特点
- 面向列: 存储都是按照列进行存储的
- 稀疏: 对于空的列式不占用空间的
- 无类型: HBASE存储的数据都是字符串, 没有数据类型.
HBASE的存储
- 列簇: 一个列簇下边保存多个列, 所谓的列簇指的就是一组列
- 行键: HBASE没有主键的概念, 但是存在行键(rowkey)的概念, 可以把行键理解成主键, 行键就是一条记录的唯一标识
- 版本: 用于表示更新的数据, 也可以作为数据的检索项
- 单元格: 最小的存储单元, 在检索数据的时候, 可以通过以下方式进行单元格数据的唯一确定 rowkey+列簇+时间戳+value
HBSE架构
主要组件
- client : 访问HMaster
- Hmaster : 管理类的工作, 主要管理regionServer, 负载均衡, 管理元数据(数据库的名字, 表的名字)
- regionServer : 存放region, 而region里边存放的是真正的数据, 并且regionServer可以响应读写请求, 来管理表中的数据
- zookeeper : 保证对外提供服务的只有一台, 作为HBASE访问的入口, 切换HMaster的主备, HBASE的部分元数据也是保存在zookeeper中.
HBASE的安装
由于HBASE是基于HDFS上的, 所以在安装HBASE是, 必须存在hadoop, 另外HBASE依赖于zookeeper, 所以在及集群中存在zookeeper
HBASE完全分布式安装.
在完全分布式的安装中, 由于HBASE对时间的要求
- 解压HBASE安装文件到安装路径下
sudo tar -zvxf hbase-1.3.1-bin.tar.gz -C /opt/app/
- 修改权限为hadoop用户
sudo chown -R hadoop:hadoop hbase-1.3.1/
- 配置HBASE的环境 $HBASE/conf/hvase-env.sh
// 修改JAVA_HOME
export JAVA_HOME=/opt/app/jdk1.8.0_181
// 关闭自带的zookeeper, 不需要HBASE自带的zookeeper
export HBASE_MANAGES_ZK=false
- 配置HBASE-site.xml文件
// 配置HBASE临时目录
<property >
<name>hbase.tmp.dir</name>
<value>/opt/app/hbase-1.3.1/hbase</value>
</property>
// 配置hbase 临时目录保存位置
<property >
<name>hbase.rootdir</name>
<value>hdfs://ns1/hbase</value>
</property>
//设置hbase的存储模式为分布式存储
<property >
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
//设置hbase中zookeeper 的信息,地址为自己配置的主机名称
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop01,hadoop02,hadoop03</value>
</property>
- 配置hbase在hdfs上的保存路径,如果配置了HA 则路径必须和HA提供的路径一直,并且还需要把hdfs-site.xml 和 core-site.xml 两个配置文件复制到hbase的conf目录下
cp core-site.xml /opt/app/hbase-1.3.1/conf/
cp hdfs-site.xml /opt/app/hbase-1.3.1/conf/
- 配置regionservers 该文件类似于 salves 文件,描述的是 regionserver的节点信息. 在配置过程中存在几个regionserver 就写几个主机名称
hadoop01
hadoop02
hadoop03
- 修改 hbase中hadoop的jar包,由于hbase要操作hdfs,所以hbase需要hadoop的jar包支持。所以在hbase中配置环境中hadoop的jar包
- 分发hbase到不同的节点上
sudo scp -r hbase-1.3.1/ hadoop02:/opt/app/
sudo scp -r hbase-1.3.1/ hadoop03:/opt/app/
- 修改分发后的文件权限
启动HBASE
- 启动master服务(只需要启动一个)
bin/hbase-daemon.sh start master
- 启动 regionserver 服务 在3个节点上启动
bin/hbase-daemon.sh start regionserver
- 在web端查看, 端口号为16010
HBASE的基本使用(shell操作)
HBASE自带了shell操作, 而HBASE本身就是可以作为client
bin/base shell
在shell中删除时, 若出现不能删除时, 则可以使用Ctrl+delete进行删除, 在shell中可以通过help命令进行查看操作命令介绍
hbase(main):002:0> help
---------------------------------------------------
Group name: ddl
Commands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, locate_region, show_filters
Group name: namespace
Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables
Group name: dml
Commands: append, count, delete, deleteall, get, get_counter, get_splits, incr, put, scan, truncate, truncate_preserve
通过help命令可查看到很多操作信息,主要在shell操作中分为两类操作 ddl dml
HBASE—DDL
在hbase中没有数据库的概念,数据库的概念在hbase中称作namespace 可以理解为namespace就是关系型数据库中的数据库的概念,在namespace下面存在着数据表
namespace的操作
- 显示所有的namespace
hbase(main):003:0> list_namespace
NAMESPACE
default
hbase
student
3 row(s) in 0.0230 seconds
- 查看namespace下的所有表
hbase(main):004:0> create_namespace 'hbase'
0 row(s) in 1.4860 seconds
- 创建namespace
hbase(main):006:0> create_namespace 'nstest'
0 row(s) in 0.9010 seconds
- 查看namespace描述
hbase(main):007:0> describe_namespace 'nstest'
DESCRIPTION
{NAME => 'nstest'}
1 row(s) in 0.0630 seconds
- 删除namespace
hbase(main):008:0> drop_namespace 'nstest'
0 row(s) in 0.9190 seconds
table的操作
HBASE中提供的建表的实例
create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}
- ns1 : 表示namespace的名字
- t1 : 表名称
- f1 : 列簇名称
- => : 等于的意思
- {} : 定义一个列簇,不同列簇可以在不同{}中表示, 一个{}只能定义一个列簇
- {}中的变量名称必须为大写
- 在创建表的时候,可以指定一个namespace,如果没有指定namespace则创建的表在默认的namespace下
- 创建表, 没有指定namespace 则该表创建在默认的default中
hbase(main):009:0> create 'stu_info','f1'
0 row(s) in 4.4160 seconds
=> Hbase::Table - stu_info
- 创建表,并且指定一个namespace
hbase(main):038:0> create 'student:stu_info2','f1'
0 row(s) in 2.2320 seconds
=> Hbase::Table - student:stu_info2
Hbase是基于hdfs之上的,可以在HFDS上查看创建好的表
- 查看表的描述信息
hbase(main):039:0> desc 'stu_info'
Table stu_info is ENABLED
stu_info
COLUMN FAMILIES DESCRIPTION
{NAME => 'f1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP
_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMP
RESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '6553
6', REPLICATION_SCOPE => '0'}
1 row(s) in 0.0780 seconds
- 删除表. 删除表之前需要禁用该表, 然后再进行删除操作, 否则会抛异常
hbase(main):041:0> disable 'stu_info' //禁用要删除的表, 禁用是disable, 启用是enable
0 row(s) in 2.3570 seconds
hbase(main):042:0> drop 'stu_info' // 删除表
0 row(s) in 1.2420 seconds
HBASE—DML
插入数据
HBASE提供的实例:
help 'put'
hbase> put 'ns1:t1', 'r1', 'c1', 'value'
可以把put理解为mysql中的insert语句, 代表插入一条语句
ns1: 命名空间
t1: 表名称
r1: rowkey
c1: 要插入的值
value:
- 在默认的命名空间中创建一张表, 作为插入数据测试用
create 'hadoop' 'info','f1'
0 row(s) in 6.1850 seconds
=> Hbase::Table - hadoopinfo
- 插入数据
hbase(main):004:0> put 'hadoopinfo','1001','f1:name','zhangsan'
0 row(s) in 0.6470 seconds
hbase(main):004:0> put 'hadoopinfo','1001','f1:age','18'
0 row(s) in 0.2920 seconds
- 在插入数据的时候, rowkey都是以字符创的格式进行保存的, 它的最大长度可以保存64kb
查询数据
对于查询的数据可以使用get命令, get命令可以理解为快速查询, 不支持全表查询
- 查询指定的rowkey查询
hbase(main):007:0> get 'hadoopinfo', '1001'
COLUMN CELL
f1:age timestamp=1542082626437, value=18
f1:name timestamp=1542082513237, value=zhangsan
1 row(s) in 0.2580 seconds
- 按照指定的列簇进行查询
hbase(main):008:0> get 'hadoopinfo','1001','f1'
COLUMN CELL
f1:age timestamp=1542082626437, value=18
f1:name timestamp=1542082513237, value=zhangsan
1 row(s) in 0.0580 seconds
- 按照指定列簇下的列进行查询
hbase(main):009:0> get 'hadoopinfo','1001','f1:name'
COLUMN CELL
f1:name timestamp=1542082513237, value=zhangsan
1 row(s) in 0.0170 seconds
hbase(main):010:0> get 'hadoopinfo','1001','f1:age'
COLUMN CELL
f1:age timestamp=1542082626437, value=18
1 row(s) in 0.0110 seconds
get命令不支持全表查询, 如果要查询全表, 则可以使用scan命令, 类似于mysql中的select * from . 这种全表扫描的方式在企业开发中是不用的, 因为数据量特别大, 全表扫面所需要的时间特别长.
hbase(main):016:0> scan 'hadoopinfo' //禁止使用
ROW COLUMN+CELL
1001 column=f1:age, timestamp=1542082626437, value=18
1001 column=f1:name, timestamp=1542082513237, value=zhangsan
1 row(s) in 0.0180 seconds
hbase(main):015:0> scan 'hadoopinfo', {COLUMNS => 'f1:name'}//斟酌使用
ROW COLUMN+CELL
1001 column=f1:name, timestamp=1542082513237, value=zhangsan
1 row(s) in 0.0370 seconds
删除表
在删除表的时候, 可以使用delete, 可以按照指定的rowkey进行删除, 但是只删除一个列簇是删不掉的, 执行命令不报异常
hbase(main):017:0> delete 'hadoopinfo' ,'1001', 'f1'
0 row(s) in 0.1060 seconds
hbase(main):019:0> scan 'hadoopinfo'//查看删除后的数据
ROW COLUMN+CELL
1001 column=f1:age, timestamp=1542082626437, value=18
1001 column=f1:name, timestamp=1542082513237, value=zhangsan
1 row(s) in 0.0180 seconds
在删除时必须指定一个列
delete 'hadoopinfo' ,'1001', 'f1:name'