HBase:创建多个表或包含多个列的单个表?

2024-04-14

什么时候创建多个表而不是创建具有大量列的单个表才有意义。据我了解,表通常只有几个列族 (1-2),每个列族可以支持 1000 多个列。

当 HBase 似乎在单个表中可能存在大量列时表现良好时,什么时候创建单独的表才有意义?


在回答问题本身之前,让我首先陈述一些起作用的主要因素。我假设使用的文件系统是 HDFS。

  1. 表被划分为键空间的不重叠的分区,称为区域。

  2. 键范围 -> 区域映射存储在一个称为元的特殊单区域表中。

  3. 一个区域的一个 HBase 列族中的数据存储在单个 HDFS 目录中。它通常是多个文件,但出于所有意图和目的,我们可以假设列族的区域数据存储在 HDFS 上的单个文件中,称为 StoreFile / HFile。

  4. StoreFile 本质上是一个包含 KeyValue 的排序文件。 KeyValue 在逻辑上按顺序表示以下内容:(RowLength、RowKey、FamilyLength、FamilyName、Qualifier、Timestamp、Type)。例如,如果您的 CF 区域中只有两个 KV,其中键相同但值在两列中,则 StoreFile 的外观如下(除了它实际上是字节编码的,并且长度等元数据也是如此)正如我上面提到的那样存储):

    Key1:Family1:Qualifier1:Timestamp1:Value1:Put
    
    Key1:Family1:Qualifier2:Timestamp2:Value2:Put
    
  5. StoreFile 分为blocks(默认64KB)并且每个数据块包含的key范围通过多级索引进行索引。可以使用索引+二分搜索来完成单个块内的随机查找。然而,在找到扫描所需的第一个块中的起始位置之后,扫描必须连续地通过特定块。

  6. HBase 是一个基于 LSM 树的数据库,这意味着它有一个内存日志(称为Memstore)定期刷新到创建 StoreFiles 的文件系统。 Memstore 为特定列族的单个区域内的所有列共享。

在处理从 HBase 读取数据/向 HBase 写入数据时涉及多种优化,但上面给出的信息在概念上是正确的。鉴于上述陈述,以下是使用多个列与多个表相比其他方法的优点:

单表多列

  1. 由于前缀编码,磁盘上的压缩效果更好,因为键的所有数据都存储在一起,而不是跨表存储在多个文件中。由于数据大小较小,这也会导致磁盘活动减少。
  2. 元表上的负载较小,因为区域总数会较小。您将拥有一张表的 N 个区域,而不是 M 个表的 N*M 个区域。这意味着更快的区域查找和元表上的低争用,这是大型集群所关心的问题。
  3. 当您需要读取单个行键的多个列时,读取速度更快且 IO 放大较低(导致磁盘活动减少)。
  4. 当为单个行键写入多个列时,您可以利用行级事务、批处理和其他性能优化。

何时使用这个:

  1. 如果您想跨多列执行行级事务,您have to将它们放在一个表中。
  2. 即使您不需要行级事务,但您经常向多个列写入或查询同一行键。一个好的经验法则是,如果平均而言,超过 20% 的列具有单行值,您应该尝试将它们放在一个表中。
  3. 当你有太多列时。

多表

  1. 如果扫描主要只关注一列,则每个表的扫描速度更快,IO 放大也更低(请记住,扫描中的顺序查找将不必要地读取它们不需要的列)。
  2. 良好的数据逻辑分离,特别是当您不需要跨列共享行键时。为一种类型的行键设置一张表。

何时使用:

  1. 当数据有明确的逻辑分离时。例如,如果不同列集的行键架构不同,请将这些列集放在单独的表中。
  2. 当只有一小部分列具有行键值时(请参阅下面的更好方法)。
  3. 您希望为不同的列集设置不同的存储配置。例如。 TTL、压缩率、阻塞文件计数、memstore 大小等(请在下面查看此用例中更好的方法)。

另一种选择:单个表中的多个 CF

从上面可以看出,这两种方法都有优点。如果您的多列具有相同的行键结构(因此,您希望共享行键以提高存储效率或需要跨列事务)但数据非常稀疏(这意味着您只写/读),那么选择变得非常困难行键的一小部分列)。 在这种情况下,您似乎需要两全其美。这就是列族的用武之地。如果您可以将列集分区为逻辑子集,其中您主要只访问/读/写单个子集,或者您需要每个子集的存储级别配置(例如 TTL、存储类、写入大量压缩计划)等),那么您可以将每个子集设为一个列族。 由于特定列族的数据存储在单个文件(文件集)中,因此您可以在读取列子集时获得更好的局部性,而不会减慢扫描速度。

然而,有一个问题:

不要尝试不必要地使用列族。它们是有相关成本的,而且由于 HBase 中区域级写锁、监控等的工作方式,HBase 不能很好地处理 10 个以上的 CF。仅当跨 CF 的列之间存在逻辑关系,但通常不会跨 CF 执行操作或需要为不同的 CF 设置不同的存储配置时,才使用 CF。 如果您在所有列之间共享行键架构,那么仅使用包含所有列的单个 CF 是完全可以的,除非您有一个非常稀疏的数据集,在这种情况下,您可能需要基于上述要点的不同 CF 或不同表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HBase:创建多个表或包含多个列的单个表? 的相关文章

随机推荐

  • C++ pow 函数得到一个奇怪的结果[重复]

    这个问题在这里已经有答案了 使用某些版本的 minGW 以下代码将打印 99 int high high pow 10 2 std cout lt
  • String.IndexOf 方法的表达式树

    我应该如何构建表达式树string IndexOf substring StringComparison OrdinalIgnoreCase 我可以在没有第二个参数的情况下让它工作 StringComparison OrdinalIgnor
  • 是否有一种与系统无关的方法来确定表示当前目录级别和父目录级别的字符串?

    C 代码可以运行的不同环境对于文件和目录路径必须是什么样子有不同的约定 规则 一个常见的示例是分隔目录级别的字符 在 Windows 上 它是 在Linux上 它是 还有其他 也是未来的 系统可能遵循不同的规则 因此 为了创建健壮的代码 建
  • PostgreSQL:将结果与标题复制/粘贴到 Excel 中,无需代码

    我使用 MS SQL Server 2008 R2 MS SQL 我可以右键单击查询结果 将其与标题一起复制 粘贴到 Excel 中 以便于探索 现在使用 PG Admin PostgreSQL 我必须执行导出 文件 gt 导出 gt CS
  • 如何使用 .NET XML API 删除 xmlns 属性

    XmlElement Attributes Remove 方法对于任意属性都可以正常工作 导致已删除的属性从 XmlDocument OuterXml 属性中删除 然而 Xmlns 属性是不同的 这是一个例子 XmlDocument doc
  • “FOR UPDATE”v/s“LOCK IN SHARE MODE”:允许并发线程读取锁定行的更新“状态”值

    我有以下场景 用户 X 从位置 lc1 登录到应用程序 调用它Ulc1 用户 X 已被黑客攻击 或者他的某个朋友知道他的登录凭据 或者他只是从他计算机上的不同浏览器登录 等等 你明白了 从位置 lc2 同时登录 调用它Ulc2 我正在使用一
  • GraphQL 代码中的 Javascript 循环依赖

    我是 Javascript 新手 不知道如何解决这个问题 我正在创建一个 GraphQL 服务来提供对数据库的查询 我想定义三种类型 个人 公司和关系 type Relation person Person company Company
  • Java 如何向字符串添加重音符号“e”?

    在tucuxi现有职位的帮助下Java 不使用正则表达式从 String 中删除 HTML https stackoverflow com questions 2488967 java remove html from string wit
  • Java Lambda 表达式 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 Java 8 中添加了 Lambda 表达式 我想了解为什么这很重要 对于尚未接触过函数式编程习惯的 Java 程序员来说 这意味着什么 这是否意味着
  • Postgresql - 加密 jsonb 数据

    我的 postgres 表中有一个 jsonb 列 用于存储 json 数据 我想以加密格式存储数据并能够查询并获取纯文本值 有办法做到吗 Use the pgcrypto https www postgresql org docs cur
  • 处理序列中的每一对

    我正在寻找一种简洁的方法来处理 NET 中序列中的每对 无序 元素 我知道我可以用嵌套来做到这一点for循环 但我一直在寻找更具可读性的东西 我正在想象类似修改过的东西Any 扩展方法 IEnumerable
  • C# 在下一行之前等待或暂停 X 秒

    我想找出执行以下操作的最佳方法是什么 我有一个与 httpwebrequest 一起使用的控制台应用程序 在我的应用程序的某些部分我想这样做 agent GetURL http site com etc Wait for 8 16 Seco
  • 在 IOS 中单击时更改按钮文本颜色

    我知道这个问题经常被问到 并且许多答案都是正确的 我的代码中遇到了问题 我有单选按钮 当用户单击按钮时 背景颜色和文本颜色会发生变化 背景颜色按我的预期更改 但单击按钮时文本颜色变为蓝色区域 我已将其编码为在单击时更改白色 但是当我单击按钮
  • 将 Map key 反序列化为 POJO 引用

    Jackson 是否可以从给定 id 的相同 json 字符串中获取对先前反序列化对象的引用 例如 我有以下 Java 类 public class Company List
  • 将 iPhone 应用程序上传到 AppStore 的步骤

    我想知道将我的 iPhone 应用程序上传到 AppStore 的基本步骤 如何使用证书创建配置文件以及上传应用程序还需要执行哪些其他设置 我刚刚使用 Xcode 和 iPhone SDK V2 2 1 在 iMac 上制作了一个应用程序
  • 所有方法都返回“.autoNumeric 不是函数 - 无法取消数字格式”

    我试图获取使用 autoNumeric 格式化的输入数字的原始值 但不能 因为我尝试执行此操作的每种方法都会返回 autoNumeric 不是函数 在控制台中 document ready function new AutoNumeric
  • 使用Android GPS检测并与其他手机连接

    所以我昨天问了类似的问题 并且确实收到了我的问题的答案 但是我真的认为我问得不正确 因此没有收到我需要的确切信息 我正在寻找 API 一些开源代码 甚至只是其他人在 Android 上实现这一目标的方法 我正在制作一个应用程序 需要查找指定
  • 为什么Python中没有len(file)?

    我对 Python 并不陌生 但我仍然很难理解是什么让某些东西变得 Pythonic 反之亦然 如果这是一个愚蠢的问题 请原谅我 但是为什么我不能通过执行 len file 来获取文件的大小 file len 甚至没有实现 所以它不像其他东
  • 过度使用 If else 语句

    我有一个查询 那就是我使用了一种方法 但是我很多次使用了 If Else 不是它变得非常含糊 请建议我也可以使用其他条件循环吗 下面是我的代码 if cardType AARP CARD TYPE userResponse messageB
  • HBase:创建多个表或包含多个列的单个表?

    什么时候创建多个表而不是创建具有大量列的单个表才有意义 据我了解 表通常只有几个列族 1 2 每个列族可以支持 1000 多个列 当 HBase 似乎在单个表中可能存在大量列时表现良好时 什么时候创建单独的表才有意义 在回答问题本身之前 让