1. HBase
1.1定义
分布式的Mysql数据库
NoSQL关系型数据库
多维数据库
列族 列族不是越多越好 Column Family
列族分文件夹
Row Key –> 主键
根据列切分成store
行切分成region(一个region包含多个store)
修改即是插入,更新数据主要是根据时间戳
TimeStamp
truncate 清空表的数据
Name Space == database (default: hbase default)
Table
Row
Column
Time Stamp
Cell
Column Qualifier(列限定符)
内部inner outer
Cell (rowkey column Family column Qualifier time Stamp)
1.2 基本架构
Master/Zookeeper/Master
RegionServer的作用(DML)
HLog(WAL)
edits(HDFS)
binLog()
Data:get,put,delete
Region:splitRegion compactRegion
Matser(表的增删改查DDL)(存在单点故障)
Table:create delete alter
RegionServer:分配region 监控regionServer
HBase依赖于ZooKeeper
数据在HDFS中
行存储
Row Key Column Family Column Qualifier TimeStamp Type Value
row_key1 personal_info name t1 put value
1.3 shell
DDL
create 'atguigu:test' ,'info'
list
describe 'atguigu:test'
create 'atguigu:test',{NAME=>'info',VERSIONS=>3}
#指定多列族
create 'atguigu:test3','info','msg'
list_namespace_tables 'default'
create 'student', 'info'#不指定默认default
describe atguigu:test
alter 'atguigu:test',{NAME=>'info',VERSIONS=>3}
drop 'atguigu:test3'#会报错
disable 'atguigu:test3' #让test3表下线
drop 'atguigu:test3'
list_namespace_tables 'atguigu'
disable_all 'atguigu:.*' #将所有表下线
drop_namespace 'atguigu'
list
DML
put 'student',1001,'info:name','张三'
scan 'student'
put 'student',1001,'info:age',23
put 'student',1001,'indo:email','zs@atguigu.com'
put 'student',1002,'info:name','张三'
scan 'student'
put 'student',1002,'info:age',23
put 'student',1002,'info:address','sh'
#更新
put 'student',1001,'info:email','zs@qq.com'
scan 'student',{RAW=>true,VERSIONS=>3}
#版本是保留时间戳最近的三个版本
put 'student',1003,'info:name','wangwu'
put 'student',1003,'info:email','ww@qq.com'
scan 'student',{STARTROW=>'1001',STOPROW=>'1003'}
#1001-1002 左闭区间右开区间
#get
get 'student','1001','info:email'
删除操作
delete 'student','1001','info:email'
#删除最新的版本,但是可以查到上一个版本
deleteall 'student','1001','info:email'
#全部删除 #type=DeleteColumn
deleteall 'student','1001'
#DeleteFamily
数据存在于HDFS上
truncate删除表,创建空的新表
1.4 HBase进阶架构
MemStore —写缓存. flush之后才会生成storefile
WAL记录操作日志—预写日志
BlockCache 读缓存
1.5 读数据流程与写数据流程
1.6 合并
轻量级不会轻易删除,不能保证所有操作都包含
合并若干个邻近的小文件
1.7 API操作三句话
connection
2. 复习
列族相当于动态链
垂直切分
每个region包含多个列族
物理存储结构按照cell
通过row_key+列族+列名+时间戳+type
按照字典的顺序进行排序
删除,新增都是新增
name space
table 字段可以动态的,按需指定
row
2.架构与API
2.1 regionServer
增删改查
spiltregion
compactregion
2.2 Master
创建表
==元数据表保存在zk里==
HDFS的源数据表/元数据表
region的范围
region里包含store
分配region
master配置高可用
2.3 操作
create 'student','info'
put 'student','1001','info:sex','male'
scan 'student'
scan 'student',(STARTROW=>'1001',STOPROW=>'1001')
describe 'student'#列族,version
put 'student','1001','info:name','Nick'
get#查询一条
get 'student','1001'
get 'student','1001,'info:sex'
delete 'student','1002','info:sex'#删除新版本
deleteall 'student','1001'#删除所有版本
truncate 'student'
#先disable,在truncate
disable 'student'
drop 'student'
alter 'student',{NAME=>'info',VERSIONS=>3}
2.4 详细架构
block cache 读缓存,缓存查出来的数据
WAL 预写日志 write ahead log
StoreFile – flush(HDFS)(配置文件配置)
在Store里有MemStore 写缓存,达到阈值后flush
2.5 写数据流程
put /table/rowkey/CF/column
CF column family 列族
请求meta表所在的regionServer的哪一个(meta表是什么东西)
meta:hadoop102
请求我们需要的meta表所在regionServer
然后client先缓存到meta cache(客户端缓存.存储元数据信息)
对103发送put请求
先写到103regionServer的预写日志
然后写到写缓存里.(算是写数据已经写完了)
--zookeeper
HBase
./meta-region-server//存储元数据表在哪里机器上
scan 'hbase:meta'
Region Server’
2.6 读数据
读写数据,请求zookeeper获得的meta表regionserver的位置
三个都查询.综合查询(block cache,memstore,Hfile)
2.7 Storefile的合并
小合并,.不删除
大合并
3. API
3.1 API操作
1.API操作
依赖排除
conf.set();
3.2 作业
JDBC复习
API操作复习
3.3 HBase优化
每一个region维护者一个startRow与endRowKey
如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护,name依照这个原则,我们可以将数据所要投放的分区提前大致的规划好,以提高HBase的性能
Phoenix JDBC
3.4 复习API操作+==重点==+
1>环境准备
2>操作
三遍复习 训练HBase
预分区
4. Phoenix
启动
sqlline.py hadoop105,hadoop106,hadoop107:2181
4.1 使用Phoenix语法
thin client
连客户端/多一个query server
--查询
list namespace
create schema test;
#报错.mapping
修改配置,创建映射,否则报错
<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>
#创建表
create table student (id varchar primary key,
name varchar,
addr varchar);
upsert into student values('1001','zhangsan','beijing');
4.2 Phoenix重点说明 + SHELL
phoenix把字段进行编码,为了减少内存空间,
phoenix把字段进行编码,为了减少内存空间,
column_encoded_bytes = 0;使用这个配置可以不让Phoenix把字段进行编码
不想使用大写,就使用双引号括起来
delete from student where id = 1001;
scan 'TEST:STUDENT' {RAW=>true}--查看历史版本/包括删除信息
scan 'TEST:STUDENT' {RAW=>true,VERSIONS=>3}
drop table "student2";
删除
4.3 表的映射
视图映射
create view "test"(id varchar primary key,"info1"."name" varchar, "info2"."address" varchar);
drop view "test"
#指定命名空间需要 student.test 使用表名
create view "student"(id,varchar primary key,
"info"."name" varchar,
"info"."age" varchar)
use default;
put 'student','1001','info:age','23'
column_ecoded_bytes=0;
select from student;
upsert into 'student' values("1002","lisi","24");
4.4 JDBC操作
导入依赖
5 复习
Phoenix容易集成
RegionServer
映射
JDBC连接
关键问题
HBase : meta表
对于一张表来说存储的是三条数据
加入你要寻找Table1的RowKey
meta表
Table | Region | RowKey | Server |
---|---|---|---|
Table1 | Region1 | 0 | hadoop105 |
Table1 | Region2 | 1000 | hadoop105 |
Tabel1 | Region3 | 2000 | hadoop106 |
Table2 | Region1 | aaaaaaa | hadoop105 |
Table2 | Region2 | bbbbbb | hadoop106 |
Table2 | Region3 | cccccccc | hadoop107 |
Table3 | Region1 | ||
… | … |
数据先写到WAL在写入MemoStore
WAL还没有同步到HDFS
写入到MemoStore
同步
同步不完成 回滚