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