我的名字是詹姆斯·罗文,我是一名在麻省理工学院学习数学的初中生。 我暑假在 edX 的分析团队实习,专注于 数据管道. 分析团队提供数据和指标供 edX 的课程团队、研究人员和内部团队使用。 我今年夏天的工作主要集中在改进我们的数据仓库,这是一个用于为营销和执行团队生成内部报告的 HP Vertica 数据库。
扩展数据仓库
我的第一个项目 是将有关课程主题领域的信息添加到数据仓库中。 虽然最初的仓库模式允许分析师逐个课程查询注册和活动指标,但无法按学科领域汇总和比较课程。 例如,在仓库中拥有课程学科领域信息将允许营销团队查看哪些学科领域具有最高的认证证书获取率,而其他分析师将能够按学科领域询问参与模式(数学课程是否倾向于查看许多学习者尝试解决问题,而人文课程则更多地使用讨论论坛?)。
要执行此任务,我首先需要了解 路易吉,开放式 edX 管道使用的数据处理框架。 Luigi 是 Spotify 开发的一个开源 Python 数据处理框架,它将数据处理工作流分解为一系列任务,每个任务都有自己的输出,从而简化了依赖关系处理,并且可以在中间步骤失败后重新启动工作流。 Luigi 的这一特性使我们瞄准尽可能模块化的工作流程。
课程主题领域工作流程包含三个部分:
- 调用 课程目录 API,其中包含网站上销售的所有课程的列表,以及主题、讲师和长度等信息。
- 将 api 的输出解析为制表符分隔的值文件,每行包含一个课程 ID、课程的主题区域和一些附加信息。
- 将此主题领域数据加载到 Vertica 数据库中。
我在上面确定的这个过程的三个不同阶段自然地转化为 Luigi 任务,前两个阶段写起来相当简单。 第三个更有趣。 虽然 Luigi 有用于加载到 MySQL 数据库的预构建任务,但没有预构建的 Vertica 加载任务,所以我首先必须构建一个通用的 Vertica 批量加载 Luigi 任务。 这个通用散装装载机在整个夏天被其他团队成员使用,我很高兴拥有这部分管道,它将为未来的工作流程提供基础设施,以进一步扩展我们的内部分析仓库。
下图显示了分析师现在可以通过该项目回答的问题示例。 它显示了在 edx.org 上的课程中活跃的学习者在特定学科领域的课程中活跃的百分比。 2014 年秋季,大约 2015% 的积极学习者积极学习计算机科学、商业、数据分析和人文学科的课程。 然而,在 2015 年,在 edx.org 课程中的活跃学习者中有很大一部分在计算机科学课程中进行了活动。 XNUMX 年 XNUMX 月,edx.org 上几乎一半的活跃学习者都活跃在计算机科学课程中! 显示的其他三个主题领域在活跃用户中的受欢迎程度也有所提高,每个领域都上升到 XNUMX%。

在主题领域项目之后,我致力于产品分析的实验功能。 所有用户与平台的交互,从播放视频到尝试问题再到编辑用户资料,都会被记录下来以供分析。 如果添加了新功能并开始发出事件,产品团队可能想知道它的使用频率,或者它是否在桌面浏览器上看到不成比例的高使用率(表明移动兼容性存在问题)。 不必等待分析团队建立一个管道工作流来聚合有关新功能的跟踪日志信息,产品和其他团队应该能够自己对事件日志进行初步分析。
直接查询事件日志的困难在于事件日志是半结构化的,以 JSON 格式存储。 由于不同类型的事件具有不同的属性,因此尝试为事件创建单个表模式会很笨拙; 相反,我利用 Vertica 的弹性表 并为所有或几乎所有事件共有的字段(如用户名、时间戳和用户设备类型)选择了具有具体化列(一级 SQL 表列)的表模式,同时仍允许用户查询特定于事件的字段(例如某人正在导航到的视频中的时间戳)。 虽然我们不确定这是否会成为我们未来的产品分析框架,但它确实帮助我们探索了仓库的能力。
将 BI 数据处理集成到管道中
今年夏天我开始在 edX 工作时,我们基本上有两个独立的管道:一个用于 Insights 中使用的面向教师的数据(打开 edX 的分析仪表板) 另一个用于我们自己的内部商业智能 (BI) 报告。 面向外部数据的管道是用 Luigi 编写的,并具有批处理 Hadoop 作业以填充结果存储 数据接口,而内部报告的管道使用 Pentaho 数据集成从 LMS 和结果存储中提取数据,对其进行转换,然后将其加载到仓库中。 BI 管道依赖于主管道的一些结果,但无法将这些依赖项传达给它,这迫使团队仔细安排在我们的 Jenkins 构建服务器上执行任务的时间,并首先违背了使用 Luigi 进行依赖项处理的目的.

旧的分析管道架构,具有两条不相交的数据流路径。
为了减少维护两个系统所固有的技术债务,我的任务是 开始将 Pentaho 任务转换为 Luigi 任务. 除了过渡到单一数据处理框架的明显好处外,这项工作还为进一步改进数据仓库铺平了道路。 因为,在这个新架构中,所有对仓库的写入都是通过管道完成的,新的数据处理任务(如我上面的课程主题领域任务)将能够写入仓库,而无需围绕 Pentaho 数据加载进行手动调度脚步。 统一的数据处理工作流程也将使数据验证更容易; 只需将 Luigi 任务添加到统一管道中,即可将数据验证任务嵌入到处理步骤中。

Pentaho 退役后的内部分析 (BI) 架构完成。
这个项目使我能够使用管道的完整技术堆栈。 我有机会编写与 MySQL LMS 数据库、事件跟踪日志、Apache Hive 中间结果仓库和完成的 Vertica 数据产品仓库交互的任务,这是我在夏季课程。
结语
今年夏天我很高兴有机会在 edX 工作。 这次实习教会了我许多技术技能(Luigi 框架、MapReduce 范式、SQL、git),并且在分析团队中也让我获得了数据处理架构设计、大型代码库维护等方面的第一手经验,以及软件和数据产品的开发周期。 学习在敏捷团队的环境中工作也是一项广泛适用的技能,它让我更加有意识地思考非工作环境中的团队动态和项目管理。
我要感谢 John Baker、Gabe Mulley 和 Brian Wilson 帮助我解决技术管道问题,感谢分析团队的其他成员提供了良好的工作环境,以及 edX 的其他所有人让这个夏天变得有趣。
![]()