开源项目 基于 Mongoid/ActiveRecord 的 statlysis 统计分析引擎

mvj3 · 2013年12月29日 · 最后由 wppurking 回复于 2013年12月31日 · 5798 次阅读

对《statlysis 统计分析引擎 线下培训策划》感兴趣的 请移步 http://ruby-china.org/topics/16643


项目地址在 https://github.com/mvj3/statlysis

统计分析在线演示,拿 showterm 录制的, http://mvj3.github.io/statlysis/showterm.html


两个已经部署在生产环境的使用案例:

  • eoe.cn 各子网站的页面访问统计,和包含多个条件的数据库表每日数据统计,详情见 示例配置文件 ,按日期维度分。
  • 阳光书屋的学习提高班的关于做题情况的统计分析,详情见 示例配置文件 ,按班级维度分。

@mvj3 顶 顶完再学习一下

@mvj3 的确, 业务部门会有各种各样的数据需要统计, 计算. 我这边主要是通过 Ruby 脚本将数据周期性 (我们对实时性要求不高) 导入 ElasticSearch, 然后根据 ES 提供的 Aggregation 的相关功能去进行分析处理.

对进入 ES 的 document 是需要根据业务进行整理的, 也就是你所提到的 "解析引擎" 部分, 我这边设计好相关业务所需要的信息组织成为一个 document, 然后挨个压入 ES 中.

看完你的 Blog 后感觉, 对不同的统计功能, 现在最难的不是存储与数据提取, 因为现在有 Mongodb, ElasticSearch 这些针对较大数据量设计的项目, 并且都有良好的集群支持, 难的是如何设计好用于处理这些数据的 document 以及你的库所提供的 DSL 查询.

我选择 ES 的考虑是, 他提供的 Restful 接口好好用, 哈哈.

#2 楼 @wppurking

ElasticSearch 确实很强大,它提供的 facets,让我想起以前用 Sphinx 里面提到的 facets,只是没想到可以这样活用!你的分析很对,良好的 DSL 查询是必杀技。

我说一下 ElasticSearch 对于写 Ruby 的我和 statlysis 来说的三点不足吧,可能有失偏颇:)

  • 语言层面。相对于 Java 社区项目,我更偏向 Ruby, JavaScript, C/C++ 等社区的项目,毕竟 Java 社区自成一个体系,想进去能使用上大部分工具门槛比较高,于是我就放弃 Hadoop 了,不过理念可以借鉴。我会采用的解决方案是 MySQL,MongoDB,Redis,PostgreSQL,Sphinx 等。
  • 只能通过 HTTP 沟通。几乎所有统计需求都要一一在 ElasticSearch 重新生成一份,而 statlysis 可以很好的复用现成 Model 的,简单来说,更接近 ORM 操作。包括在展现数据时的条件查询和遍历。
  • DSL 集成。statlysis 是可以直接通过 DSL 查询配置语句的,只需要一行非常接近业务的代码即可。而 ElasticSearch 拆成不同的类,得自己去组织 ETL 和统计分析。

个人觉得 ElasticSearch 最大的好处是它是独立的应用程序和解决方案,在稳定性上很好。而 statlysis 的目标就是面向用 Ruby on Rails 开发的中小型网站,当然 MongoDB 能 Hold 住的数据量,它也能 Hold 住,我目前的经验是十亿级别。

#3 楼 @mvj3 问个问题,项目数据库是 mysql,以前用的是 sphinx,但是新项目准备上全文搜索,数据暂时不会很大, 你觉得有必要用 ElasticSearch 吗?

#4 楼 @small_fish__

你能用 MySQL 可以 Handler 的数据量,Sphinx 一定可以,而且它也是分布式的,见 用 sphinx 轻松搞定方便管理的多节点过亿级数据搜索

如果要用 ElasticSearch 的还是问 @wppurking 这些有经验的人吧:)

#5 楼 @mvj3 有木有觉得比较吃内存?而且索引的 sql 有些比较糟糕,或许自己用法没对。。

#6 楼 @small_fish__

Sphinx 是个独立的程序,它本身没有问题。但是提供给 Sphinx 数据源时可能要注意 MySQL 查询的索引了,或者你发个贴和大家一起讨论下吧:)

@small_fish__ 其实我比较好奇为什么如果有 Sphinx 经验, 是什么理由促使你想使用 ElasticSearch ... 因为在全文搜索上 ElasticSearch 并不占 Sphinx 啥便宜, Sphinx 的搜索速度还是比 ES 快的, 同时他们都有对应的分布式解决方案.

@mvj3 如你所说, 我是当 ElasticSearch 为一个独立的服务或者应用在使用他, 所以在已有的系统与其交互的时候, 也是脱离现有的 Model 去设计存入 ES 中的 document 的, 要这样思考解决问题, 也是因为历史项目问题 - -|| 一个是历史的 Java 项目, 一个是新上的 Rails 项目, Rails 项目要用 Java 项目中的数据, 为了分析数据的性能也为了独立开两个项目的联系, 所以就通过 ES 作为中间数据的转换中心, 用 Ruby 脚本处理 Java 项目 DB 中的数据, 然后再通过 ES 的 Query DSL 想外提供服务.

十亿级别已经很大了啦~ 然后我们是解决分析问题使用的两种思路, 一种是重用现有 Model, 一种是独立设计业务相关 document , 最终都把问题解决了 😄

#8 楼 @wppurking 嗯,能顺利解决问题的技术都是好技术。

混合语言是好事情,Ruby 这种脚本语言做数据处理肯定比 Java 方便多了。不过直接用 ElasticSearch 的 API 提供对外服务感觉像是把 MySQL 直接暴露在外网一样。。。不知道是否做了一层包装,还是我理解错了?

对于数据源来说,statlysis 其实是包括了"复用现有 Model"和"独立设计业务相关 document"两种 ETL 方案的,这个可以见 README 的两个案例,ETL::LessonLog 和 ETL::ProblemLog 两个 Mongoid Model 就是类似于你这里的"独立设计业务相关 document"。

我觉得 statlysis 采用 数据库 ORM,和 ElasticSearch 采用 Restful HTTP ,才是两种方案在 ETL 上的最大区别。

。。。本来是想和大家讨论 statlysis 的,意想不到的是抛砖引玉出了与其他成熟方案的对比,很有收获:)

@mvj3 哈哈~ 我歪楼了. 暴露的服务使用 iptables 做了 ip 与端口的白名单 嘿嘿

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册