在HBase中,每个HFile存储的是一个表中一个列族的数据,也就是说,当一个表中有多个列簇时,针对每个列簇插入数据,最后产生的数据是多个HFile,每个对应一个列族,通过如下操作验证
1. 建立一个有两个列族的表
create 'members','colfam1','colfam2'
2. 在members表中的colfam1中插入50*50*50条数据,然后flush到磁盘,通过UI观察MemStore和HFile个数的变化
for i in '0'..'50' do for j in '0'..'50' do for k in '0'..'50' do put 'members', "row-colfam1-#{i}#{j}#{k}", "colfam1:#{j}#{k}", "#{j}#{k}" end end end
做完如上操作, members表的HFile数目不变,但是MemStore占用23.3M空间
4. 将members表数据flush到磁盘
flush 'members'
做完如上操作, members表的HFile数目增1,但是MemStore占用10几K空间,即MemStore的内存空间被释放
5.
5.1 在members表中的colfam1和colfam2中分别插入1条数据
for i in '100'..'100' do for j in '100'..'100' do for k in '100'..'100' do put 'members', "row-colfam1-#{i}#{j}#{k}", "colfam1:#{j}#{k}", "#{j}#{k}" end end end for i in '100'..'100' do for j in '100'..'100' do for k in '100'..'100' do put 'members', "row-colfam2-#{i}#{j}#{k}", "colfam2:#{j}#{k}", "#{j}#{k}" end end end
做完如上操作, members表的HFile数目不变,因为数据量小,MemStore的变化也基本没有
5.2 将members表数据flush到磁盘
flush 'members'
做完如上操作,即使数据量很小,members表的HFile数目也是增加了两个,可见HBase为每个列簇创建了一个HFile文件
Num.Store vs Num.Storefiles
在HBase的UI,有两个统计指标,Num.Store和Num.Storefiles,其中Num.Store表示Store的数目,一个Column Family对应一个Store;Num.Storefile对应着这个表的所有HFile的数目,每个Storefile根据其对应的ColumnFamily不同,分属于不同的Store,但是HBase UI上看不出来,每个Store有几个Storefiles
http://hadoop.master:16301/rs-status?filter=all#memoryStats
http://hadoop.master:16301/rs-status?filter=all#regionStoreStats