WAL
Client -> ZooKeeper -> HMaster 检索-ROOT- RegionServer。-> 检索 RegionServer 查看.META.表 找到对应行健。->RegionServer 知道了 在那个 Region 里,缓存此信息,同时连接 该HRegionServer。 现在客户端就有了去哪里获取行的完整信息而不需要再去查询.META.服务器。
1、 流程
a) Client发起了一个HTable.put(Put)请求给HRegionServer
b) HRegionServer会将请求匹配到某个具体的HRegion上面
c) 决定是否写WAL log。WAL log文件是一个标准的Hadoop SequenceFile,文件中存储了HLogKey,这些Keys包含了和实际数据对应的***,主要用于崩溃恢复。
d) Put数据保存到MemStore中,同时检查MemStore状态,如果满了,则触发Flush to Disk请求。
e) HRegionServer处理Flush to Disk的请求,将数据写成HFile文件并存到HDFS上,并且存储最后写入的数据***,这样就可以知道哪些数据已经存入了永久存储的HDFS中。
HBase存储数据流程
Client写入 写入到 LSM 内存中,LSM内存写到一定阈值后 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 出发Compact合并操作 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步形成越来越大的StoreFile -> 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split 成2个 Region,Region会下线,新Split出的2个子Region会被HMaster分配到相应的HRegionServer 上,使得原先1个Region的压力得以分流到2个Region上由此过程可知,HBase只是增加数据,有所得更新和删除操作,都是在Compact阶段做的
HBase File In HDFS。
HBase 文件可以分成两类:
一、直接位于HBase根目录下。(HLog)
二、位于表目录下文件
1)根目录
第一类文件是由HLog 实例处理的 WAL 文件,这些文件创建在 HBase 跟目下一个称为 .logs 的目录中。.logs目录下包含针对每个 HRegionServer的子目录。每个子目录下通常有几个 HLog 文件 (因为日志的切换产生),来自相同 RegionServer
的Region 共享这些 HLog 文件。 对于最新创建的HLog文件通常大小为0,因为 HDFS 正使用一个内置的 append 支持来对文件进行写入,同时对于读取者来说只有那些完整的 Block 才是可用的, 包括 hadoop fs -lsr 命令。 尽管写操作的数据被安全地持久化,但是当前写入的日志文件大小信息有些轻微的不同。 日志文件每小时切换一次(默认 60分钟)后, 这个时间是由 hbase.regionserver.logrool.period 配置项控制。 等日志文件切换后,可以查看其正确大小,因为该文件已经被关闭了,所以HDFS 可以获取正确的状态。而其之后的新日志文件戴傲又会变为0.
当日志文件不再需要时,现有的表更已经持久化到存储文件中了,他们就会诶移动到 HBase 根目录的 .oldlogs 目录中。 这是在日志文件达到上面的切换阈值时触发的。 老的日志文件默认会在10分钟后被 Master 删除, 通过 hbase.master.logcleaner.ttl 设定。 Master 默认每分钟会对这些文件进行检查,可以通过 hbase.master.cleaner.interval 设定。
2)表
HBase 中的每个表都有他自己的目录,位于HBase 根目录之下(最最开始讲的HBase表命名要规范的作用,因为他又是文件名)
(更正0.98以后貌似改了。不是上面的/hbase/表,而是 /hbase/date/default/表,待验证)
。每个表目录都有个.tableinfo 的顶层文件,该文件保存了针对该表的 HTableDescriptor 序列化后的内容,包含了一些元数据信息,同时可以被读取。可以通过工具查看表的定义;tmp 包含了一些中间数据。
3 Region
在每个表目录内,最对表的Schema 中的每个列族会有一个单独的目录。目录名称还包含 Region 名称的 MD5 哈希部分。 对于存储在磁盘上的目录中的 Region 名称。
一旦一个Reion 因为容量大小而需要 split , 会创建一个阈值对应的 splits 目录,用来筹划产生两个子 Region。通常只需要几秒或更短的时间,该过程成功之后他们会被移入表目录下用来形成两个新的 Region , 每个代表原始 Region 的一半.换句话说,如果发现一个Region 目录下没有 .tmp 目录,那么说明目前他还没有执行合并。如果也没有 recovered.edits 目录,那么说明目前没有针对他的 WAL 回放。
// 【表名】,【起始rowkey,如果从0开始 就不写 ,,】【
蓝色部分为后半部分。是哈希。尾部的点事整个 Region 的一部分,是一种包含哈希的新风格。
】
例如:p_t_rss ,[rk-1000],1440470934157 .41ba12b50dfcf29053b8de5725dc518.
Region 切分。