HBase 架构设计正确吗?
HBase schema design correct?
我想问您 HBase 上的当前模式设计 table 对于以下场景是否正确:
我每天收到 1000 万个事件,每个事件都有一个 unix 纪元时间戳和一个 ID。我将不得不按天分组,以便我可以轻松扫描特定日期发生的事件。
当前设计:
事件时间戳转换为格式 "MM-YYYY_DD" 字符串作为键,并将当天发生的事件的每个 id 存储在行中。这将导致一行中有多达 1000 万列。
据我了解 HBase,在单行上写是有锁的。导致一天导入时有很多锁,性能下降。
也许这会是一个更好的设计?:使用 unix 纪元时间戳作为行的键导致许多行有几千列(多个事件可能在同一秒内发生,因为我的时间戳的最大分辨率为一秒)。
扫描的时候可以算出unix纪元的起止时间,然后扫描。
我只是列出一些关于hbase的知识,可能对你决定如何更好地修改你的设计有帮助。
HBase 是基于列的分布式数据库。它根据行键的前缀在不同节点之间分发记录。因此取决于您有多少个节点,在您的情况下它将按以下方式工作:不同月份的记录将转到不同的节点(特定月份所有日期的所有数据将转到单个节点)。
同时,可以使用长行键(带有 eventid 后缀),这很可能不会对分发产生太大影响。
HBase 允许基于行键的前缀构建扫描查询,但不能完全匹配。
HBase 最适合用于更快的随机读写。除此之外,您必须格外小心。在您的情况下,将行键保留为一天是非常糟糕的,因为正如您所说,它将产生数百万列。这不是好的做法。大多数情况下,当持有如此大的行时,您可能最终会遇到内存问题。
您想要 grouping/partitioning - 然后使用带有过滤器的扫描是一个不错的方法。您可以基于具有 "SingleColumnValueFilter" 的列进行查询。与行键扫描相比,性能不是最佳的。同样,我不确定您期望的响应时间是多少。
我想问您 HBase 上的当前模式设计 table 对于以下场景是否正确: 我每天收到 1000 万个事件,每个事件都有一个 unix 纪元时间戳和一个 ID。我将不得不按天分组,以便我可以轻松扫描特定日期发生的事件。
当前设计: 事件时间戳转换为格式 "MM-YYYY_DD" 字符串作为键,并将当天发生的事件的每个 id 存储在行中。这将导致一行中有多达 1000 万列。 据我了解 HBase,在单行上写是有锁的。导致一天导入时有很多锁,性能下降。
也许这会是一个更好的设计?:使用 unix 纪元时间戳作为行的键导致许多行有几千列(多个事件可能在同一秒内发生,因为我的时间戳的最大分辨率为一秒)。 扫描的时候可以算出unix纪元的起止时间,然后扫描。
我只是列出一些关于hbase的知识,可能对你决定如何更好地修改你的设计有帮助。
HBase 是基于列的分布式数据库。它根据行键的前缀在不同节点之间分发记录。因此取决于您有多少个节点,在您的情况下它将按以下方式工作:不同月份的记录将转到不同的节点(特定月份所有日期的所有数据将转到单个节点)。
同时,可以使用长行键(带有 eventid 后缀),这很可能不会对分发产生太大影响。 HBase 允许基于行键的前缀构建扫描查询,但不能完全匹配。
HBase 最适合用于更快的随机读写。除此之外,您必须格外小心。在您的情况下,将行键保留为一天是非常糟糕的,因为正如您所说,它将产生数百万列。这不是好的做法。大多数情况下,当持有如此大的行时,您可能最终会遇到内存问题。
您想要 grouping/partitioning - 然后使用带有过滤器的扫描是一个不错的方法。您可以基于具有 "SingleColumnValueFilter" 的列进行查询。与行键扫描相比,性能不是最佳的。同样,我不确定您期望的响应时间是多少。