转载自Lamborryan,作者:Ruan Chengfeng 本文链接地址:http://www.lamborryan.com/xiaomei-data-architecture
小美项目即将结束, 所以有必要抽时间来总结下在小美项目上的得失。
很庆幸在小美项目的7-8个月里, 全程参与了小美大数据平台从无到有的过程, 更加难得的是作为主要的后端开发人员参与了数据平台的架构变迁。中间踩坑的经验是很宝贵的, 所以就有了本文了。
虽然我们团队一直没超过4个人, 但是我们是个很好的团队, 很幸运能遇到他们。
虽然最后数据平台还很不完善, 但是它也经历了3个阶段:
在第一阶段, 数据的需求突然大量增加, 各部门需要大量的数据报表。 需求的增加与项目初期开发人员短缺, 技术积累不够形成了较大矛盾。
考虑到需要快速上手以及快速满足需求, 我们选了Pandas框架来进行数据仓库建模和数据分析, 使用Flask来实现后台数据交互. 同时由于对业务的理解不够深入, 以及产品设计上的不完善, 使得数据仓库的维度模型比较混乱, 维度表与事实表比较模糊。这样造成的结果就是每一个需求都是定制的, 每个开发人员疲于奔命, 数据分析变成了存体力活, 效率底下。
在第1阶段中期, 我们开始慢慢开发我们自己的基于Pandas的XiaoMei ETL-Engineer和XiaoMei Query Engineer来抽象并快速提升开发效率。它们基于jinjia2模板引擎可通过配置文件快速部署开发。在此阶段的任务调度完全就是基于Crontab 的顺序调度.
由于此时的业务系统数据库是在Mysql和Mongo上, 在ETL过程中要同时摄取上述两个源. 而Mongo的Nosql特性使得业务系统的同事经常变动里面的字段, 给我们的数据统计造成较大的麻烦。
在第1阶段后期, 通过Pandas的ETL Engineer和Query Engineer, 我们基本上已经能满足日常的数据需求和报表需求。但是我们组在报表等临时需求上投入了过多精力, 大大降低平台搭建速度. 此时的建完模型的数据是存在MySql上的, 但是公司内部会SQL的运营基本没有, 因此我们调研了tableau, 并给需求方进行培训, 让他们通过tableau来满足他们自己的需求, 而我们只需要维护好数据仓库和数据平台即可。
此时的基本框架如下:
该框架已经能基本满足初创团队对于数据统计分析的需求, 它维护成本低,只需部署在单台节点上,操作简单。
随着业务增加, 更多的数据接入, 数据量得到了较大的增加. 实时统计的数据需求也开始产生。这时第一阶段的数据框架已经不满足现在的业务需求了。为了之后更好的扩展性, 本阶段将开始上线大数据平台的部分框架来代替ETL功能, 同时优化数据仓库的维度模型。
第2阶段的数据平台框架图:
在这一阶段中我们有两条主线, 实时计算和离线计算:
在离线计算中我们使用Hadoop平台来实现数据的存储以及通过Hive来实现ETL和维度建模.
由于业务系统变更较快,因此业务数据库的数据模型也经常变动, 常常上一个版本有这个字段, 这个版本该字段需要从别的地方获取了。 如果是第1阶段的那个模式, 就会使的我们越弄越混乱。在这阶段我通过Hive来屏蔽这种业务变更对上乘应用分析的影响。
CREATE TABLE deal_current AS SELECT x FROM deal_v_1.0 UNION SELECT O AS X FROM deal_v_1.1
每次业务版本变更, 我只需将deal_current转换成相应的版本就行。对上乘的维度模型影响较小。
在实时计算中我们采用Kafka, Spark Streaming 和 hbase的经典框架来实现。目前阶段的实时业务较简单, 无非就是pv, uv的计算以及一些页面留存等需求。Spark的入门还是有点难度的。
hbase的设计我们也下了不少的心思, 以统计某页面的pv,uv为例,
UV/PV of events => count/sum(pv) of hbase rows prefix by {action}@U
UV/PV of events on specified date => count/sum(pv) of hbase rows prefix by {action}@D{date}@U
UV/PV of events with specified param => count/sum(pv) of hbase rows prefix by {action}@P{param}@U
UV/PV of events with specified param on specified date => count/sum(pv) of hbase rows prefix by {action}@P{param}@D{date}@U
在Query Engineer我们采用python的happy-hbase对数据进行进一步的处理。
业务量和需求的增长带来的另一个问题就是job数量增加, job之间的依赖并不能再简单的使用crontab了。这个时候我们调研了Oozie和Azkaban, 相比于Oozie的笨重, 我们最后选择了Azkaban来做为我们的工作流调度引擎。
关于Oozie的调研情况, 请查看我的博客:
在该阶段我们已经建立初步的维度模型, 以商品订单为例:
该阶段是单机向大数据平台的过渡模型, 我们在这个阶段持续了不少时间, 因为需要调研的东西实在不少。
第3阶段是完整的大数据平台了, 我们需要在第2阶段的基础上要进行以下的优化:
框架示意图如下:
最后选取的OLAP方案是通过ElasticSearch自带的丰富的DSL来实现, 因此在DSL的基础上我们开发了ElasticSearch的中间件来负责与ArgonathUI通信。我们可以通过Spark-Streaming实时 为ElasticSearch建立索引, 也可以通过ElasticSearch-Hadoop快速的进行索引重建. 关于Hive如何实现ElasticSearch的索引重建可以查看《Hive数据仓库(10)之Hive与Elasticsearch的结合》.
Plumber的原理示意图如下所示:
Plumber即将开源, 敬请期待。
关于ArgonathUI请看github《ArgonathUI》
Gobblin和Binlog的引入主要是为了完善对各种数据源数据的摄入以及优化ETL过程.
关于Gobblin的相关请看我的博客《Gobblin系列分析汇总》
第3阶段的大数据架构在ETL和数据统计分析上已经开始完善, 同时加入了数据可视化使得用户体验更好。
但是, 第3阶段的数据平台依然是很初级的阶段, 依然处在数据积累阶段上即存储层。 还没达到数据使用以及数据挖掘阶段(业务层和应用层),项目就关闭了。
因此关于后续可以继续完善的地方, 我觉得还有以下方向:
回观这半年, 我们4个数据菜鸟, 毫无经验, 一路磕磕碰碰走来实为不易, 感谢博士, 感谢凯哥, 感谢大同。
数据平台建设的道路, 任重而道远。
本文完