CreateArtTechnology
/ Blog
Login
最新文章
Java
语言相关
库相关
虚拟机相关
CreateArtTechnology
项目搭建
使用的工具
自研的工具
开源工具
ELK
ElasticSearch
Jenkins
Markdown
GraphQL
Arthas
生产工具
Linux
Nginx
VersionControl
Subversion
Git
Redis
Archiva
Maven
Zookeeper
Spring
SpringBoot
MySql
HBase
Cassandra
容器化
Docker
Kubernetes
服务容器化从零开始
未分类笔记
算法相关
概念相关
豆知识
机器学习
机器学习从零开始
《简明HBase入门教程》笔记<1-基础概念>
8
2020-01-17 19:24:43
生产工具
HBase
### 数据模型 **RowKey** - 一行记录的主键,查询的唯一条件 - HBase数据按字典顺序全局排序 一定要设计合理的RowKey,这直接影响HBase的读写性能。 **数据表使用稀疏矩阵** |RowKey|Columns| |---|---| |Row1|{ID, Name, Phone}| |Row2|{ID, Name, Address, Tile, Email}| |Row3|{ID, Address, Email}| 不同行的Colums不需要完全一致。 **Region** ![](/img/pic/2020011719211726901_png_678_601_214830) > 一张表的水平分片 数据分片单位,可能保存在不同RegionServer中,HBase的Region是基于Key Range水平切分的,是负载均衡的基本单位,会自动分裂,可迁移。 **Column Family** ![](/img/pic/2020011719220164502_png_759_597_309763) Region中的纵向切割,每一列都需要归属于一个Column Family。 |RowKey|Value| |---|---| |1|info{'姓': '张','名':'三'} pwd{'密码': '111'}| |2|info{'姓': '李','名':'四'} pwd{'密码': '222'}| > info和pwd代表两个Column Family **KeyValue** **每行的每一列(可理解为每个字段)**都被包装成KeyValue: |KeyLength|ValueLength|RowLength|Row | ColumnFamilyLength|ColumnFamily | ColumnQualifier | Timestamp | KeyType | Value | | -------- | -------- | -------- | --- | --- | --- | --- | --- | --- |---| |长度|长度|长度|RowKey|长度|列族|列名|时间戳|key类型|值| 其中Key包含了特定的自我描述信息(除了Value以外均属于Key),会导致数据膨胀。注意**列族**和**列名**都在KeyValue结构中保存,建议**不要设置太长**。 ### 相关模块 - **ZooKeeper** - 分布式一致性协调,指责包括选主、事件通知等 - **NameNode** - 保存HDFS元数据信息 - **DataNode** - 保存HDFS数据 - **RegionServer** - HBase的数据服务节点 - **Master** - 有主备Master - 管理RegionServer - 增删改等DDL操作执行主体 - 分配Region到RegionServer - RegionServer的故障转移 ![undefined](https://intranetproxy.alipay.com/skylark/lark/0/2020/png/235674/1579254062724-1779455b-a45c-4af4-8c7a-2b2e290446cf.png) > HBase的模块 ### 如何设计合理的RowKey RowKey可以支持多列联合,类似MySql复合索引,索引列的顺序非常重要,直接影响查询是否可命中以及数据分布;由于HBase按Region存储及负载均衡,RowKey需要满足稀疏分布以均匀分布到不同Region。 - **调整列的顺序** 在不影响查询的前提下,将分布更均匀的列提到索引开头 - **Reversing 反转** 在索引第一列前缀固定或接近的情况下(如使用时间戳作为第一列),将整个列的字符串反转提高随机性 - **Salting 加盐** 在索引前增加随机Bytes使得分布均匀,但会影响读取 - **Hashing 哈希** 在索引前增加RowKey的哈希结果使分布均匀,但影响基于范围的查询,因为一个范围内的数据被分散到多个Region中了 设计建议: - 当客户端需要频繁的写一张表,随机的 RowKey 会获得更好的性能。 - 当客户端需要频繁的读一张表,有序的 RowKey 则会获得更好的性能。 - 对于时间连续的数据(例如 log),有序的 RowKey 会很方便查询一段时间的数据(Scan 操作)。 ### Region的划分 Region通过RowKey的分割点划分,用StartKey和StopKey划定保存范围,其中使用区间`[StartKey, StopKey)` 假设RowKey第一位是数字,基于`1, 2, 3, 4, 5, 6, 7, 8, 9`进行分割预先创建10个Region,表示如下: |Region ID|StartKey|StopKey| |---|---|---| |Region-1|Empty|1| |Region-2|1|2| |Region-3|2|3| |Region-4|3|4| |Region-5|4|5| |Region-6|5|6| |Region-7|6|7| |Region-8|7|8| |Region-9|8|9| |Region-10|9| Empty| 第一个Region的StartKey和最后一个Region的StopKey为空。 ### 数据写入方式 - 单条写入:Client通过Zookeeper拿到Meta Region的路由信息,并从Meta Region获取Region的信息,通过数据的RowKey和Region的划分范围可以计算出数据应该写入到哪个Region,也能知道应该写入到哪个RegionServer - 多条写入:类似单条写入的流程,但一个RegionServer可能持有多个Region,可以将属于同RegionServer的数据打包一起发送,在RegionServer端接收后串行将每个Region的数据写入 ***当一个RegionServer中Region过多时可能影响写入吞吐量*** ### 数据读取方式 - get: 单条读取 - scan: 一定范围内读取多条 - Result: 请求返回的单位 - Caching: 每次请求的Result数量,缓存在本地,本地缓存池取完了再请求 - Batch: 将一行数据拆成多个Result,每个Result含有Batch个列,适用于数据较大的情况 - 读取流程同写入流程 ### 参考资料 [一条数据的HBase之旅,简明HBase入门教程-开篇 | NoSQL漫谈](http://www.nosqlnotes.com/technotes/hbase/hbase-overview-concepts/) [一条数据的HBase之旅,简明HBase入门教程-Write全流程 | NoSQL漫谈](http://www.nosqlnotes.com/technotes/hbase/hbase-overview-writeflow/) [一条数据的HBase之旅,简明HBase入门教程-Flush与Compaction](http://www.nosqlnotes.com/technotes/hbase/flush-compaction/) [一条数据的HBase之旅,简明HBase入门教程-Read全流程 | NoSQL漫谈](http://www.nosqlnotes.com/technotes/hbase/hbase-read/) [HBase 深入浅出 — IBM Developer](https://www.ibm.com/developerworks/cn/analytics/library/ba-cn-bigdata-hbase/index.html)
发布文章 101
文章被阅读 1817
最近修改
什么是“丝滑”的曲线
2021-12-08 15:19:20
高效空间数据索引R树及其批量加载方法STR简介
2021-09-29 20:33:37
关于分库分表的一些事儿
2021-06-25 11:51:25
获得诺奖的稳定匹配理论之TTC算法与GS算法
2021-03-14 23:04:48
算法小白的机器学习入门实践,从零到上线
2021-01-13 14:28:27
分站宗旨
一站式资料平台,减少重复检索,减少重复采坑。