119.1。列族数

参见关于列族数

119.2。键和属性长度

请参阅尝试最小化行和列大小。另见但是...... 用于压缩警告。

119.3。表 RegionSize

在某些表需要与配置的默认区域大小不同的区域大小的情况下,可以通过 HTableDescriptor 上的setFileSize在每个表的基础上设置区域大小。

有关详细信息,请参阅确定区域计数和大小

119.4。布隆过滤器

以其创建者 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 中使用布隆过滤器?

119.4.1。何时使用布隆过滤器

自 HBase 0.96 起,默认情况下启用基于行的 Bloom 过滤器。您可以选择禁用它们或更改某些表以使用行+列 Bloom 过滤器,具体取决于数据的特征以及如何将其加载到 HBase 中。

要确定 Bloom 过滤器是否会产生积极影响,请检查 RegionServer 度量标准中的blockCacheHitRatio值。如果启用了布隆过滤器,则blockCacheHitRatio的值应该增加,因为布隆过滤器正在过滤掉绝对不需要的块。

您可以选择为行或行+列组合启用 Bloom 过滤器。如果您通常扫描整行,则行+列组合不会提供任何好处。基于行的 Bloom 过滤器可以在行+列 Get 上运行,但不能相反。但是,如果您有大量的列级 Puts,这样每个 StoreFile 中可能存在一行,则基于行的过滤器将始终返回正结果并且不会带来任何好处。除非每行有一列,否则行+列布隆过滤器需要更多空间,以便存储更多键。当每个数据条目的大小至少为几千字节时,Bloom 过滤器最有效。

当您的数据存储在几个较大的 StoreFiles 中时,开销将减少,以避免在低级扫描期间额外的磁盘 IO 以查找特定行。

Bloom 过滤器需要在删除时重建,因此可能不适合具有大量删除的环境。

119.4.2。启用布隆过滤器

在列族上启用布隆过滤器。您可以使用 HColumnDescriptor 的 setBloomFilterType 方法或使用 HBase API 来完成此操作。有效值为NONEROW(默认值)或ROWCOL。有关ROWROWCOL的更多信息,请参见何时使用布隆过滤器。另请参阅 HColumnDescriptor 的 API 文档。

以下示例创建一个表,并在colfam1列族上启用 ROWCOL Bloom 过滤器。

hbase> create 'mytable',{NAME => 'colfam1', BLOOMFILTER => 'ROWCOL'} 

119.4.3。配置 Bloom 过滤器的服务器范围行为

您可以在 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 为复合布隆过滤器的内联块启用写入高速缓存。

119.5。 ColumnFamily BlockSize

可以为表中的每个 ColumnFamily 配置 blocksize,默认为 64k。较大的单元值需要较大的块大小。 blocksize 与生成的 StoreFile 索引之间存在反比关系(即,如果块大小加倍,则结果索引应大致减半)。

有关详细信息,请参阅 HColumnDescriptorStore

119.6。内存列家庭

ColumnFamilies 可以选择定义为内存中。数据仍然保留在磁盘上,就像任何其他 ColumnFamily 一样。内存块在块缓存中具有最高优先级,但不保证整个表将在内存中。

有关详细信息,请参阅 HColumnDescriptor

119.7。压缩

生产系统应使用其 ColumnFamily 定义进行压缩。有关详细信息,请参阅 HBase 中的压缩和数据块编码。

119.7.1。然而...

压缩会压缩磁盘上的数据 。当它在内存中(例如,在 MemStore 中)或在线上(例如,在 RegionServer 和 Client 之间传输)时,它会膨胀。因此,虽然使用 ColumnFamily 压缩是最佳做法,但它不会完全消除过大的 Keys,超大的 ColumnFamily 名称或超大的列名称的影响。

请参阅尝试最小化模式设计技巧的行和列大小,以及 KeyValue 以获取有关 HBase 内部存储数据的更多信息。