我需要在HBase表上计算聚合。
假设我有这个 hbase 表:"元数据" 列族:M 列:n
此处元数据对象具有字符串列表
类元数据{列表标签;
}
我需要计算我正在考虑使用的标签计数,要么使用 mapReduce 要么直接通过 hbase 扫描。
结果必须即时返回。那么在这种情况下我可以使用哪一个呢?扫描 hbase 并计算聚合或地图减少?
Mapreduce最终将扫描hbase并计算计数。
使用其中任何一个的优缺点是什么?
我怀疑你不知道HBase的优缺点是什么,它不适合计算大型数据集的实时聚合。
让我们首先说MapReduce本身就是一个计划作业,您将无法即时返回响应,预计任务跟踪器初始化作业的时间不少于15秒。
最后,MapReduce作业将做完全相同的事情:HBase扫描,立即执行扫描和MapReduce之间的区别只是平行化和数据局部性,当你有数百万/数十亿行时,它表现出色。如果您的查询只需要读取几千个连续的行来聚合它们,当然,您可以进行扫描,它可能具有可接受的响应时间,但对于较大的数据集,在查询时不可能做到这一点。
HBase 最适合处理大量原子读取和写入,这样,无论您需要多少预聚合计数器或将收到多少请求,您都可以实时维护这些聚合:通过适当的行键设计和拆分策略,您可以扩展以满足需求。
将其视为字数统计,您可以将所有单词存储在列表中,并在请求时在查询时对其进行计数,或者您可以在插入时处理该列表并存储每个单词在文档中的使用次数,作为全局计数器,以及每天、每月、每年、每个国家、每个作者表(甚至家庭)。