Happy Coding
记一次数据项目经历

分享下 4月、5月(特别是5月,5/1假期后基本上全身心投入)在忙的这个数据项目经历,工作面覆盖陪同拜访客户、开会、需求分析、提供方案、数据清洗、数据分析、数据基础设施的搭建开发、帮甲方IT调试代码等环节,累到头秃。

(本文刻意隐去客户信息。)

需求背景

客户需求是做一个聚合小程序(此处脑补下麦当劳的微信小程序「i麦当劳」),用于广告投放,比如微信系APP的弹屏广告。应用本身不复杂,只是罗列客户其他小程序、H5应用和一些广告链接,让用户选择。

投放效果需要数据量化,我们做了前后端的数据埋点,尽可能收集用户的行为记录。

客户花钱投广告,是为了企业销售额等指标的提升。我们也对接了客户的订单数据,多方数据进行交叉分析。

数据量化的结果,也就是数据报告,以日报、周报、月报的形式体现。

技术细节

下文就以数据的生命周期来讲,数据是怎么从毛料,到精修,最后到报表的。

数据采集

工作重点:

  1. 定义数据对接规范,或是理解别人的规范。
  2. 与自家开发做好数据对接。把握数据质量。
  3. 与甲方开发做好数据对接。把握数据质量。(为了加快数据对接速度,又是写示例代码、又是帮他们定位中文编码问题。体验真是酸爽。还是自家小伙伴靠谱。)
  4. 数据质量很重要。数据质量决定了后续工作是否需要反复。

1. 前端应用埋点

用于收集聚合小程序的用户行为记录。

整体架构还是沿用几年前的,唯一变化的就是埋点的规范,因为需求的不同而变化。基本上如下逻辑:

  1. 前端应用开发主动在代码中加入用户行为埋点。
  2. 埋点 SDK 异步地将数据上传到服务器。多台服务器通过 DNS 解析来负载均衡。
  3. WEB 服务器使用的是 openresty,有一些 lua 脚本,用于处理 cookie,和格式化存储行为日志。
  4. 之后数据通过Filebeat、Kafka、StreamSets等软件分发到Hadoop集群、实时处理任务。

image-20200512145610312

2. SFTP 文件同步

用于接收甲方的订单数据(二期、三期项目还有其他类型数据)。

根据双方约定时间收取文件,将文件存入Hadoop集群。

3. 微信公众号授权

客户授权后,我们获取到了公众号的粉丝关注记录(由后端开发请求微信服务器取到数据并写入Kafka集群)。同样,也存放到了Hadoop集群。

ETL 与 数据仓库

工作重点:

  1. 承上启下的工作。以方便数据分析为出发点,反过来检验数据质量。
  2. 字符串类型的时间转为时间戳类型。BI 工具需要。
  3. 基于数据金字塔模型、维度分析模型建模。
  4. 数据仓库未来可以考虑 ClickHouse。Hadoop体系数据粒度是文件,更新历史数据中的某条记录,得更新所在的整个文件!

1. ETL

经过数据采集阶段,毛料数据以文件形式存储于Hadoop集群。本阶段主要将毛料数据抽取成表(实际还是文件存储)。

技术上使用 Hive/Spark 框架写SQL。Hive SQL实在太慢了,所以一般使用Spark做清洗,Hive更多地是用其metastore组件,维护表结构信息。

因为Spark(SQL)脚本得用Python写。抽象了一个清洗脚本模板,填空:

  1. 可选填清洗前执行的SQL。比如建表DDL。
  2. 可选填毛料数据的解析schema。(直接依靠框架采样推理出schema,与实际schema比,可能缺字段,程序会崩。schema也没必要手写。一个技巧就是准备一条最全的数据记录,让Spark推理,把schema存下来使用。)
  3. 填核心的清洗逻辑。

2. 数据仓库

数据是有层次结构的。以用户行为记录为例:

  1. 采集到的是毛料数据。很多时候,为了埋点规范能够动态扩展,字段都定义在一个有嵌套JSON结构的字段里。
  2. 清洗成明细数据。一般是一张扁平表,能够描述用户在某上下文(时间、手机型号、IP地址)中点了某按钮。
  3. 基于明细数据生成汇总数据。明细数据中维度很多,是以用户维度、用户会话维度汇总?还是以按钮、手机型号汇总?
  4. 汇总是有不同程度的,比如按程度从低到高,按日、按月、按年。

如果把占数据量绝大部分的毛料数据放在底部,占少部分的汇总数据放在上方,数据的层次结构可以想象成金字塔。所以也有数据金字塔模型一说。

数据仓库的材料网上很多,比如维度分析模型,就不展开了。

OLAP 数据库 与 BI 工具

工作重点:

  1. 为数据分析准备工作平台。
  2. 保证 OLAP 数据库高效稳定。
  3. 选择合适的BI工具,用户体验很重要。

image-20200512153140285

1. SQL on Hadoop

因为数据仓库是基于Hadoop/Hive的。在这个体系下的,分析型数据库选择就不多了。

  1. 使用的CDH版本Hadoop,自带Impala。
  2. Hive。这个太慢了,无法适用BI场景。
  3. SparkSQL。需要独立安装。

最合适的就是Impala,查询速度快,天然由CDH Manager工具管理监控。而且每个impalad都是天然的proxy,任务会分发给其他节点,并行完成。

一开始还没有为 Metabase 开发 Impala 的数据库驱动。有单独部署一个 SparkSQL Thrift Server。随着数据量上升,太容易因为 OOM 崩了。

2. Metabase

去年 10月工作内容调整,重新着手数据相关的工作。当时,时不时有一个H5营销应用的网页分析报表下载需求。为了减少人工操作,开始调研开源的 BI 工具。

  1. superset 名气挺大的,但是各种不方便。没法做 JOIN!写SQL没法直接做可视化!界面老土(用flask-appbuilder生成的UI模板)!
  2. Metabase。连本地MySQL做数据分析,体验没有硬伤,还有很多惊喜。对比下,技术选型还是选择了 Metabase。

Metabase的优点:

  1. 开源。
  2. 简单干净的界面,良好的文档,没遇到过大bug。 https://www.metabase.com/docs/latest/users-guide/start.html
  3. X-Ray 功能。自动生成一张表的常见统计指标。惊喜的功能!我一度还在花时间写类似的工具,用于大数据上的数据探索。因为收益太低放弃了。
  4. 比较常用的可视化技术。 https://www.metabase.com/docs/latest/users-guide/05-visualizing-results.html
  5. RBAC。权限控制。权限的粒度,数据库、表、分析文件夹。通过创建权限组,将一类用户集中管理。用途,某某项目组下的用户只能看到Dashboard,不能进行SQL操作,
  6. Filters。Dashboard/Question 中可指定SQL参数,可设置默认值。用途,筛选时间段、筛选活动ID,不需要重复创建Dashboard。一个Dashboard建议不要太多 filter (更多filter,感觉Kibana+Elasticsearch的组合更合适)。详见 https://www.metabase.com/docs/latest/users-guide/08-dashboard-filters.html
  7. 数据导出。Dashboard没法直接下载Question中的数据,需要点击进入各个Question下载。
  8. BI工具,是真正贯彻了组件化思维。可视化都是选项,通过点击就能制作一个图表。平台不再是写死的,而是动态变化的。数据分析、数据工程、前后端开发,充分解耦。目前我们平台的问题就是数据分析和前后端开发是耦合在一起的,迭代会很慢。

美中不足,没有开箱即用的 Impala 驱动。花了些时间研究,写了个 Impala 驱动,已经在生产使用了。参考 https://xujiahua.github.io/posts/20200527-metabase-impala-driver/

数据分析

工作重点:

  1. 理解客户需求,以客户需求为中心做数据分析。
  2. 写 SQL。维度分析和对比分析。

客户需求

客户需求,是运营在跟。而我是一个没有灵魂的SQL写手。渐渐因为只是写这些繁杂的SQL,觉得非常无聊。目前还深受折磨。

以客户需求为中心做数据分析。这是我跟运营学到的一课。虽然数据分析有套路,但是维度那么多、对比那么多,毫无目的地发散空耗自身精力。

隐藏的维度信息

比如行为记录埋点,只有一个按钮名称。这个按钮的真正去向是什么页面、什么时候创建的,需要向开发收集。

比如订单中,只有一个门店名称。这个门店所在的城市、分公司隶属关系这些信息需要收集,扩充门店的维度信息。

总结

以上为近2月项目的浓缩总结。人力有限,每个环节都做得比较粗放。

但总体有条不紊,幸亏洪敏和我前期的积累。


Last modified on 2020-05-29