Hbase与NoSQL的关系、基础原理和表格操作

本文深入介绍了NoSQL数据库的特点和基本概念,包括CAP理论、BASE原则和MapReduce。接着详细阐述了Hbase,一个基于NoSQL的列存储数据库,分析了其物理和逻辑架构,以及HbaseShell的操作命令。Hbase适用于大数据场景,提供高并发读写和强一致性。文章最后展示了如何通过HbaseShell进行表、行和列簇的操作,以及用户权限管理和数据导入。
摘要由CSDN通过智能技术生成

一、Hbase和NoSQL

Hbase是一种非关系型数据库(NoSQL)。我们首先来介绍一下什么是NoSQL:
not only SQL,非关系型数据库

  • 指不遵循传统RDBMS模型的数据库 ;
  • 数据是非关系的,且不使用SQL作为主要查询语言;
  • 解决数据库的可伸缩性和可用性问题。可伸缩性指的是存储,可用性指的是吞吐;
  • 不针对原子性或一致性问题。主要针对事务相关的问题。不针对原子性,是指字段是可拆的

NoSQL数据库和关系型数据库的对比:
在这里插入图片描述

  • NoSQL中关联不像关系型数据那样方便,所以鼓励冗余,尽量一次只查一张表;
  • 结构化按列表查询,先识别区分度再查找;
  • 非结构化查询,一行一行读取,每行从头读到尾。

1.1、NoSQL特点

  • 最终一致性;
  • 应用程序增加了维护一致性和处理事务等职责;
  • 冗余数据存储;
  • NoSQL != 大数据
    NoSQL产品是为了帮助解决大数据存储问题,而大数据不仅仅包含数据存储的问题,例如:Hadoop、Kafka、Spark,,etc

1.2、NoSQL的基本概念

可以分成以下四部分:三大基石、indexing和Query、MapReduce、Sharding

1.2.1、三大基石

1、CAP
数据库最多支持3个中的2个

  • Consistency(一致性)
  • Availability(可用性)
  • Partition Tolerance(分区容错性)
    可用性是最基本的需要,一致性和分区容错性在数据处理时很难同时支持,只保证“最终一致性”。
    NoSQL不保证“ACID”。ACID是指事物具有的四个特征:
    Atomicity:原子性;
    Consistency:一致性;
    Isolation:隔离性;
    Durability:持久性。

2、BASE

  • Basically Availble(基本可用)
    -保证核心可用
  • Soft-state(软状态)
    -状态可以有一段时间不同步
  • Eventual Consistency(最终一致性)
    -系统经过一定时间后,数据最终能够达到一致的状态
  • 核心思想是即使无法做到强一致性,但应用可以选择适合的方式达到最终一致性

3、最终一致性

  • 最终结果保持一致性,而不是时时一致;
  • ’如账户余额,库存量等数据需强一致性 ;
  • 如catalog等信息不需要强一致性
    -Causal consistency(因果一致性)
    -Read-your-writes consistency:读取你的写入,此时可以保证一致性;
    -Session consistency
1.2.2、索引和查询

Indexing索引

  • 大多数NoSQL是按Key进行索引,部分运行二级索引;
  • HBase使用HDFS,append-only(仅追加)
    -批处理写入Logged
    -重新创建并排序文件
    Query查询
  • 没有专门的查询语言,通常使用脚本语言查询;
  • 有些开始支持SQL查询;
  • 有些可以使用MapReduce代码查询。
1.2.3、MapReduce和Sharding

MapReduce

  • 不是Hadoop的MapReduce,概念相关
  • 可进行数据的处理查询

Sharding(分片)

  • 一种分区模式;
  • 可以复制分片
    -有利于灾难恢复

1.3、NoSQL的分类

在这里插入图片描述
键值存储数据库通常使用hash table来实现,可以通过key来对数据实现增删查。它还常应用于内容的缓存,但吧使用与需要事务支持的场景;
列存储数据库它是将数据存储在列簇中,没一个列簇包含kv键值对的“列”,可以随行变化。它的优点是查询速度快,可扩展性强,容易进行分布式扩展;
文档性数据库是将数据以文档的形式进行存储,文档通常为JSON对象,也可以使用XML,每个文档都有属性和值,值可以是简单数据类型或复杂数据类型。它的主要优点是数据结构要求不严格,表结构可变,可以使用它存储不用的信息。
图数据可是将数据以图的方式存储,使用与关系性强的数据,推荐的引擎:Neo4j。

1.3.1、NoSQL和BI、大数据的关系

BI即Bussiness Intelligence商务智能
它是一套完整的解决方案,BI应用涉及模型,模型依赖于模式。BI主要支持标准SQL,对NoSQL支持弱于关系型数据库。

NoSQL和大数据相关性较高,通常大数据场景采用列存储数据库,例如Hbase和Hadoop。

二、Hbase

  • HBase是一个领先的NoSQL数据库
    -是一个面向列存储的数据库,是一个分布式hash map。它基于Google Big Table论文,使用HDFS作为存储并利用其可靠性
    HBase特点
  • 数据访问速度快,响应时间约2-20毫秒
  • 支持随机读写,每个节点20k~100k+ ops/s
  • 可扩展性,可扩展到20,000+节点
    应用场景
  • 增量数据-时间序列数据:高容量,高速写入;
  • 信息交换-消息传递:高容量,快速写入;
  • 内容服务-Web后端应用程序:高容量,高速读写;

2.1、Hbase物理架构

Master/Slave
Hbase采用Master/Slave架构。
HMaster是Hbase集群的主节点,可以配置多个,用来实现HA。
同时负责管理和分配Region,保证RegionServer的负责均衡。如发现有实效的RegionServer会重新分配其上的Region.
在Hbase中,表的行是按照rowkey的字典序排列的(键值是字符串类型),表在行的方向上分割为多个分区Region.每张表开始的时候只有一个Region,但会随着数据的插入,Hbase会将表进行水平拆分,分成更多的Region.
RegionServer
RegionServer负责管理和维护Region。

  • 一个RegionServer包含一个WAL、一个BlockCache (读缓存)和多个Region
  • 一个Region包含多个存储区,每个存储区对应一个列族 一个存储区由多个StoreFile和MemStore组成
  • 一个StoreFile对应于一个HFile和一个列族 HFile和WAL作为序列文件保存在HDFS上
  • Client与RegionServer交互
    Region和Table
  • 单个Table(表)被分区成大小大致相同的Region
  • Region是HBase集群分布数据的最小单位
    Region被分配给集群中的RegionServer
  • 一个Region只能分配给一个RegionServer

2.2、Hbase逻辑架构-ROW

  • Rowkey(行键)是唯一的并已排序
  • Schema可以定义何时插入记录
    -Schema是存储Hbase的元数据结构,知道集群中有哪些Table,每个Table有哪些列蔟
  • 每个Row都可以定义自己的列,即使其他Row不使用
    -相关列定义为列族
    使用唯一时间戳维护多个Row版本
    -在不同版本中值类型可以不同
  • HBase数据全部以字节存储

2.3、Hbase架构的特点

  • 强一致性
  • 自动扩展:当Region变大会自动分割。使用HDFS扩展数据并管理空间
  • 写恢复:使用WAL(Write Ahead Log)
  • 与Hadoop集成

三、Hbase Shell即操作

Hbase Shell是一种操作Hbase的交互模式。我们可以通过它进入Hbase的命令行进行操作。
在进入之前我们需要先安装好Hbase。如果还未安装可以参考本篇文章安装Hbase。
Hbase的安装
本篇博文使用的是1.2.0版本的Hbase。
安装完成后,先启动HMaster:

hbase-daemon.sh start master

在这里插入图片描述
然后通过hbase shell 进入Hbase操作命令行:

hbase shell

查看版本:

version

在这里插入图片描述
查看当前状态:

status

在这里插入图片描述
查看帮助信息:

help

在这里插入图片描述

3.1、Hbase的基本命令

3.1.1表

创建:
格式:create ‘表名’,{NAME=>‘列蔟名’},{NAME=>‘列蔟名’}…
例如:

create 'test',{NAME=>'id'},{NAME=>'name'}

在这里插入图片描述

查看:
list查看所有的表

list

在这里插入图片描述
desc查看表结构:

desc 'test'

在这里插入图片描述
scan查看表内容:

scan 'test'

此时表里数据还是空的
在这里插入图片描述
删除:
每一个列蔟对应一个时间戳,是在不断变化的,所以当我们要删除表时,需要先停止它。关键字disable。恢复是enable

disable 'test'

然后删除

drop 'test'

还有一种是truncate '表名’
清空数据,key-value也删除。不过保留表结构。
修改表名:
修改表名分三步
格式:
snapshot ‘表名’,‘镜像名’
clone_snapshot ‘镜像名’,‘新表名’
delete_snapshot ‘镜像名’
例:
首先先建立一个镜像(拍快照),相当于是给现有的表拍了快照

snapshot 'test','temp'

然后用新表克隆镜像,得到新表

clone_snapshot 'temp','person'

到这一步其实相当于是增加了一个新的表
在这里插入图片描述
我们还需要删除镜像。镜像并不会显示在列表中,但是如果我们不删除的话,下次这个镜像名就无法再使用,会报错
在这里插入图片描述
所以需要先删除镜像名

delete_snapshot 'temp'
3.1.2行

增加:
put ‘表名’,‘行键’,‘列蔟:列名’,‘值’[,时间戳]

put 'person','1','id:stuid','01'

person是表名,1是行键,这是一个字符串类型,stuid是列蔟,
在这里插入图片描述
cell=值+时间戳
表数据中,column是列簇和列名,timestamp是时间戳,value就是我们插入的值…

删除:
格式 delete 表名,行键

delete 'test','1'

在这里插入图片描述

3.1.3列蔟

列蔟在建表的时候需要指定。
新增:
alter ‘表名’,NAME=>'列蔟名’

alter 'test',NAME=>'course'

新增成功
在这里插入图片描述
删除:
alter ‘表名’,NAME=>‘列蔟名’,METHOD=>'delete’

alter 'test',NAME=>'course',METHOD=>'delete'

已删除
在这里插入图片描述
修改:
实际上Hbase表一旦建立,列簇的名字就无法修改了,如果列簇名有误,需要先添加一个想要的列簇,再把错误的删除掉,不过一旦这么操作,那么你原先列簇的数据也将随着删除,所以最好在插入数据前就确定好列簇名。
修改列蔟需要先增加后删除
alter ‘customer’,{NAME=>‘sample’},{NAME=>‘order’,METHOD=>‘delete’}

alter 'test',{NAME=>'Person_id'},{NAME=>'id',METHOD=>'delete'}

修改成功
在这里插入图片描述
查看每行数据:
get ‘表名’,‘行键’[,‘列蔟名’]

get 'test','1'

在这里插入图片描述

3.2用户权限

修改hbase-site.xml文件:

<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property>
<name>hbase.superuser</name>
<value>root</value>
</property>

然后重新启动HMaster,进入Hbase

hbase-daemon.sh restart master

用户赋权
grant ‘用户名’, 'RWXCA’
R:read读
W:write写
X:exec执行
C:createc创建
A:admin管理员

grant 'root','RWXCA'

user_permission
列出特定表的权限:

user_permission 'test'

在这里插入图片描述

3.3将文档导入Hbase

 hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \
-DDimporttsv.separator=","  \
-Dimporttsv.columns="HBASE_ROW_KEY,列蔟名:列名,..."  \
"表名"  HDFS上的文件路径

斜杠\表示换行,

数据:

在这里插入图片描述

表格创建完成后,把文件上传到相应位置,然后
在linux中输入:

hbase org.apache.hadoop.hbase.mapreduce.ImportTsv 
-Dimporttsv.separator="," 
-Dimporttsv.columns="HBASE_ROW_KEY,emp:name,emp:job_title,emp:company,time:sDate,time:eDate" "emp_basic" /test/emp_basic.csv

Hbase命令行查看

get 'emp_basic','emp_id'

四、总结

我们结合下面这个表格来做个总结
在这里插入图片描述
Hbase中每个列名归属于一个列簇,每个列簇都有自己对应的时间戳。当我们建表的时候,只建立了列簇名,例如

create 'test',{NAME=>'id'},{NAME=>'name'}

放到表格里,就是id就是列簇1,name就是列簇2。当我们插入数据的时候,先指定插入的行键,这里的行键是字符串形式的,所以如果你想把数字当做行键,想让他排序,有时是行不通的,所以有时不会用数字来当做行键。
结合我们的插入语句来看。

put 'person','1','id:stuid','01'

id即为列簇,而stuid就是列名,01是值
在这里插入图片描述
此时我们也可以在id列簇下再增加一个列:

put 'test','1','id:teachid','t1'

此时表格就变成了
在这里插入图片描述
我们还可以继续在新的列簇写入数据:

 put 'test','2','name:teachName','Mr.li'

在这里插入图片描述
由此可见。Hbase的表格允许有许多的空值,而且不影响以后的插入。有时候表格可能看起来十分稀疏。这样也方便了我们数据的插入。
一个列簇可以包含很多列,每个key/value在HBase中都被定义成一个cell,每一个cell都有一个rowkey,一个columnFamily,一个value值,一个timestamp。rowkey不能为空且唯一。
Hbase不支持批量插入,即一次只能插入一条数据。
Hbase的特点:

  1. 表特别大,一个表可以有数亿行,上百万列;
  2. 空列(null)不占内存空间,所有表可以设计的十分稀疏;
  3. 面向列:HBase是面向列的的存储和权限控制,列族独立索引;
  4. 无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态增加,同一个表中的不同行的可以有截然不同的列;
  5. 数据类型单一:HBase中的数据都是字符串,没有类型;
  6. 数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳.
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值