java - HBase 表设计用于维护每个来源的每小时访客数量

标签 java hbase apache-storm

我正在开发一个项目,我必须报告每个来源每小时的独立访问者数量。也就是说,我必须计算每个来源每小时的唯一访问者。访客通过唯一的 ID 进行识别。考虑到数据约为每 8 小时 20k 个条目,应该如何设计才能有效地计算每小时的独立访问者。

目前我使用的是sourceid+ guestid 作为行键。

最佳答案

首先我们要说的是,每小时 2500k 条目的数据量相当低(甚至不到 1/秒)。除非您想大规模扩展,否则您的项目可以使用单个 SQL 服务器轻松实现。

无论如何,你有两个选择:

1。非实时

记录每个访问者ID+源并运行作业(如mapreduce)以每小时或每天分析数据,具体取决于您的需要。在这种情况下,您甚至可以完全避免使用 hbase,而只使用 hadoop。您可以每小时将数据记录到不同的文件中,然后对其进行处理并将结果存储在 SQL 中(如果您愿意,也可以存储在 HBase 中)。就性能而言,这将是最好的方法。

2。实时

通过使用 HBase 计数器实时跟踪数据,在这种情况下我会考虑使用 2 个表:

  • unique_users:跟踪访问者 ID 上次访问网站的时间(行键将为访问者 ID + 源或只是访问者 ID,具体取决于访问者 ID 是否可以有不同的来源或只是一)。如果您想尽快自动丢弃旧数据,则该表的 TTL 可以为 3600 秒,但我会保留几天的数据。

  • date_source_stats:跟踪每个来源每小时的唯一访客 ID。该表的 TTL 可以为几周甚至几年,具体取决于您的保留要求。

当访问者进入您的网站时,您会读取 unique_users 表来检查上次访问日期,如果该日期早于 1 小时,则将其视为新访问,并增加日期+小时的计数器date_source_stats 表中的 +sourceid 组合。然后,更新unique_users,将上次访问时间设置为当前时间。

这样,您就可以通过扫描轻松检索特定日期+小时的所有唯一访问并获取所有来源。如果您想要对特定源执行查询,您还可以考虑使用 source_date_stats 表,即 X 源过去 7 天的每小时报告...(您甚至可以将所有统计信息存储在使用不同的 rowkey 的同一个表)。

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.

关于java - HBase 表设计用于维护每个来源的每小时访客数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29318427/

相关文章:

奇怪的Java应用程序绘图

java - 在两个设备之间同步RecyclerView数据?

java - 如何在 Android 上使用 Wobly 序列化器

selenium - 如何在 Storm Crawler 中使用 Selenium 插件

java - 如何在 Apache Storm Trident 中确定事务是否成功提交

java - 使用 excerptProjection 时 @JsonBackreference 被忽略

hadoop - 如何让 hbase 区域服务器监听 0.0.0.0?

java - 如何使用java api像jdbc一样直接发送hbase shell命令?

eclipse - 无法从 windows eclipse 创建 Hbase 表

java - Apache Storm : Could not load main class org. apache.storm.starter.ExclamationTopology