本质:分布式、面向列
的开源数据库,Apache的Hadoop子项目。
适用于:非结构化数据存储的数据库
技术特点
- 大表
- 面向列:面向列族的存储和权限控制,列族独立检索
- 稀疏:对于为空(null)的列,并不占用存储空间
- 不基于MR、Yarn,而是基于自身的文件索引
- 无Join功能,做不了分析类处理,通常增删改查
- RS(Rgion Server),决定集群处理能力,支持水平扩展
- 用于实时读写场景,Online场景
适用场景
表数据量大(至少亿级别以上)、数据append业务、无跨行跨表事务要求、写入量大(每天千万级别以上)、读取场景简单不经常变化,查询场景固化、无正序,逆序的排序要求、不适合全量读取、RowKey不可发生变化
不适合场景
多维度索引,无二级索引
需要事务
分析类,即逻辑复杂查询
不适合Count操作
不适合多条件查询case
架构
Master 服务器:负责维护表结构信息
负责协调工作,如建表、删表、移动Region、合并等
RegionServer 服务器:负责数据的存储,直接存储在
Hadoop
的HDFS
上
存放 Region 的容器,相当于服务器上的服务
【 WAL(Write-Ahead Log:预写日志) | Region | Block Cache】
通常Hbase集群有 一个 Master
和 多个 RegionServer
client --->
ZooKeeper ----管理-->
RegionServer --->
HDFS
Region 一段数据集合
- 不能跨服务器
- 不足以存储所有数据时,HBase会自动拆分
- HBase进行负责均衡时,Region可能会在RegionServer之间移动
- 基于HDFS
【 store(对应一个列族)【 MemStore(数据排序) | HFile】】
【 HFile:【 Data | Data Index 】】
【 Data:【 BlockType | Cell(Key Value) 】】
【 Cell:【 Key Len | Value Len | TimeStamp | Key Type | Value 】】
RowKey
作用:索引、为组合性 最基本的存储单元是“列”
访问HBase Table中的行,只有三种方式:
- 通过单个 row key 访问
- 通过 row key 的 range
- 全表扫描
row key 可以是任意字符串,在hbase内部, row key 保存为字节数组
,存储时,数据按照 row key 的字典顺序
排序存储。
Columns Family
HBase 表中每个列,都归属于某个列族,相同列族的列 HBase 会尽量放在同一台机器上列族
是表的 schema
的一部分
,**而列不是
**,必须在使用表之前定义。
列名都以列族作为前缀:courses:history
访问控制、磁盘和内存的使用统计都是在列族层面进行的
create 'tableName', 'cf', 'cfc' ... 创建多列族的表,通常一个表只有一个列族
flush 和 compaction 触发的基本单元都是 region 级别。
Time Stamp
HBase 中通常 row 和 columns 组成一个存储单元 cell
每个 cell 都保存同一份数据的多个版本按照时间
**倒序排序
**。版本通过时间戳(类型为64位整型)
来索引。
时间戳赋值
数据写入时自动赋值,此时时间为毫秒级当前系统时间
客户手动赋值,需确保时间戳的唯一性
cell
由{row key, column(=
cell中的数据是没有类型的,全部是字节码形式存贮
。
协处理器
Observer
EndPoint
Hadoop
Apache Hadoop
CDH(优化组件兼容和交互接口、简化安装配置、增加Cloudera兼容特性)
CDH5.1 目前最稳定版本,内核Hadoop 2.3 主流版本
CDH5下载地址:
CM Cdh
cloudera-manager-installer.bin
配置 NTP 服务器
NetWork Time Protocol 网络时间协议
1. fdisk -l 列出当前系统中所有硬盘设备及其分区的信息。
2. mkfs命令、mkswap命令
CAP
Consistency 一致性
更新操作成功并返回客户端完成后,分布式系统所有的节点在同一时间的数据完全一致
Availability 可用性
读写操作都能成功
Partition tolerance 分区容错性
出现网络故障导致分布式节点间不能通信时,系统能否继续服务