冷热分离需要用到hbase,冷数据较多,需求:
HBase可以被看作是一个稀疏的多维度Map(映射),稀疏的、分布式、多维的Map,将行键(Row Key)、列族(Column Family)、列限定符(Column Qualifier)和时间戳(Timestamp)映射到一个值(Value)
如下数据如何存储?表users
,包含两个列族personal_info
和contact_info
。
![[Pasted image 20240612235231.png]]
实际存储结构:
Row Key: user1 Column Family: personal_info Column Qualifier: name -> Value: Alice Column Qualifier: age -> Value: 30 Column Family: contact_info Column Qualifier: email -> Value: alice@example.com Column Qualifier: phone -> Value: 123-456-7890 Row Key: user2 Column Family: personal_info Column Qualifier: name -> Value: Bob Column Qualifier: age -> Value: 25 Column Family: contact_info Column Qualifier: email -> Value: bob@example.com Column Qualifier: phone -> Value: 987-654-3210
每一个RowKey、TimeStamp以及Key-Value值就是一个Cell
user1
和user2
。personal_info
和contact_info
。name
、age
、email
、phone
。Alice
、30
、alice@example.com
等ColumnFamily一开始就要定义好,类似于关系型数据库里面的列,属于schema,每个ColumnFamily可以灵活增加ColumnQualifier,ColumnQualifier不需要在创建表的时候定义
根据RowKey的范围划分成多个Region
![[Pasted image 20240613081011.png]]
Table: users Region 1 (RowKey: user1 - user1000) |-- Store (Column Family: personal_info) | |-- MemStore | |-- HFile | |-- Store (Column Family: contact_info) |-- MemStore |-- HFile Region 2 (RowKey: user1001 - user2000) |-- Store (Column Family: personal_info) | |-- MemStore | |-- HFile | |-- Store (Column Family: contact_info) |-- MemStore |-- HFile
分布式环境
Master 主要负责表 Region 的管理工作,包括分配 Region 给 Region Server,协调多个 Region Server,检测各个 Region Server 的状态,并平衡 Region Server 之间的负载。
Region Server 是 HBase 最核心的模块,包含多个 Region,负责维护 Master 分配给它的 Region 集合,并处理对这些 Region 的读写操作,Client 直接与 Region Server 连接,并经过通信获取 HBase 中的数据。Region Server 需要向 HDFS 写入数据。
Zookeeper 作用:
![[Pasted image 20240613081021.png]]
数据块(Data Block):
- 存储实际的数据,包含多个KeyValue对。 - 每个数据块都可以进行压缩,以减少存储空间和提高读写效率。
索引块(Index Block):
元数据块(Meta Block):
HDFS ├── DataNode 1 │ ├── /hbase/data/default/users/region1/store1/hfile1 │ ├── /hbase/data/default/users/region1/store2/hfile2 │ └── ... ├── DataNode 2 │ ├── /hbase/data/default/users/region2/store1/hfile3 │ ├── /hbase/data/default/users/region2/store2/hfile4 │ └── ... ├── DataNode 3 │ ├── /hbase/data/default/users/region3/store1/hfile5 │ ├── /hbase/data/default/users/region3/store2/hfile6 │ └── ... └── ... HFile: ├── Data Block 1 │ ├── KeyValue1 │ ├── KeyValue2 │ └── ... ├── Data Block 2 │ ├── KeyValue3 │ ├── KeyValue4 │ └── ... ├── ... ├── Index Block │ ├── Index Entry 1 │ ├── Index Entry 2 │ └── ... └── Meta Block ├── Meta Entry 1 ├── Meta Entry 2 └── ...
rowkey设计:md5[cumstomeremail]+ticketId
columnFamily: ColumnFamily:i
为什么只整一个?
因为官方不推荐两个以上的columnFamily,原因:memstore刷新到HFile的动作叫flushing,flushing的操作是region级别,也就是只要有一个columnFamily满了就需要刷新,可能另外一个还很空,增加不必要的IO操作
ColumnKey: 剩余字段都设为i列簇下的Key
![[Pasted image 20240614080719.png]]
工单处理记录表,将处理记录转为json,保存在一个columnKey中
https://www.cnblogs.com/zkteam/p/11877286.html