一、HBase介绍
1、定义
Apache HBase是Hadoop数据库,一个分布式的、可伸缩的大型数据存储。
2、使用场景
你需要随机的,实时的读/写访问你的大数据。这个项目的目标是托管非常大的表——几十亿行的X百万列——在商品硬件的集群之上。
3、特性
(1)线性、可扩展
(2)严格的一致性读写
(3)自动、可配置的表的分片处理
(4)支持自动处理的容灾
(5)HBase和MapReduce可以集成处理
(6)轻松的使用JavaAPI处理
(7)块缓存,块的过滤器支持实时查询
(8)查询的时候支持谓词下推
(9)支持Thrift gateway
(10)shell
(11)支持通过Hadoop度量子系统将指标导出到文件或Ganglia;或者可以通过JMX
4、和RDBMS的区别
(1)数据量
传统关系型数据库,数据量达到一定程度之后,查询速度会骤降。
(2)分布式
大数据的套路
(3)动态列(6)
(4)数据类型
byte数组
(5)数据操作方式
表与表之间的耦合性不高-宽表。
(6)数据存储模式
列式存储——NULL不占用空间
(7)数据的维护
关系型数据库更新数据,只保存最新的值
HBase更新数据,可以设置版本数,保存x版本的值。
(8)数据的伸缩性
机器加减,HBase很容易处理。
5、help命令说明
(1)没有database的说法,换成namespace的概念,在namespace下创建表。
(2)get、scan
(3)put
(4)truncate
(5)tools
6、表结构
Table -- Rows
-- rowkey => primary key(mysql)
-- timestamp => 时间戳,和value绑定在一起
-- column family:col + version => (:col => [value(cell)]) 归属cf col确定cell
-- version => 版本化,多个version追根溯源
-- cell===> rk + version +cf:col
7、配置
动态配置(不用停机)
配置文件配置(停集群)
8、架构
(1)Client:
请求ZK[读/写]从MetaTable拿结果
客户端操作,java client api
rest api
thrift api
hadoop mapreduce
(2)HMaster——作业,管理所有的HRegionServer,有HA
Region assignment:启动时的分配;负载之后的重新分配
监控RegionServer状态、与ZK进行消息的通知
DDL:表的处理(create,delete table)
(3)HRegionServer——跟客户端通讯、读写表
管理Regions => 划分row key(rowkey range:start key -> end key)
datanode:regionserver = 1:1
A HRegionServer 大概需要 1000Regions
WAL:预写日志,操作记录,用于故障后做数据恢复,on disk ,append to the of WAL
Block cache:读缓存,one memstore pre cf of pre a region ,in memory ,sorted
(4)Zookeeper——监控心跳是否正常,集群、进程是否存活
协处理器,做服务状态监控,并与HMaster发通知,通知active的HMaster,RegionServer有故障;
跟HA的HAmaster也有心跳通信。
(5)Hadoop(hdfs)
Hfiles:HBase数据在HDFS上的表现形式,k-v格式。速度快,b+tree,muti-layered index
(6)Meta Table
This META table is an HBase table that keeps a list of all regions in the system.
The .META. table is like a b tree.
The .META. table structure is as follows:
- Key: region start key,region id
- Values: RegionServer
(7)Read
Client -> ZK ->RegionServer -> region ->block cache -> memstore -> Hfile
(8)Write
Client -> ZK ->RegionServer ->WAL ->region ->memstore ->hfile
(9)Flush
Memstore达到一定量时进行flush操作,并且会记录一个最高的sequence id(记录目前flush的位置,是下次flush的起始点)
(10)Compact:
minor(小):选定几个要合并的hfile生成一个hfile
major(全):
所有的Hfiles生成一个hfile per cf
drops deleted or expired cells
建议晚上/业务低谷期做此操作;
将远程数据拉取到本地(做负载均衡或者说服务器故障)
(11)负载均衡:
split(出) vs compact(入)
9、调优
rowkey:
1.+timestamp
2.长度
3.reverse(rk)
4.hash/md5
5.二级索引(phoenix、solr、es)
6.pre-split
7.salt_buckets vs pre-split
8.salting
api:
9.put:单条操作一次 -> batch(并发)
10.scan:单条操作一次 -> batch(并发)
Bloom Filters
...
架构内部:
11.wal:关闭
12.flush:什么时候去做该操作
13.memstore:size
14.compact:minor vs major
15.split:
16.block cache:
17.jvm:gc选择
18.负载均衡:
19.zk:retry 次数
20.timeout:
21.replica:副本机制
22.mob:
config:
23.hbase config:
表结构:
24.version:
25.ttl:
26.压缩方式:
...
10、集群迁移:
1、DistCp迁移:停掉集群
2、Replication:动态备份
3、CopyTable迁移:在线,前提在目标集群中比较建立好同名表
4、EXPORT/IMPORT迁移:在线,前提在目标集群中比较建立好同名表
5、HBASE REST API方式迁移:
6、快照迁移:
7、将HDFS中hbase表文件落地再迁移:集群不通
11.Phoenix + HBase:
二级索引:
盐桶:
12.生产问题:
RIT:
hbck:修复(pending_close/open)
删除ZK里的RIT节点相关的region,重启master
-repair/fix 慎用
13.建议:
运维建议:
1.自动化部署:
原生:shell
CDH/HDP..
2.监控指标:
3.运维脚本:
4.告警:
5.共享资源(计算/存储):
6.高峰期做好预估(压测):
7.集群数据量预估:
8.日志:
9.调优:
学习方式建议:
官网:
源码:
选定版本
了解技术结构以及特性
从简入手,基础流程入手(读/写数据)
找源码对照流程(找一些网上的内容 做辅助理解)
看源码的测试用例
日志信息
把自己理解的流程变换图(自己画)
写博客
做分享