HBase Table 用于维护每个来源的每小时访问者计数的设计
HBase Table Design for maintaining hourly visitors count per source
我正在做一个项目,我必须报告每个来源的每小时唯一身份访问者。也就是说,我必须计算每个来源每小时的唯一身份访问者。访问者由唯一 ID 标识。考虑到数据是每 8 小时大约 20k 个条目,应该如何设计才能有效地计算每小时唯一身份访问者。
目前我使用的是sourceid+
visitorid 作为行键。
首先让我们说每小时 2500k 个条目是一个非常低的数据量(甚至不到 1 个/秒)。除非您想大规模扩展,否则您的项目可以使用单个 SQL 服务器轻松实现。
无论如何,你有 2 个选择:
1。非实时
记录每个 visitorid+source 和 运行 一个作业(如 mapreduce)以每小时或每天分析一次数据,具体取决于您的需要。在这种情况下,您甚至可以完全避免使用 hbase,而只使用 hadoop。您可以每小时将数据记录到不同的文件中,然后对其进行处理并将结果存储在 SQL 中(如果您愿意,也可以存储在 HBase 中)。就性能而言,这将是最好的方法。
2。实时
通过使用 HBase 计数器实时跟踪数据,在这种情况下我会考虑使用 2 tables:
Table unique_users:跟踪 visitorid 上次访问该站点的时间(rowkey 为 visitorid+source 或只是 visitorid,取决于访问者 id 是否可以有不同的来源或只有一个)。如果您想尽快自动丢弃旧数据,这个 table 可以有 3600 秒的 TTL,但我会让几天的数据。
Table date_source_stats:跟踪每个来源每小时的唯一访客 ID。此 table 的 TTL 可能为数周甚至数年,具体取决于您的保留要求。
当访问者进入您的网站时,您会阅读 unique_users table 以检查最后访问日期,如果该日期早于 1 小时,请考虑它是一次新访问,并增加 date_source_stats table 中日期+小时+sourceid 组合的计数器。然后,更新unique_users,将上次访问时间设置为当前时间。
这样,您可以通过扫描轻松检索特定日期和时间的所有唯一身份访问并获取所有来源。您还可以考虑使用 source_date_stats table 以防您要针对特定来源执行查询,即 X 来源最近 7 天的每小时报告。 ..(您甚至可以使用不同的行键将所有统计信息存储在同一个 table 中)。
Please notice a few things about this approach:
- I've not being too detailed about the schemas, let me know if you need me to.
- I would also store total visits in another counter (which would be incremented always regardless of if it's unique or not), it's an
useful value.
- This proposal can be easily extended as much as you want to also track daily, weekly, and even monthly unique visitors, you'll just
need more counters and rowkeys: date+sourceid, month+sourceid... In this case you can have multiple column families with distinct TTL properties to adjust the retention policy of each set.
- This proposal could face hotspotting issues due rowkeys being sequential if you have thousands of reqs per second, you can read more
about it here.
- An alternative approach for date_source_stats could be to opt for a wide design in which you have just a sourceid as rowkey and the date_hour as columns.
我正在做一个项目,我必须报告每个来源的每小时唯一身份访问者。也就是说,我必须计算每个来源每小时的唯一身份访问者。访问者由唯一 ID 标识。考虑到数据是每 8 小时大约 20k 个条目,应该如何设计才能有效地计算每小时唯一身份访问者。
目前我使用的是sourceid+ visitorid 作为行键。
首先让我们说每小时 2500k 个条目是一个非常低的数据量(甚至不到 1 个/秒)。除非您想大规模扩展,否则您的项目可以使用单个 SQL 服务器轻松实现。
无论如何,你有 2 个选择:
1。非实时
记录每个 visitorid+source 和 运行 一个作业(如 mapreduce)以每小时或每天分析一次数据,具体取决于您的需要。在这种情况下,您甚至可以完全避免使用 hbase,而只使用 hadoop。您可以每小时将数据记录到不同的文件中,然后对其进行处理并将结果存储在 SQL 中(如果您愿意,也可以存储在 HBase 中)。就性能而言,这将是最好的方法。
2。实时
通过使用 HBase 计数器实时跟踪数据,在这种情况下我会考虑使用 2 tables:
Table unique_users:跟踪 visitorid 上次访问该站点的时间(rowkey 为 visitorid+source 或只是 visitorid,取决于访问者 id 是否可以有不同的来源或只有一个)。如果您想尽快自动丢弃旧数据,这个 table 可以有 3600 秒的 TTL,但我会让几天的数据。
Table date_source_stats:跟踪每个来源每小时的唯一访客 ID。此 table 的 TTL 可能为数周甚至数年,具体取决于您的保留要求。
当访问者进入您的网站时,您会阅读 unique_users table 以检查最后访问日期,如果该日期早于 1 小时,请考虑它是一次新访问,并增加 date_source_stats table 中日期+小时+sourceid 组合的计数器。然后,更新unique_users,将上次访问时间设置为当前时间。
这样,您可以通过扫描轻松检索特定日期和时间的所有唯一身份访问并获取所有来源。您还可以考虑使用 source_date_stats table 以防您要针对特定来源执行查询,即 X 来源最近 7 天的每小时报告。 ..(您甚至可以使用不同的行键将所有统计信息存储在同一个 table 中)。
Please notice a few things about this approach:
- I've not being too detailed about the schemas, let me know if you need me to.
- I would also store total visits in another counter (which would be incremented always regardless of if it's unique or not), it's an useful value.
- This proposal can be easily extended as much as you want to also track daily, weekly, and even monthly unique visitors, you'll just need more counters and rowkeys: date+sourceid, month+sourceid... In this case you can have multiple column families with distinct TTL properties to adjust the retention policy of each set.
- This proposal could face hotspotting issues due rowkeys being sequential if you have thousands of reqs per second, you can read more about it here.
- An alternative approach for date_source_stats could be to opt for a wide design in which you have just a sourceid as rowkey and the date_hour as columns.