如果HDFS不允许修改文件,HBase如何存储和修改数据?很难找到这个问题的答案,因为结果主要是针对HBase物理数据格式。但我无法找到HBase如何解决HHDFS文件的不变性问题?
答案 0 :(得分:5)
HBase以索引形式将数据存储在HDFS中。过度简化的事情,HDFS文件具有按排序顺序存储的密钥,因此查找特定密钥的速度很快。 HBase数据存储在RegionServers(RS)中处理。
在RS中,密钥首先写入内存存储(称为memstore)。 memstore存储新密钥/更新删除。在某个阈值之后,这些键将作为新的索引文件推送到HDFS。更新由时间戳处理 - 假设最新版本是唯一有效的版本。因此,如果先前的索引文件具有相同的密钥,则将忽略它。删除与更新相同,唯一的区别是删除具有特殊类型字段,该字段具有将该键标记为已删除的标记。
我做了一些简化:
MapFile
。最新版本的HBase使用名为HFile
的格式,该格式具有特定于HBase的元数据和优化。我还发现了几篇优秀的相关文章,您应该阅读:
答案 1 :(得分:0)
HBase做了一些事情(以下是简化,但它解释了一般的想法): 为了保持一致性,它会在数据到达时写入WAL文件 - 因此不会对数据进行任何更改。
“问题”在于HFiles,其中数据以有序的方式存储。 HBase解决这个问题的第一件事就是它将数据保存在内存中(每个区域的memstore),并且只有在填充时才将它们刷新到磁盘。这节省了一些重写。
在保存之前等待只解决了一些问题,但仍然存在需要重新排列数据的情况 - (例如,重复更新同一个键等)所以HBase做的第二件事就是压缩,它会读取多个HFile并创建新的具有合并数据的那些(并删除旧文件)