1.HBase定义:
Hadoop database,a distributed,scalable,big data store
Use Apache HBase™ when you need random, realtime read/write access to your Big Data. This project's goal is the hosting of very large tables
-- billions of rows X millions of columns
-- atop clusters of commodity hardware.
2.特性:
1.Linear and modular scalability.
2.Strictly consistent reads and writes.
3.Automatic and configurable sharding of tables
4.Automatic failover support between RegionServers.
5.Convenient base classes for backing Hadoop MapReduce jobs with Apache HBase tables.
6.Easy to use Java API for client access.
7.Block cache and Bloom Filters for real-time queries.
8.Query predicate push down via server side Filters
9.Thrift gateway and a REST-ful Web service that supports XML, Protobuf, and binary data encoding options
10.Extensible jruby-based (JIRB) shell
11.Support for exporting metrics via the Hadoop metrics subsystem to files or Ganglia; or via JMX
3.与RDBMS的区别点:
数据量
分布式
数据类型:HBase只有简单的字符类型,所有的类型都是交由用户自己处理,它只保存字符串。而关系数据库有丰富的类型和存储方式。
数据操作方式:HBase只有很简单的插入、查询、删除、清空等操作,表和表之间是分离的,没有复杂的表和表之间的关系,而传统数据库通常有各式各样的函数和连接操作。
数据存储模式:HBase是基于列存储的,每个列族都由几个文件保存,不同的列族的文件时分离的。而传统的关系型数据库是基于表格结构和行模式保存的。
数据的维护:HBase的更新操作不应该叫更新,它实际上是插入了新的数据,而传统数据库是替换修改。
数据的伸缩性:Hbase这类分布式数据库就是为了这个目的而开发出来的,所以它能够轻松增加或减少硬件的数量,并且对错误的兼容性比较高。而传统数据库通常需要增加中间层才能实现类似的功能。
Hbase的优点
1 列的可以动态增加,并且列为空就不存储数据,节省存储空间.
2 Hbase自动切分数据,使得数据存储自动具有水平scalability.
3 Hbase可以提供高并发读写操作的支持
Hbase的缺点:
1 不能支持条件查询,只支持按照Row key来查询.
2 暂时不能支持Master server的故障切换,当Master宕机后,整个存储系统就会挂掉.
HBase常用命令
4.HBase表结构:表由行组成,行由rowkey,timestamp,cf:col组成
Table --> Rows
-- rowkey => 类似于primary key(mysql)
-- timestamp => 和value绑定在一起的 版本数据生成的时间
-- cf => (:col => [value(cell)])不建议生成太多列族,当数据合并,压缩时会导致多余的数据一起做该操作。
-- :col => 归属cf col确定cell
-- version => 版本化,存在多个=>便于追根溯源
-- cell => rk + version + cf:col
5.HBase架构:参考地址[https://mapr.com/blog/in-depth-look-hbase-architecture/]
Client:第一次请求[读/写]拿结果
Read:
Client -> ZK -> RS -> reigon -> block cache -> memstore -> hfile
Write:
Client -> ZK -> RS -> wal -> reigon -> memstore -> hfile
客户端从zookeeper获取承载meta表的Region server信息
然后客户端从meta表的Region server查询元数据信息获取想要访问的行所对应的Region server,并缓存该信息和meta表的位置
最后会去行对应的Region server获取行。
后续的读写将会直接从客户端的缓存进行检索,不用再查询meta表。除非Region server的转移和更改,才会再次查询并更新缓存
客户端操作
java client app
rest api
thrift api
hadoop mapreduce
HMaster[管理所有的RegionServer, 有HA]:
Region assignment:
启动时的分配;负载之后的重新分配
监控RS的状态,与ZK进行消息的通知
DDL (create, delete tables) operations:表格的处理
HRegionServer(RS)[reads/writes]:一个节点对应一个RS
Regions:[rowkey divided horizontally] RS中有多个Region
=> RK(Rowkey range:[start key -> end key])
RS负责以下事项:
预分区
一个RS可以为1000个Region提供服务
WAL:预写日志,操作记录,用于故障后做数据恢复, on disk, append to the end of wal
Block Cache:读缓存
Memstore:写缓存, one memstore per cf of per a region,in memeory,sorted
Hfiles:HBase数据在Hdfs上的表现形式,kv,顺序写,速度非常快,类似于B+tree,multi-layered index
Zookeeper:
协处理器
服务状态的监控,并给master发通知
与Master和RS通信,进行故障监控(心跳机制),消息发送
Hadoop(hdfs):
Hfile:KeyValue的实例或ceil的内容
由内存中写进来的数据最终flush到磁盘的时候,生成了Hfile文件存储到Hdfs。
Flush:
Memstore达到一定量时进行flush操作,
并且会记录一个sequence id(记录目前flsuh的位置,是下次flush的起始点)
Read amplification:
many HFiles per MemStore, a read, multiple files may have to be examined
Write amplification:
major compact时产生的
Compact:
minor(小):选定几个要合并的hfile生成一个hfile
major(全):
所有的Hfiles生成一个hfile(把每个列族的Hfile合并成一个)
在合并的同时,drops deleted or expired cells
该操作对于磁盘IO和网络的负担特别大,建议晚上/业务低谷期做此操作;
将远程数据拉取到本地(做负载均衡或者说服务器故障)
负载均衡:
split(出) vs compact(入)
6.调优点:
rowkey:
1.+timestamp
2.长度
3.reverse(rk)
4.hash/md5
5.二级索引(phoenix、solr、es)
6.pre-split :按特征分组(可能产生数据倾斜)
7.salt_buckets :按编号分组
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:副本机制(2.0之后出现的机制)
22.mob:
config:
23.hbase config:
表结构:
24.version:
25.ttl:
26.压缩方式:
...