Hbase知识图谱
2021-01-14 17:05:17 0 举报
AI智能生成
hbase图谱
作者其他创作
大纲/内容
Region的逻辑视图
集群搭建
表格的逻辑视图
rowkey: 一行数据的唯一标识<br>
列簇 Column Family: 一个列簇可以包含不同的列, 一个列簇的数据最好是相关的, <br>不同列簇的数据会被存在不同而HFile中<br>一个表最好不要有太多的列簇
列: Column : 添加数据时列可以随意添加, 但是列簇不可以, 列簇需要使用建表语句修改,
版本号: 每条数据都会有一个版本号, 默认为时间戳.
cell: rowkey + Column Family + Column 就可以定位到具体的cell<br>cell存储了具体的数据<br>cell里面的数据可以有多个版本, 默认五个
操作类型: cell里面还记录的数据的操作类型. 删除,变更
rowkey设计
需要是唯一的
最好不要太长
需要是离散的
如果是手机号可以翻转一下就离散了
RegionServer
存储数据, 负责IO
每个regionserver上都会有多个region
Hmaster
管理表的建立, 修改
管理region的迁移
ZOOKEEPER作用
负责Hmater的选举
存储了元数据在哪个RegionServer
所有RegionServer心跳检测
写入流程
client预处理阶段
从缓存获取元数据, <br>元数据中没有rowkey相关数据就去ZK查找元数据所在的RegionServer,<br>然后去RegionServer获取元数据<br>
根据元数据查找应该将rowkey写入哪个RegionServer<br>如果元数据变更了<比如region转移了>,写入会报错.<br>客户端会更新元数据,然后重新写入
可以设置一个客户端缓存, 缓存满了之后在批量提交. <br>但是如果客户端宕机后,缓存中的数据可能丢失
RegionServer处理阶段
regionserver在收到请求后, 先校验数据. 并对数据加行锁
校验成功之后会把数据写入HLOG
写入HLOG后把数据写入MemStore
释放行锁
MemStore flush 阶段
触发条件: 定时flush, 或是MemStore满了
将内存数据先生成快照, 然后生成HFILE
读取流程
根据rowkey查询
先根据rowkey获取所在的RegionServer
regionserver收到请求后,先查看缓存是否命中, 命中就直接返回.
缓存中没有数据, 就需要去HFILE中查找 , 先对比HFILE的布隆过滤器, 确认数据是否可能在该HFILE中
布隆过滤器比对成功,再根据索引查找数据
scan
性能较差, 需要一条条遍历数据, 但是可以加上startkey, endkey使用
region迁移/故障恢复
region的迁移并不涉及具体的数据转移
索引
二级索引: 因为scan效率很低, 最好根据rowkey查找 .如果需要使用其他条件查找时. 使用ES进行,然后再根据匹配到的rowkey查找<br><br>
数据结构
使用LSM, 在内存中使用的是跳跃表, 磁盘中的文件是按顺序写入的: <br>根据rowkey + Column Family + Column + timestamp + opType 进行排序<br>因为数据是先写MemStore 然后flush, 所以很好排序
布隆过滤器
构建一个数组, 对rowkey进行次hash计算, 对数组的长度取模, 将取模值 作为数组index,将数组[index] 设置为1<br>进行N次以上的hash计算,不同的hash函数<br>查询的时候对查询的rowkey进行同样的计算. 看数组中的值是否都为1 ,如果都为1 那么数据可能在该HFILE中
Hfile的compaction
文件数量太多,一次查询需要进行多次seek会影响IO效率<br>compaction是以region为范围发起的<br>compaction会清除无效数据
触发条件: 系统定时进行compaction ;<br>每次flush是也会判断文件数据 > 设定值? compaction: 不进行
Region
一个表可以预设Nregion, 单个region的默认大小为256M, 单个Hfile默认大小为128M
如果region的大小超过了设置的大小就会拆分成两个region<br>但这个不是唯一的, 和该表在该服务器上的region个数有关
HDFS知识图谱
数据块的设计
默认的数据块大小为128M
磁盘写入数据是 先写完一个盘面的某个磁道, 然后写下一个盘面的同一个柱面. <br>读取数据最费时的部分是 切换磁道读取. 因为磁头要切磁道, 这是一个机械操作,切换磁盘不耗时,每次盘面都有磁头
所以如果数据块较大, 数据都会被写入相同的柱面,这样有利于数据读取.<br>但是不能设置太大, 需要考虑上传应用, 比如MAPREDUCE
namenode
管理所有元数据
负责datanode的负载均衡,<br>namenode决定数据写入哪些datanode
namenode元数据持久化:数据在内存中, 会定时生成快照, 然后有日志文件
datenode
进行真正的IO操作
写数据
1、Client向Namenode通信请求上传文件,Namenode检查目标文件是否已存在,父目录是否存在<br>2、Namenode返回是否可以上传<br>3、Client请求第一个 block该传输到哪些Datanode服务器上<br>4、Namenode返回3个Datanode服务器ABC<br>5、Client请求3台DataNode中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将真个pipeline建立完成,逐级返回客户端<br>6、Client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答<br>7、当一个block传输完成之后,Client再次请求Namenode上传第二个block的服务器。
读数据
1、跟namenode通信查询元数据,找到文件块所在的datanode服务器<br>2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流<br>3、datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验)<br>4、客户端以packet为单位接收,现在本地缓存,然后写入目标文件
0 条评论
下一页
为你推荐
查看更多