过去我使用MySQL构建OLAP立方体来进行Web分析。 现在,我所使用的OLAP立方体实际上就是一个大表(当然,它存储得比普通表更加巧妙),其中每一行基本上都是一个测量值或者是一个聚合的集合。每个测量值都有一些维度(例如页面名称、用户代理、IP等等)和一些值(例如页面访问次数、访问用户数等等)。
你可以对这样的表进行的查询通常采用如下形式的元SQL:
SELECT SUM(hits), SUM(bytes),
FROM MyCube
WHERE date='20090914' and pagename='Homepage' and browser!='googlebot'
GROUP BY hour
所以,使用提到的筛选条件,你可以获得所选日期每小时的总计数。一个问题是这些立方体通常意味着要进行完整的表扫描(各种原因),这就限制了你可以创建这些东西的大小(以 MiB 为单位)。我目前正在学习 Hadoop 等工具的详细使用。
在 BigTable 上将上述查询作为 MapReduce 运行似乎很容易:只需将“hour”作为键,在 map 中过滤并通过求和降低数据值。
你能否在类似于 BigTable 的系统中“实时”运行像我上面展示的查询(或者至少具有相同的输出),而不是以批处理方式运行?
如果不能,那么在 BigTable/Hadoop/HBase/Hive 等领域做这样的事情的适当技术是什么?