1.什么是HBase? Hadoop DataBase
HBase 概念:
开源的、高可靠、高性能、面向列、可伸缩、实时读写的分布式数据库 --思想来源Google是BigTable论文 利用HDFS作为文件存储系统、Zookeeper作为分布式协同服务
利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
它介于Nosql和RDBMS之间,仅能通过主键(Row key)和主键的Range来检索数据,仅支持单行事务(可通过Hive支持来实现多表Join等复杂操作)。
主要用来存储结构化和半结构化的松散数据。
Hbase查询数据功能很简单,不支持join 等复杂操作,不支持复杂的事务(行级的事务)
Hbase中支持的数据类型:byte[] (字节 、 字符串)
与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力
2 、HBase的特点、优缺点
HBase是一个开源的分布式列存储数据库,具有以下特点:
特点:
1. 分布式存储:HBase可以在大规模的服务器集群上存储海量数据,数据可以分布在不同的节点上。
2. 数据模型:HBase采用列族的设计模型,可以灵活地增加和修改列族和列,有利于存储非结构化或半结构化的数据。
3. 高可靠性:HBase可以自动地进行数据备份和恢复,提供了高可用性的数据访问方式。
4. 高性能:HBase采用了基于内存的数据访问方式,可以快速地进行数据访问和读写操作。
5. 水平扩展:HBase支持水平扩展,可以随着数据的增加而扩充集群规模。
优点:
1. 可以存储海量数据,容易扩展;
2. 读写性能高,适合处理大规模数据;
3. 适合非结构化或半结构化数据的存储和查询;
4. 支持自动备份和恢复,具有高可靠性;
5. 开源免费,社区活跃,有大量的相关文档和资源。
缺点:
1. 不适合处理高并发的读写操作;
2. 对于小规模数据的存储和查询,性能相对较差;
3. 维护和管理分布式系统的成本较高;
4. 读写操作的延迟较大(毫秒级别);
5. 对于关系型数据的存储和查询,不如传统的关系型数据库效率高。
HBase 和RDBMS(关系型数据库)的对比
HBase
只有字节和字符串数据类型、增删查改,不支持Join、列式存储,更新后仍然保留版本、可伸缩型轻易增加节点
RDBMS(关系型数据库):丰富的数据类型、各种各样的函数与表连接、表结构和行式存储 版本直接替换 、可伸缩型需要中间层、牺牲性能
3.HBase --数据模式
数据模型--关系型数据库
RowKey主键
Column Family 列族 需要申明
Column Qualifier 列 不需要申明
Version :默认Timestamp 数据版本 (时间戳)
Cell 最小单元
HRegion
StoreFile
NameSpace 命名空间 类似 数据库的概念 HBase有两个特殊预定义的命名空间:
default :没有明确指定命名空间将表自动落入此命名空间
hbase:系统命名空间,用于包含HBase的内部表和元数据表
4.HBase的架构模型
HBase是基于Hadoop架构的分布式列式存储数据库,其架构模型主要包括:HMaster、RegionServer、ZooKeeper以及HDFS。
1. HMaster:
HMaster是整个HBase集群的管理者,负责管理表的元数据信息和RegionServer的负载均衡。在HBase中,每个表都有一个或多个Region,HMaster会将Region分配给不同的RegionServer,同时还会监控RegionServer的状态和负载情况,并安排RegionServer之间的数据迁移。
2. RegionServer:
RegionServer是具体存储数据的节点,每个RegionServer负责存储一部分Region。RegionServer内部包含多个HRegion对象,每个HRegion对应一段连续的rowkey范围,即一个Region。当有客户端请求时,RegionServer会根据rowkey范围查找对应的Region,然后进行数据读写操作。
3. ZooKeeper:
ZooKeeper是HBase集群的协调者,主要负责管理HMaster和RegionServer之间的通信以及元数据信息的一致性。在HBase中,ZooKeeper维护了整个集群的状态信息,如HMaster的位置、RegionServer的状态等,同时还会监控集群中各个节点的状态变化,并及时通知其他节点进行相应处理。
4. HDFS:
HDFS是Hadoop分布式文件系统,是HBase存储数据的底层支撑。HBase会将数据按照列族存储在HDFS中,每个列族对应一个HFile文件,HFile文件中则存储了实际的数据。
总的来说,HBase的架构模型是基于Hadoop的分布式存储框架,通过HMaster、RegionServer和ZooKeeper等组件实现分布式数据存储和管理,同时还利用HDFS实现底层数据的高可靠性和高性能读写。
5、读写流程
理解一:
写流程:
- 客户端通过HBase API写入数据,数据以Put对象的形式传递给HBase客户端;
- HBase客户端首先会将Put对象拆解成多个KeyValue对象,每个KeyValue对象表示一行数据中的一个列;
- HBase客户端会根据KeyValue的RowKey信息,将每个KeyValue对象分配到相应的RegionServer上;
- RegionServer接收到数据后,会根据操作类型(Put、Delete等)更新对应的MemStore和WAL,如果MemStore的大小达到阈值,就会触发Flush操作,将数据刷到磁盘上的StoreFile中;
- 最终,数据会被持久化到HDFS中。
读流程:
- 客户端通过HBase API读取数据,数据以Get对象的形式传递给HBase客户端;
- HBase客户端首先会根据Get的RowKey信息,确定需要查询的RegionServer列表;
- HBase客户端向每个RegionServer发起RPC请求,请求对应的数据;
- RegionServer查找内存中的MemStore和磁盘上的StoreFile,尝试找到满足条件的KeyValue;
- 如果是Scan操作,则会继续查找下一个满足条件的KeyValue,直到查找完毕或到达Scan的StopRow为止;
- 如果找到了满足条件的KeyValue,RegionServer会将数据返回给HBase客户端;
- HBase客户端将返回结果缓存到本地,同时也会将结果返回给客户端应用程序
理解二:
写流程
客户端通过HBase API发送写请求到HMaster节点,HMaster负责管理RegionServer节点。
HMaster将写请求转发到负责该数据表的RegionServer节点。
RegionServer接收到写请求后,将写入的数据缓存在内存中,并立即返回成功响应给客户端。
RegionServer将数据写入HLog(WAL),以保证数据在写入磁盘前的可靠性。
当HLog的大小达到一定阈值时,RegionServer将该HLog刷入磁盘。
当RegionServer的内存缓存达到一定阈值时,RegionServer会将缓存中的数据写入HFile(HBase的数据存储文件格式),然后从内存中删除数据。
HFile的数量达到一定阈值时,RegionServer会将多个HFile合并为一个更大的HFile,以减少HFile的数量,提高查询效率。
读取流程
客户端通过HBase API发送读请求到客户端的RegionServer节点。
如果数据在RegionServer的内存缓存中存在,则直接返回数据给客户端。
如果数据在内存缓存中不存在,则从HFile中读取数据。
如果HFile中缺少数据,则从HLog中读取数据,并将数据写入内存缓存和HFile中。
如果客户端需要读取的数据不存在,则返回空结果给客户端。
总之,HBase的读写流程是一个通过内存缓存、HLog、HFile等多个层次的数据处理和存储过程,通过不断地写入和读取数据,保证了数据的可靠性和高效性
6、数据的刷写、合并、切分
HBase的数据刷写、合并、切分是HBase的基本操作之一,它们主要是为了保证数据的高效存储和访问。下面我们分别介绍一下这三个操作:
1. 刷写数据(Flush):HBase中的数据都是写入到内存中,当内存写满或者达到一定的条件时,就需要将内存中的数据刷写到磁盘上,以避免数据的丢失。HBase会启动一个后台线程,定期地将内存中的数据刷写到磁盘上,同时,可以通过手动触发flush操作来立即将内存中的数据刷写到磁盘上。
2. 合并数据(Compaction):为了避免HBase中的数据分布过于分散,当一个Region中的数据过多时,HBase会将其划分成更小的Region,这个操作称为split。但是,如果Region中的小文件太多,也会影响查询效率,此时就需要将小的HFile合并成大的HFile。这个操作称为Compact。
3. 切分数据(Split):HBase中的数据是按Region进行分片的,每个Region都会对应一个HDFS上的HFile。当一个Region中的数据量过大时,HBase会自动将其划分成更小的Region。Region可以通过自动切分或手动切分来实现。手动切分需要用户自己选择一个key值,这个key值会被当成新Region的起始值,之前的数据会被划分到旧Region中,新的数据会被划分到新Region中。
7、HBase之表设计
HBase是一个NoSQL数据库,它的数据存储在分布式的HDFS文件系统上。在设计表的时候需要考虑以下几点:
1. 表的列族设计
在HBase中,表的列族是非常重要的一个概念。列族是物理存储上的概念,所有属于同一列族的列会被存储在同一行内。列族是不可更改的,因此在创建表时需要给出列族的定义。通常在设计时,会根据数据的访问模式和查询需求来决定列族的数量和列族中的列。对于类似于日志的数据,可以考虑只创建一个列族,而对于常规数据,可以根据其属性来设计不同的列族。
2. 表的行键设计
在HBase中,每行数据都有唯一的行键。因此在设计表时,需要考虑行键的设计。行键应该尽量短、唯一、且易于查询。一般情况下,行键可以采用类似于主键的设计方式,可以采用字典排序。
3. 列限定符设计
列限定符是指属于同一个列族中的列的名称。在设计时应该精细化定义列族和列限定符,以便于查询和统计。列限定符也应该尽量短、唯一且易于查询。
4. 数据的序列化方式
在HBase中,数据的序列化方式可以影响查询的效率。因此在设计表时,需要选择一个适合自己的序列化方式。常用的序列化方式有Protobuf、Avro、Thrift等。
综上所述,HBase的表设计需要考虑列族、行键、列限定符和数据的序列化方式。在实际应用中,还需要考虑各种查询需求、数据量、分布式系统的数据一致性等方面的因素。
8、HBase的常用优化
1. 增加Region数量:通过增加Region数量,可以减少Region Server的负载,提高读写性能。
2. 优化数据模型:在设计数据模型时,需要合理选择Row Key和Column Family,避免出现热点数据和大量的无效数据。
3. 调整堆内存大小:根据实际需求调整HBase Region Server进程的堆内存大小,避免出现OOM异常。
4. 合理设置HDFS块大小:HBase的存储是基于HDFS的,合理的HDFS块大小可以提高IO性能。
5. 使用本地磁盘:HBase支持使用本地磁盘作为数据存储,可以提高读写性能。
6. 合理使用预分区:在创建表时,合理使用预分区可以提高读写性能。
7. 压缩数据:开启HBase的数据压缩功能可以减少存储空间和IO操作,提高读写性能。
8. 调整Flush和Compaction参数:通过调整Flush和Compaction参数,可以优化写入性能和存储空间利用率。
9. 合理选择写入模式:在高并发写入场景下,可以选择异步写入模式,提高写入性能。
10. 监控和调优:实时监控HBase的状态,及时发现和解决性能瓶颈问题。
以上是个人学习总结,希望对让你对HBase有一定的理解!