为什么 hbase memstore 大小和刷新数据大小不相等?
Why hbase memstore size and flushed data size are not equal?
我正在监视 hbase (0.94.18) 数据存储,发现 memstore 大小和刷新存储数据的大小不一样。
当 memstore 数据大小增长到 128 Mb 时,它被刷新到 HFile。但是磁盘上的存储文件大小差异是 36.8 Mb。压缩已关闭。它重复每次冲洗。
为什么会这样?我错过了什么吗?
我正在使用一些 java 使用 HbaseAdmin + "hadoop fs -du" 的实用程序监控 hbase。
Table 描述:
DATA_BLOCK_ENCODING => 'NONE', ENCODE_ON_DISK => 'true'
Hbase 日志:
2015-05-14 13:48:06,192 INFO regionserver.StoreFile (StoreFile.java:close(1334)) - NO General Bloom and NO DeleteFamily was added to HFile (hdfs://localhost:8020/hbase/sometable/8854a960778fe379d454a79e27b653a1/.tmp/dea0e9ac00be44a1a3acba3b900bdf54)
2015-05-14 13:48:06,192 INFO regionserver.Store (Store.java:internalFlushCache(921)) - Flushed , sequenceid=4460077, memsize=128.0m, into tmp file hdfs://localhost:8020/hbase/sometable/8854a960778fe379d454a79e27b653a1/.tmp/dea0e9ac00be44a1a3acba3b900bdf54
2015-05-14 13:48:06,232 INFO regionserver.Store (Store.java:commitFile(968)) - Added hdfs://localhost:8020/hbase/sometable/8854a960778fe379d454a79e27b653a1/r/dea0e9ac00be44a1a3acba3b900bdf54, entries=742515, sequenceid=4460077, filesize=36.8m
2015-05-14 13:48:06,233 INFO regionserver.HRegion (HRegion.java:internalFlushcache(1776)) - Finished memstore flush of ~128.0m/134226872, currentsize=428.4k/438664 for region sometable,,1431608601110.8854a960778fe379d454a79e27b653a1. in 3043ms, sequenceid=4460077, compaction requested=false
MemStore 在 ConcurrentSkipListMap 结构中存储 KeyValues (KV),在 64 位 JVM 上每个 KV 的开销为 124 字节。如果您的 puts 负载很小,例如一列只有几个字节的值,您将观察到 KV 堆大小和它们在磁盘上的大小之间存在显着差异。当 KV 持久化在磁盘上时,ConcurrentSkipListMap、对象和引用的开销显然不存在。这意味着如果您正在编写大量小的 put,您的 memstore 刷新将 运行 更快,但会在磁盘上产生比预期更小的 HFile。您可能需要相应地调整 HBase 压缩设置,例如通过增加 HFile 的最大数量。
我正在监视 hbase (0.94.18) 数据存储,发现 memstore 大小和刷新存储数据的大小不一样。
当 memstore 数据大小增长到 128 Mb 时,它被刷新到 HFile。但是磁盘上的存储文件大小差异是 36.8 Mb。压缩已关闭。它重复每次冲洗。
为什么会这样?我错过了什么吗?
我正在使用一些 java 使用 HbaseAdmin + "hadoop fs -du" 的实用程序监控 hbase。
Table 描述:
DATA_BLOCK_ENCODING => 'NONE', ENCODE_ON_DISK => 'true'
Hbase 日志:
2015-05-14 13:48:06,192 INFO regionserver.StoreFile (StoreFile.java:close(1334)) - NO General Bloom and NO DeleteFamily was added to HFile (hdfs://localhost:8020/hbase/sometable/8854a960778fe379d454a79e27b653a1/.tmp/dea0e9ac00be44a1a3acba3b900bdf54)
2015-05-14 13:48:06,192 INFO regionserver.Store (Store.java:internalFlushCache(921)) - Flushed , sequenceid=4460077, memsize=128.0m, into tmp file hdfs://localhost:8020/hbase/sometable/8854a960778fe379d454a79e27b653a1/.tmp/dea0e9ac00be44a1a3acba3b900bdf54
2015-05-14 13:48:06,232 INFO regionserver.Store (Store.java:commitFile(968)) - Added hdfs://localhost:8020/hbase/sometable/8854a960778fe379d454a79e27b653a1/r/dea0e9ac00be44a1a3acba3b900bdf54, entries=742515, sequenceid=4460077, filesize=36.8m
2015-05-14 13:48:06,233 INFO regionserver.HRegion (HRegion.java:internalFlushcache(1776)) - Finished memstore flush of ~128.0m/134226872, currentsize=428.4k/438664 for region sometable,,1431608601110.8854a960778fe379d454a79e27b653a1. in 3043ms, sequenceid=4460077, compaction requested=false
MemStore 在 ConcurrentSkipListMap 结构中存储 KeyValues (KV),在 64 位 JVM 上每个 KV 的开销为 124 字节。如果您的 puts 负载很小,例如一列只有几个字节的值,您将观察到 KV 堆大小和它们在磁盘上的大小之间存在显着差异。当 KV 持久化在磁盘上时,ConcurrentSkipListMap、对象和引用的开销显然不存在。这意味着如果您正在编写大量小的 put,您的 memstore 刷新将 运行 更快,但会在磁盘上产生比预期更小的 HFile。您可能需要相应地调整 HBase 压缩设置,例如通过增加 HFile 的最大数量。