Hbase的安装部署
Hbase 基本介绍
hbase 建立在HDFS之上的bigtable java版本。
hbase是一个数据库。
不支持join等复杂sql操作,
不支持复杂的事务(行级的事务)
Hbase中支持的数据类型:byte[]
一个表可以有上十亿行,上百万列
面向列(族)的存储
使用key-value操作数据
对于为空(null)的列,并不占用存储空间, 表可以设计的非常稀疏。
Hbase使用场景
海量数据、精确查询、快速返回。
海量数据:是背景(数据量)
精确查询:是业务场景。
快速返回: 是业务对性能要求。
Hbase的特性
高可靠
性能高
列式存储
可伸缩
实施读取
noSQL(不支持SQL)
hbase用途
主要用来存储结构化和半结构化的松散数据。
hdfs:什么都能存储
MR:不能做快速返回
最初的大数据,只有hdfs+ MR ,此时众多的企业有的数据依然是结构化数据(存储数据库内)。大数据内没有提供快速查询的技术。
需求:就是在大数据内添加一个能够处理(快速查询)结构化数据的组件。hbase在最初设计的时候就考虑了扩展性。hbase具有很好的扩展性。
HBase与Hadoop的关系
HDFS
适合一次读取大量数据,例如:10G 1t
不适合读取少量(几条)数据。
适合一次写入多次读取
HBASE
不适合一次读取大量数据,例如:10G 1t
适合读取少量(几条)数据。
多次写入多次读取
RDBMS与HBase的对比
RDBMS
支持sql
支持事务
支持Join
HBASE
不支持sql
不支持事务
不支持Join
HBase特征简要
1 海量存储
Hbase适合存储PB级别的海量数据,在几十到百毫秒内返回数据。
2 列式存储
这里的列式存储其实说的是列族存储
3 极易扩展
处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。
4 高并发
这里说的高并发,主要是在并发的情况下,Hbase的单个IO延迟下降并不多
5 稀疏
在列数据为空的情况下,是不会占用存储空间的。
hbase 基础架构
Client
Zookeeper
Master
Redgionserver
hbase shell 命令
创建表 表明+ N 个列族
create ‘user’, ‘info’, ‘data’
向表添加数据 : 表名 + rowkey +列族:列 + 列的值
put ‘user’, ‘rk0001’, ‘info:name’, ‘zhangsan’
根据数据查询
get ‘user’, ‘rk0001’, {FILTER => “ValueFilter(=, ‘binary:zhangsan’)”}
包含某个字符
get , ‘rk0001’, {FILTER => “(QualifierFilter(=,‘substring:a’))”}
HABSE底层原理
底层架构
这里一个regionserver就是一个hbase的服务器
Client:
访问hbase底层数据的入口,含访问hbase的API接口,维护着一些cache来加快对hbase的访问
Zookeeper:
1、zk的选举机制 保证任何时候,集群中只有一个master
2、 实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master
3、 存贮所有Region的寻址入口
4 、存储Hbase的schema,包括有哪些table,每个table有哪些column family
Master职责
1 为Region server分配region
2 负责region server的负载均衡
3 发现失效的region server并重新分配其上的region
4 处理schema更新请求
说明:client访问hbase上数据的过程并不需要master参与,master仅仅维护者table和region的元数据信息
Region Server职责
1 Region server维护Master分配给它的region,处理对这些region的IO请求
2 Region server负责切分在运行过程中变得过大的region
HBase的表数据模型
Row Key(hbase最重要的设计)
访问hbase数据的方式(作用在rowkey)
1 通过单个row key访问、
2 通过row key的start key, endkey
3 全表扫描
rowkey 的要求:
最大长度是 64KB
Hbase会对表中的数据按照rowkey排序(字典顺序)
列族Column Family
列族是表的schema(表名称-列族)的一部分,而列不是。
每个列,都归属与某个列族
列Column
列族下面的具体列,属于某一个ColumnFamily
时间戳
时间戳可以由hbase(在数据写入时自动 )赋值,工程师也可以自己设置时间戳。
不同版本的数据按照时间倒序排序。
hbase提供了两种数据版本回收方式:
1 保存数据的最后n个版本
2 保存最近一段时间内的版本
hbase确定一个数据
{row key, column( = + ), version} 唯一确定的单元。
hbase物理存储结构
整体结构
一个regionserver内可以存储多个表的region
一个表内的region,只属于这个表。但是这个表的region,可能分配到不同的节点(regionserver)上。
region 的拆分
region按大小分割的(默认10G),每个表一开始只有一个region,当数据量达到阈值(10G)时,会将一个region 等分成两个region.
region是Hbase中分布式存储和负载均衡的最小单元,
regionserver与region是一对多的关系。一个region是能属于一个regionserver.一个regioserver可以存储多个region
rgion内部细分
HRegion由一个或者多个Store组成,每个store保存一个column family。每个Strore又由一个memStore和0
至多个StoreFile组成
数据查询时,客户端检索数据时,先在memstore找,找不到再找storefile。
Hlog(WAL)
每个Region Server维护一个Hlog,而不是每个Region一个.
作用:数据在写入内存之前优先写入Hlog, 防止数据丢失。防止数据写入内存后,没有flush之前,断电导致内存内的数据丢失。
弊端:数据的写入速度相对较慢,慢的原因是数据写操作执行两次。
Hlog日志可以关闭,关闭后写入速度能够加快,但是存在数据丢失的风险。
Hlog日志的拆分
1、放数据写入日之后,如果发生异常,那么就会关闭当前日志文件,
2、日志人间大小维度:当日志文件大小达到一定的量时,就会关当前日志,生成新的日志。
日志的大小是HDFS数据块大小的0.95倍。
3、时间维度:默认的时间为1小时,即一个小时生成一个日志文件
hbase读写过程
hbase读的过程
前置条件:
1、什么是meta表
meta表是hbase自带的一个表。这里存储的数据是每个region的startkey 和endkey等信息
2、meta表存在哪里
存储在某个regionserver.
读取流程
1、首先Client先去访问zookeeper,从zookeeper里面获取meta表所在的位置信息
2、Client通过刚才获取到的IP来访问Meta,读取Meta内的数据,
3、Client通过元数据(meta表内的数据)中存储的信息,找到region在哪个HRegionServer ,访问对应的HRegionServer读取数据
三步找到原始数据
1、到zookeeper找到meta
2 通过meta找到数据所属的region
3 通过region和regionserver的对应关系,找到regionserver,
最后读取数据