目录
一、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的特点:
- 表特别大,一个表可以有数亿行,上百万列;
- 空列(null)不占内存空间,所有表可以设计的十分稀疏;
- 面向列:HBase是面向列的的存储和权限控制,列族独立索引;
- 无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态增加,同一个表中的不同行的可以有截然不同的列;
- 数据类型单一:HBase中的数据都是字符串,没有类型;
- 数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳.