可以转载,请注明:http://blog.youkuaiyun.com/oozie123。
1 Number of Column Families
目前还不能在两个及以上Column Families上运行良好,建议1个,参考On the number of column families。
2 Key and Attribute Lengths
尽可能短,另外使用压缩,参见Try to minimize row and column sizes。
3 Table RegionSize
每个表的regionsize可以被设置通过HTableDescriptor
,它会覆盖默认配置文件中的设置,具体怎么设置,参考前面一篇文章:容量规划和Region配置。
4 Bloom Filters
Bloom Filter过滤器作为一种数据结构,它别设计为预测一个给定的元素是否属于一组元素集合。从Bloom Filter过滤器返回的数据不一定是完全准确的,它主要应用于大数据集(大到hash机制无法容忍),并能提供足够准的返回结果。更多Bloom Filter过滤器相关信息,参加http://en.wikipedia.org/wiki/Bloom_filter。
对HBase而言,Bloom Filter过滤器提供了轻量级的内存模型,去减少磁盘的读,当给定一个Get
操作(Bloom Filter对scans无效),它只会去查找相关行的StoreFiles
,并行的读性更能提升不少。
Bloom Filter过滤器本身储存在HFile的元数据中,它们不需要更新,当一个部署在RegionServer上region时,HFile是打开的,这时Bloom Filter过滤器会被加载至内存。
HBase包含了很多有关Bloom Filter过滤器的调优参数,如调整块大小,提高命中率等。
从HBase 0.96开始,Bloom Filter过滤器被默认开启,基于row-based
。
更多有关HBase的Bloom Filter过滤器,参见Bloom Filters,相关讨论参见How are bloom filters used in HBase?。
4.1 什么时候运用Bloom Filters
从HBase 0.96开始,基于row-based
的Bloom Filter被默认使用,根据数据特征和如何加载至HBase,你也可以更改为基于row+column
的Bloom Filter。
为了确定Bloom Filters是否有积极的影响,查看RegionServer metrics
选项上的blockCacheHitRatio
值是否有所提升。如果Bloom Filters开启了,blockCacheHitRatio
值应该是会提升的,因为Bloom Filters过滤了不需要的blocks。
可以选择基于row+column
的Bloom Filter,但是如果是scan所有的行,这种选择没任何益处。当有大量的column-level Puts,这样一行可能位于任何StoreFile,基于row-based
的Bloom Filter不是很奏效,基于row+column
Bloom Filter是不错的选择,排除一行只有一个column,那么Bloom Filter需要更多空间储存keys。当一个数据实体的大小至少千字节时,Bloom Filter会相当奏效。
当数据被储存在几个大的StoreFiles,低速的scans去查找特定的行时,会避免额外的磁盘IO。
Bloom Filter在执行删除操作时需要重建,所以不要产生大量的删除操作。
4.2 使能Bloom Filters
Bloom Filters基于Column Family使能,可以使用HBase API中HColumnDescriptor
设置,也可以在hbase shell中设置,如下:
hbase> create 'mytable',{NAME => 'colfam1', BLOOMFILTER => 'ROWCOL'}
4.3 在服务器端配置Bloom Filters
io.hfile.bloom.enabled
:是否开启bloom filtersio.hfile.bloom.error.rate
:失败率io.hfile.bloom.max.fold
:不用修改io.storefile.bloom.max.keys
:single-block,最大keysio.storefile.delete.family.bloom.enabled
:使能删除Family Bloom filtersio.storefile.bloom.block.size
:Bloom block sizehfile.block.bloom.cacheonwrite
:使能cache-on-write
5 ColumnFamily BlockSize
表的每个ColumnFamily都可以设置blocksize,默认是64K,大的cell values需要大的blocksizes,blocksizes与StoreFile indexes是反相关的。更多参见HColumnDescriptor。
6 In-Memory ColumnFamilies
ColumnFamilies可以被设置为in-memory
,在Block Cache
中in-memory
blocks拥有最高优先级,但不保证整个表都被放入内存。参见HColumnDescriptor。
7 Compression
生产环境一般都会在ColumnFamily上定义压缩,参考 Compression and Data Block Encoding In HBase.
7.1 However…
当数据在in-memory
(如在MemStore)或者正在写(在RegionServer和Client之间传输),它是不会被压缩的。更多参考Try to minimize row and column sizes。