现在要做一个统计 app 端的不同维度的数 (赞,评论,点击,浏览等。。。),设计了三张表 hour_table, day_table, sum_table,对每篇文章 - 每小时,每天 -,以及总量都进行了统计,安卓在调用我这边的 api 的时候,吐给我一大串儿 json 格式的数据,我该去怎么处理执行?比如:先存 hour_table,再存 day_table,最后存 sum_table,以上操作该怎么去定义个异步任务执行呢 (没用过异步任务)?或者先存库后计算比较好,还是先计算后存库比较好?这里边儿还会涉及到一个问题是,- 今天吐的数据可能是之前的数据? -这种情况该怎么处理 (吐给我的数据有个文章 Id 和维度数) 第一次做统计平台,望大神指点思路和方法?
其实统计分析相关的工具非常多:
但最重要的是把业务边界搞清楚:
1.是否 Append Only 类型,就是说数据插入之后是否会变化,比如订单表创建之后状态会变、total 会变(有退款和取消业务),而日志分析和运维数据统计之类业务只是简单的 Append,相对来说简单,选择性就大一些,InfluxDB、Pipelinedb、statsd 什么的一堆
2.如果是有 Real Time 需求的话,选择性就又小了一些,Hive、Elasticsearch 什么的就要排除了,当然也看数据量。
3.如果有缓慢变化维度需求,就是一个数据仓库业务了。可能下面链接你会需要:
4.是否需要 ad hoc 查询,如果需要,像使用 Redis 预聚合这种方案就得排除了 5.是否使用 SQL,基于 SQL 语言有天生的优势,像 Elasticsearch 这种自己造一个难用的 DSL 真是害人啊 6.这点应该和 4 是一起的。是否需要 JOIN,不基于 SQL 的工具其实大部分也不支持 JOIN,但对业务复杂的情况没有 JOIN 并且需要 Ad Hoc Query 就会死的很惨。
可能对 Real Time 的理解不一样吧,比如 GA 就不算是 Real Time 类型的应用,因为虽然查询结果是实时出来的,但结果和插入的 event 之间有延迟,并不能马上看到真实的数据结果。而 GA 的 real-time report 那部分算是真的 Real Time,因为你访问就可以在 real time report 里看到在线人数的增减。
Hive,没有行级的插入删除更新操作,只能 batch insert。理论上,基于 hadoop 的都不适合做 real-time 分析,hadoop 其实是做 offline, batch processing 的……
Elasticsearch 查询速度确实很快,但插入速度是硬伤。
这有一篇 Metabase 写的 Data Warehouse 选型的文章,优缺点分析的非常详细:「Which data warehouse should you use?」
按题主描述,默认都是数据 Append-Only
第 1 个要考虑的问题是需要不需要原始数据,如果只存结果的话,一个表处理下就好啦,如果需要保存原始数据再看下一个。 第 2 个要考虑的问题是数据量,数据量千万级以内直接 Mysql 就行,查询要求比较高的时候离线处理可以再战一段时间,如果数据超过千万级时候,再看下一个。 第 3 个要考虑的就是大数据的方案了,一种是时序数据库(InfluxDB,OpentsDB),第二种是 OLAP(Kylin,Mondrian,Druid)。时序数据库解决这种问题更优雅一些,一般大家的运维经验普遍有限,不太敢用于生产,一般都只用于数据不太重要的监控系统。OLAP 是比较主流的方案,你提到的场景是维度转换中的一种,查询维度可以自由转换(时间的年月日时分秒,省份的省市县等等)。