参见关于列族数。
请参阅尝试最小化行和列大小。另见但是...... 用于压缩警告。
在某些表需要与配置的默认区域大小不同的区域大小的情况下,可以通过 HTableDescriptor 上的setFileSize
在每个表的基础上设置区域大小。
有关详细信息,请参阅确定区域计数和大小。
以其创建者 Burton Howard Bloom 命名的 Bloom 过滤器是一种数据结构,旨在预测给定元素是否是一组数据的成员。 Bloom 过滤器的阳性结果并不总是准确的,但保证阴性结果是准确的。布隆过滤器被设计成对于数据集“足够准确”,这些数据集非常大以至于传统的散列机制是不切实际的。有关 Bloom 过滤器的更多信息,请参阅 http://en.wikipedia.org/wiki/Bloom_filter 。
就 HBase 而言,Bloom 过滤器提供了一个轻量级的内存结构,以便将给定 Get 操作(Bloom 过滤器不能与 Scans 一起使用)的磁盘读取次数减少到仅可能包含所需 Row 的 StoreFiles。潜在的性能增益随着并行读取的数量而增加。
Bloom 过滤器本身存储在每个 HFile 的元数据中,永远不需要更新。当因为区域部署到 RegionServer 而打开 HFile 时,Bloom 过滤器将加载到内存中。
HBase 包括一些调整机制,用于折叠 Bloom 过滤器以减小大小并将误报率保持在所需范围内。
在 HBASE-1200 中引入了 Bloom 过滤器。自 HBase 0.96 起,默认情况下启用基于行的 Bloom 过滤器。 ( HBASE-8450 )
有关与 HBase 相关的布隆过滤器的更多信息,请参阅布隆过滤器以获取更多信息,或参考以下 Quora 讨论:如何在 HBase 中使用布隆过滤器? 。
自 HBase 0.96 起,默认情况下启用基于行的 Bloom 过滤器。您可以选择禁用它们或更改某些表以使用行+列 Bloom 过滤器,具体取决于数据的特征以及如何将其加载到 HBase 中。
要确定 Bloom 过滤器是否会产生积极影响,请检查 RegionServer 度量标准中的blockCacheHitRatio
值。如果启用了布隆过滤器,则blockCacheHitRatio
的值应该增加,因为布隆过滤器正在过滤掉绝对不需要的块。
您可以选择为行或行+列组合启用 Bloom 过滤器。如果您通常扫描整行,则行+列组合不会提供任何好处。基于行的 Bloom 过滤器可以在行+列 Get 上运行,但不能相反。但是,如果您有大量的列级 Puts,这样每个 StoreFile 中可能存在一行,则基于行的过滤器将始终返回正结果并且不会带来任何好处。除非每行有一列,否则行+列布隆过滤器需要更多空间,以便存储更多键。当每个数据条目的大小至少为几千字节时,Bloom 过滤器最有效。
当您的数据存储在几个较大的 StoreFiles 中时,开销将减少,以避免在低级扫描期间额外的磁盘 IO 以查找特定行。
Bloom 过滤器需要在删除时重建,因此可能不适合具有大量删除的环境。
在列族上启用布隆过滤器。您可以使用 HColumnDescriptor 的 setBloomFilterType 方法或使用 HBase API 来完成此操作。有效值为NONE
,ROW
(默认值)或ROWCOL
。有关ROW
与ROWCOL
的更多信息,请参见何时使用布隆过滤器。另请参阅 HColumnDescriptor 的 API 文档。
以下示例创建一个表,并在colfam1
列族上启用 ROWCOL Bloom 过滤器。
hbase> create 'mytable',{NAME => 'colfam1', BLOOMFILTER => 'ROWCOL'}
您可以在 hbase-site.xml 中配置以下设置。
参数 | 默认 | 描述 |
---|---|---|
io.storefile.bloom.enabled | 是 | 如果出现问题,设置为 no 以杀死服务器范围内的 bloom 过滤器 |
io.storefile.bloom.error.rate | 0.01 | 布隆过滤器的平均误报率。折叠用于维持误报率。表示为百分比的十进制表示。 |
io.storefile.bloom.max.fold | 7 | 保证最大折叠率。不需要更改此设置,不建议这样做。 |
io.storefile.bloom.max.keys | 1.28 | 对于默认(单块)布隆过滤器,它指定最大键数。 |
io.storefile.delete.family.bloom.enabled | 真正 | 主开关启用 Delete Family Bloom 过滤器并将其存储在 StoreFile 中。 |
io.storefile.bloom.block.size | 131072 | 目标 Bloom 块大小。大约这个大小的布隆过滤器块与数据块交织。 |
hfile.block.bloom.cacheonwrite | 假 | 为复合布隆过滤器的内联块启用写入高速缓存。 |
可以为表中的每个 ColumnFamily 配置 blocksize,默认为 64k。较大的单元值需要较大的块大小。 blocksize 与生成的 StoreFile 索引之间存在反比关系(即,如果块大小加倍,则结果索引应大致减半)。
有关详细信息,请参阅 HColumnDescriptor 和 Store 。
ColumnFamilies 可以选择定义为内存中。数据仍然保留在磁盘上,就像任何其他 ColumnFamily 一样。内存块在块缓存中具有最高优先级,但不保证整个表将在内存中。
有关详细信息,请参阅 HColumnDescriptor 。
生产系统应使用其 ColumnFamily 定义进行压缩。有关详细信息,请参阅 HBase 中的压缩和数据块编码。
压缩会压缩磁盘上的数据 。当它在内存中(例如,在 MemStore 中)或在线上(例如,在 RegionServer 和 Client 之间传输)时,它会膨胀。因此,虽然使用 ColumnFamily 压缩是最佳做法,但它不会完全消除过大的 Keys,超大的 ColumnFamily 名称或超大的列名称的影响。
请参阅尝试最小化模式设计技巧的行和列大小,以及 KeyValue 以获取有关 HBase 内部存储数据的更多信息。