Oryx 2 是一个面向实时大规模机器学习的 Lambda 架构框架,构建在 Apache Spark 和 Apache Kafka 之上。它既可以作为开发机器学习应用的通用框架,也提供协同过滤、分类、回归和聚类等可直接部署的端到端应用。与只覆盖单一算法或单一处理阶段的实现不同,Oryx 2 将批处理、流式增量更新、模型服务和数据传输组织成可以协作、复用和替换的层级结构,应用可以按 tier、按 layer 使用,也可以逐个替换其中的实现。
核心功能
Lambda 架构与数据传输
Oryx 2 由通用 Lambda 架构层、机器学习抽象层和端到端应用层组成。数据传输使用 Apache Kafka topic,外部进程以及服务层都可以向输入 topic 写入数据,速度层和批处理层从中读取。Kafka topic 还负责发布模型和模型更新,使不同处理层能够交换结果。
批处理层
批处理层以 Hadoop 集群上的 Spark Streaming 进程实现,读取输入 Kafka topic 中的数据。它会将当前数据窗口保存到 HDFS,再与 HDFS 上的历史数据合并,并开始构建新的结果。该过程可能持续数小时甚至一天,每天运行数次;生成的结果会写入 HDFS,同时发布到 Kafka 更新 topic。
速度层
速度层同样由 Spark Streaming 进程实现,但处理周期更短,通常以秒为数量级。它监听输入 Kafka topic,定期从更新 topic 加载新模型,并持续生成模型更新。新的更新会再次写回更新 topic,从而支持根据流入的新数据产生增量模型变化。
服务层与 REST API
服务层监听更新 topic 中的模型和模型更新,并将模型状态保存在内存中。它在内存模型之上提供 HTTP REST API,用于执行查询操作;多个服务层实例可以部署以实现扩展。服务层也可以接收新数据并写入 Kafka,让这些数据继续被速度层和批处理层处理。
机器学习抽象与模型选择
ML tier 在通用接口之上实现了面向机器学习的专用接口。它可以自动选择测试集和训练集,调用应用提供的函数评估模型,并在不同超参数下重复评估,选择表现最佳的结果。模型序列化由 PMML 管理,应用可以填充这些机器学习接口来构建自己的实现。
端到端机器学习应用
Oryx 2 内置了三类完整的批处理、速度和服务层实现:基于交替最小二乘法的协同过滤与推荐,基于 k-means 的聚类,以及基于随机决策森林的分类和回归。这些实现可以直接部署,也可以作为定制应用的基础。应用还可以替换协同过滤应用的模型构建批处理层,例如接入基于 Spark MLlib 之外新算法的自定义实现,同时保留已有的服务层和速度层。
使用方式
Oryx 2 使用 Java 编写,依赖 Apache Spark、Hadoop、Tomcat、Kafka、Zookeeper 等组件。部署通过一个 Typesafe Config 配置文件完成,应用可以在其中配置整个系统部署,以及批处理、速度和服务逻辑所需的关键接口实现。各层实现会与对应的二进制文件一起打包部署,每个层的实例都是可运行的 Java .jar,启动后会运行所需服务。服务层对外提供 HTTP REST API;正文未说明需要注册或自备模型 Key,也未描述独立客户端、浏览器插件或命令行使用方式。
适用人群与场景
需要构建实时大规模机器学习应用的 Java 开发者,可以使用通用 Lambda 层和 ML tier 实现自定义应用。需要根据新数据持续产生模型增量更新的部署场景,可以组合批处理层与速度层;如果不需要增量更新,也可以省略速度层。需要快速部署推荐、协同过滤、聚类、分类或回归应用的团队,可以直接使用内置的端到端实现。希望替换模型算法但保留数据处理和服务能力的开发者,则可以逐层或逐个组件修改现有实现。
注意事项
Oryx 2 的部署依赖 Hadoop 集群以及 Spark、Kafka、Tomcat、Zookeeper 等组件。批处理过程可能运行数小时甚至一天,模型和模型更新通过 Kafka topic 在各层之间传递,服务层则将模型状态保存在内存中。官网正文未提供价格、免费额度、托管服务或注册方式说明。