Hbase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库,主要用来实现对大型数据的实时、随机的读写访问, 是一个通过大量廉价机器解决海量数据的高速存储和读取的分布式数据库解决方 案。
(1)Hbase依赖于HDFS做底层数据存储;
(2)Hbase依赖于MapReduce做数据计算;
(3)Hbase依赖于Zookeeper做服务协调,解决单点故障问题;
1.2、Hbase数据模型 逻辑上,Hbase的数据模型同关系性数据库很类似,数据存储到一张表中,有行有列。但Hbase底层物理存储结构(K-V)来看,Hbase更像一个multi-dimensional map(多维度map结构)。
(1)Namespace(表命名空间)
表命名空间不是强制的,默认是default。当想把多个表分到一个组去统一管理的时候才会用到表命名空间。
(2)Table(表)
一个表由一个或者多个列族组成。它有一些数据属性,比如超时时间(TTL),压缩算法(COMPRESSION)等,都在列族的定义中定义。定义完列族后表是空的,只有添加了行,表才有数据。
(3)Row(行)
一个行包含了多个列,这些列通过列族来分类。行中的数据所属列族只能从该表所定义的列族中选取,不能定义这个表中不存在的列族,否则你会得到一个NoSuchColumnFamilyException。
(4)Row Key(行键)
行的唯一标识,类似于主键,在Hbase内部,RowKey保存为字节数组。Hbase会对表中的数据按照rowkey排序(字典顺序)。
1、通过单个row key访问2、通过row key的range3、全表扫描
字典树概述:
根节点没有字符路径。除根节点外,每一个节点都被一个字符路径找到;从根节点出发到任何一个节点,如果将沿途经过的字符连接起来,一定为某个加入过的字符串的前缀;每个节点向下的所有字符串路径上的字符都不同;
(5)Region(分区)
Hbase自动把表水平划分成多个区域(region),每个region会保存一个表里面某段连续的数据。当table中的行不断增多,就会有越来越多的region,这样一张完整的表被保存在多个Regionserver上。
(6)Column Family(列族)
Hbase表中的每个列,都归属与某个列簇。列簇是表的Schema的一部分(而列不是),必须在创建表的时 候指定。指定好了列簇就不能更改。列簇可以增加或者删除,删除的时候会删除这个列簇中的所有数据 列名都以列簇作为前缀。访问控制、磁盘和内存的使用统计等都是在列簇层面进行的。
注意事项:列簇越多,在取一行数据时所要参与IO、搜寻的文件就越多,所以,如果没有必要,不要设置太多的列 簇,官网推荐是小于等于3(最好就一个列簇)优化方案
①能短点就短点:字典树查询效率提升,例如a,b,c。②能少点就少点:Store管理数量变少。
(7)Column Qualifier(列)
多个列组成一个行。列族和列经常用Column Family:Column Qualifier来一起表示。列是可以随意定义的,一个行中的列不限名字、不限数量,只限定列族。
(8)Cell(单元格)
一个列中可以存储多个版本的数据,而每个版本就称为一个单元格(Cell),Hbase中的数据细粒度比传统数据结构更细一级,同一个位置的数据还细分成多个版本。
注意事项:Cell结构 - ( (9)Timestamp(时间戳/版本号) 既可以把它称为是时间戳,也可以称为是版本号,因为它是用来标定同一个列中多个单元格的版本号的,即最新版本的时间戳最大。 (1)索引数据流程:table —> rowkey —> column family —> column —> timestamp ①行健(rowkey):Hbase中的每张表,都会按照rowkey全局排序②列簇(Column Family):包含一组列,列在插入数据之前指定,列簇就必须在建表的时候指定③列(Column):一个列簇中会包含多个列,并且可以不同④时间戳(TimeStamp):每个列的值都可以保存多个版本,使用时间戳来表示,并且按照时间戳由近到远排序 (2)注意事项 逻辑上的完全体Key - (3)逻辑结构 map( (1)Hbase底层文件存储结构为行式存储 rowkey1,family,qualifier,timestamprowkey2,family,qualifier,timestamprowkey3,family,qualifier,timestamp (2)Hbase表文件在集群中的存储结构 ①Regin:每个分段文件在不同的服务器管理; ②RowKey:有序,数据插入时会根据RowKey判断数据要发往哪个服务器; ③Store:按照列簇将Regin进行切分,切分后的结构就是Store,Store的存储示意图如下; 注意事项:每个Store就是有一个memstore和一个storefile组成,每个相同Regin的Store存放在同一台服务器上。 1.5、Hbase应用场景 (1)存储半结构化或分结构化数据 对于数据结构字段不够确定或杂乱无章很难按一个概念去进行抽取的数据适合用Hbase。而且Hbase是面向列的,Hbase支持动态增加字段。 (2)记录稀疏 Hbase为null的Column是不会被存储的,这 样既节省了空间又提高了读性能。 (3)多版本数据 对于需要存储变动历史记录的数据,使用Hbase就再合适不过了。Hbase根据Row key和Column key定位到 的Value可以有任意数量的版本值。 (4)超大数据量的随机、实时读写 Hbase会自动水平切分扩展,跟 Hadoop的无缝集成保障了其数据可靠性(HDFS)和海量数据分析的高性能(MapReduce)。 (5)查询简单 不涉及到复杂的Join查询,基于RowKey的简单查询或者RowKey的范围查询。 Hbase文件示意图 (1)缓存数据结构:ConcurrentSkilListMap; (2)磁盘数据结构:在HDFS上的Hfile文件; (3)物理存储:每张表都会拆分为多个Regin,每个Regin都有一个写缓存(Memstore)&读缓存(BlockCache); (4)Flush:内存数据溢写磁盘; (5)Compact:溢写到磁盘中的数据进行小文件合并; (6)Split:合并文件超过阈值就会进行分片; (7)Regin:分段数据,一个表中的一个范围端的所有数据。 (1)A new Region assignment manager AssignmentManager V2(“AMv2”)基于Procedure V2实现,能够更快速的分配Region,维护的region 状态机存储不再依赖于ZooKeeper,能够更好的应对Region长时间RIT问题。 解释:提供新的组件,确定哪些Regin能被ReginServer管理,即Regin存储负载均衡算法 (2)Offheaping of Read/Write 减少对Heap内存的使用,改用Offheap区的内存,有效减少GC压力 解释:引入了堆外内存 堆内内存:即JVM内存,由垃圾回收机制堆外内存:即操作系统内存,没有垃圾回收机制 (3) In-Memory Compaction 重新设计了CompactingMemStore 替代 DefaultMemStore,CompactingMemStore中的数据达到一 定大小以后,不是直接Flush成HDFS中的HFile文件,而是先Flush到内存中的一个不可改写的 Segment,这样,内存中的多个Segments可以预先合并,当达到一定的大小以后,才Flush成HDFS中 的HFile文件,这样做的好处是希望有效降低Compaction所带来的写IO放大问题。 解释:将给予磁盘的Compaction变成基于内存的Compaction,提升了IO效率 (4)NettyRpcServer 使用Netty替代Hbase原生的RPC server,大大提升了 HbaseRPC的吞吐能力,降低了延迟 (5)Async RPC Client 提供了一个异步RPC客户端,Hbase2.0 Client不在是原来同步等待,而是利用异步RPC机制,大大提高Client端请求并发度,有效提 高资源利用率,扩大吞吐。 (6)RegionServer Group 可以将 RegionServer 划分到多个逻辑 Group 中,这样可以提供多租户的能力 解释:将多个子节点划分为 (7)Support for MOB 主要为小对象文件提供了支持优化,让Hbase更好的支持数KB甚至数MB级别的小对象存储,这些小对象采用独立的HFile文件进行存储,而 且不参与普通的Compaction,这样不会因为小对象数据使得Compaction的写IO放大问题进一步恶化。 (8)Support CF-level Storage Policy 支持通过”hbase.hstore.block.storage.policy”配置来设置HFile的存储策略,并且还支持CF级设置以覆 盖配置文件中的设置。目前支持的存储策略包括ALL_SSD/ONE_SSD/HOT/WARM/COLD (1)高并发,以扩展解决海量数据集的随机实时增删改查 ; CASE:集群有100台服务器,每台服务器都能处理一个客户端请求,则100个节点可以处理100个请求。 (2)Hbase本质依然是Key-Value数据库,查询数据功能很简单,不支持join等复杂操作(可通过Hive支持来 实现多表join等复杂操作) (3)不支持复杂的事务,只支持行级事务 ; (4)Hbase中支持的数据类型:byte[](底层所有数据的存储都是字节数组) ; (5)主要用来存储结构化和半结构化的松散数据。 1、大:一个表可以有上十亿行,上百万列 2、面向列:列可以灵活指定,面向列(族)的存储和权限控制,列(簇)独立检索。 3、稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。 4、无严格模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的 行可以有截然不同的列。