谷歌分析数据库

18

有没有人知道Google Analytics中的数据是如何组织的?他们在处理海量数据时非常快速,这是什么类型的数据库结构?

有人知道Google Analytics中的数据是如何组织的吗?他们可以快速地从海量数据中进行复杂的选择,那么它使用的是什么样的数据库结构呢?请注意保留原文中的HTML标签。

1
我猜大多数在谷歌工作的开发人员都签了某种保密协议,不允许谈论此事。 - Kolky
下面的答案很有启发性,但我仍然想知道他们是如何组织这些数据的?他们是否使用实时的Map/Reduce,还是所有分数已经预先计算好了?如果是后者,那么他们是如何组织这些数据的,因为API允许进行复杂的过滤和分组,最多可达7个维度? - Jim Soho
6个回答

11
据我所知,Google Analytics源于Urchin。正如已经说过的那样,由于现在Analytics是Google家族的一部分,因此有可能正在使用MapReduce/BigTable。我可以假设Google已经将旧版Urchin DB与新版BigTable/MapReduce集成起来。
我找到了这些链接,它们谈论了Urchin DB。可能其中的一些内容目前仍在使用中。

http://www.advanced-web-metrics.com/blog/2007/10/16/what-is-urchin/

这段话的意思是:

[省略] ... 仍然使用专有数据库来存储报告数据,这使得自由查询有些受限,因为你必须使用Urchin开发的工具而不是更灵活的SQL工具。

http://www.urchinexperts.com/software/faq/#ques45

Urchin使用专有的平面文件数据库来存储报告数据。高性能的数据库架构可以有效地处理非常高流量的网站。该数据库架构的一些好处包括:

* Small database footprint approximately 5-10% of raw logfile size
* Small number of database files required per profile (9 per month of historical reporting)
* Support for parallel processing of load-balanced webserver logs for increased performance
* Databases are standard files that are easy to back up and restore using native operating system utilitiesv 

有关Urchin的更多信息

http://www.google.com/support/urchin45/bin/answer.py?answer=28737

很久以前,我曾经使用过一款跟踪器,在他们的网站上讨论了数据规范化的问题:http://www.2enetworx.com/dev/articles/statisticus5.asp
在那里你可以找到一些关于如何减少数据库中数据的信息,也许这是一个良好的研究起点。

5

2

我认为他们使用他们的“Big Table”。

(说明:此段内容为原文,无需翻译)

2
我无法确切地了解它们是如何实现的。但是,因为我制作了一个从Google Analytics中提取非采样、非聚合数据的产品,所以我对其结构有了一些了解。
数据通过BigTable进行填充是有道理的。 BT提供本地化数据意识和跨n节点的映射/归约查询。
不同计数 (一个数据服务是否能够提供不同计数,是数据模型灵活性的一个简单度量标准,但通常也是成本和性能的度量标准)
Google Analytics并不适用于执行不同计数,即使GA可以按几乎任何维度计算用户数量,但它不能计算例如每个ga:pagePath的会话次数? 为什么... 好吧,他们只在会话的第一个页面视图中注册会话。 这意味着我们只能计算有多少个登陆页已经有了会话。 我们没有所有其他站点上99%页面的计数。 :/
原因是Google选择根本不计算折扣计数。当为数百万个网站免费提供服务时,这种方法在经济上根本不可行。 他们需要一种方法来避免计算不同的方法。不同计数涉及对数据交叉点中每个单元格进行排序、分组id列表的操作。
但是... 计算ga:pagePath值上的不同会话数量不是很简单吗? 我稍后会回答这个问题。
用户和数据分区 他们的选择是将数据分区到用户(clientIds或userIds)上。 因为当他们知道clientId/userId X仅存在于BT的某个表中时,他们可以运行一个映射/归约函数来计算用户数量,而不必担心同一用户出现在另一个数据集中,并被迫存储所有clientIds/userIds在一个列表中-对它们进行分组-然后对它们进行计数-不同。 由于当前的GA跟踪脚本名为Universal Analytics,因此他们必须能够正确地计算用户。特别是在关注跨设备跟踪时。
好的,但这会影响会话计数吗? 您有一组用户,每个用户都有多组会话,每个会话都有一个页面点击列表。 在特定会话内计数时寻找页面路径,您将多次找到相同的页面,但您不会重复计算该页面。 你需要写下你之前已经看过这个页面了。 当您遍历该会话中的所有页面时,您只需要对每个页面计算一次会话。此过程需要状态/记忆。由于计数过程可能在同一服务器上并行处理。您无法确定特定会话是否由同一进程处理。这使得计数更加占用内存。 Google决定不再追逐那只兔子,而是忽略会话计数对页面路径和其他命中范围维度的影响。
“立方体”存储 我写“立方体”的原因是我不确定它们是否使用传统的OLAP立方体结构,但我知道他们填充了多达100个立方体,用于回答不同的维度/指标组合。

通过将维度隔离/分组到较小的立方体中,数据不会像将所有数据放入单个立方体中一样呈指数级爆炸增长。 缺点是并非所有数据组合都被允许。这一点我们知道是真实的。 例如,ga:transactionId和ga:eventCategory不能同时查询。

选择这种结构可以使数据集在经济和性能方面具有良好的可扩展性。


1

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接