我想问您,hbase表上当前的模式设计是否适用于以下场景:我每天接收1000万个事件,每个事件都有一个unix epoch时间戳和一个id。我必须按天分组,以便可以轻松地扫描在特定日期发生的事件。
当前设计:事件时间戳被转换为格式“mm-yyyy\u dd”字符串作为键,并且当天发生的事件的每个id都存储在行中。这将导致一行中最多有1000万列。据我所知,hbase在一行上写东西是有限制的。导致在一天导入时有许多锁,并降低性能。
也许这是一个更好的设计?:使用unix epoch时间戳作为一行的键,结果是许多行有几千列(几个事件可能在同一秒发生,因为我的时间戳的最大分辨率是1秒)。扫描时,可以计算unix epoch中的开始和结束时间并进行扫描。
2条答案
按热度按时间hi3rlvi21#
hbase最适合用于更快的随机读写。除此之外,你还得格外小心。在您的情况下,将行键保留为day是非常糟糕的,因为正如您所说的,它将导致数百万列。这不是个好习惯。大多数情况下,当保存如此大的行时,可能会导致内存问题。
您需要分组/分区-然后使用带过滤器的扫描不是一个坏方法。您可以使用“singlecolumnvaluefilter”基于列进行查询。与rowkey扫描相比,性能将不是最佳的。再说一次,我不确定你期望的React时间。
olmpazwi2#
我将列出一些关于hbase的知识,它可能对您决定如何更好地修改您的设计很有用。
hbase是基于列的分布式数据库。它根据行键的前缀在不同的节点上分发记录。因此,这取决于您有多少个节点,在您的情况下,它将按以下方式工作:不同月份的记录将转到不同的节点(特定月份所有日期的所有数据将转到单个节点)。
同时,可以使用长行键(带有eventid后缀),这很可能不会对分发造成太大影响。hbase允许基于行键的前缀构建扫描查询,但不能完全匹配。