SQL机器学习库MADlib技术解析
上QQ阅读APP看书,第一时间看更新

1.1 基本概念

1.1.1 MADlib是什么

无论是经典的SAS、SPSS还是时下流行的MATLAB、R、Python,所有这些机器学习或数据挖掘软件都是自成系统的,具体来说就是具有一套完整的程序语言及其集成开发环境,提供了丰富的数学和统计分析函数,具备良好的人机交互界面,支持从数据准备、数据探索、数据预处理到开发和实现模型算法、数据可视化,再到最终结果的验证与模型部署及应用的全过程。它们都是面向程序员的系统或语言,重点在于由程序员自己利用系统提供的基本计算方法或函数,通过编程的方式实现应用需求。

MADlib具有与上述工具完全不同的设计理念,不是面向程序员,而是面向数据库开发人员或DBA。如果要用一句话说明什么是MADlib,那就是“SQL中的大数据机器学习库”。通常SQL查询能发现数据最明显的模式和趋势,但要想获取数据中最为有用的信息,需要的其实是完全不同的一套技术,一套牢固扎根于数学和应用数学的技能(机器学习),而具备这种技术的人才似乎只存在于学术界中。如果能将SQL的简单易用与数据挖掘的复杂算法结合起来,充分利用两者的优势和特点,对于广大传统数据库应用技术人员来说,就可将他们长期积累的数据库操作技能复用到机器学习领域,使转型更加轻松。现在,鱼和熊掌兼得的机会来了,DBA只要使用MADlib,就能用SQL查询实现简单的机器学习。

对用户而言,MADlib提供了可在SQL查询语句中调用的函数,即可以用select+function name的方式来调用这个库。这就意味着,所有的数据调用和计算都在数据库内完成而不需要数据的导入导出。MADlib不仅包括基本的线性代数运算和统计函数,还提供了常用的、现成的机器学习模型函数。用户不需要深入了解算法的程序实现细节,只要搞清楚各函数中相关参数的含义、提供正确的入参并能够理解和解释函数的输出结果即可。这种使用方式无疑会极大地提高开发效率,节约开发成本。在MADlib的世界里,一切皆函数,就是这么简单。

然而,任何事物都具有两面性,虽然MADlib提供了使用方便性、降低了学习和使用门槛,但是相对于其他机器学习系统而言,其灵活性与功能完备性显然是短板。首先,模型已经被封装在SQL函数中,性能优劣完全依赖于函数本身,基本没有留给用户进行性能调整的空间。其次,函数只能在SQL中调用,而SQL依赖于数据库系统。也就是说单独的MADlib函数库是毫无意义的,必须与PostgreSQL、Greenplum和HAWQ等数据库系统结合使用。最后,既然MADlib是SQL中的机器学习库,就注定它不关心数据可视化,本身不带数据的图形化表示功能。由此可见,MADlib作为工具,并不是传统意义上的机器学习系统软件,而只是一套可在SQL中调用的函数库,其出发点是让数据库技术人员用SQL快速完成简单的机器学习工作,比较适合做一些简单的、特征相对明显的机器学习。

即便如此,MADlib的易用性已经足以引起我们的兴趣。在了解了MADlib是什么及其优缺点后,用户就能根据自己的实际情况和需求有针对性地选择和使用MADlib来实现特定业务目标。

1.1.2 MADlib的设计思想

驱动MADlib架构的关键设计思想体现在以下方面:

•操作数据库内的本地数据,避免在多个运行时环境之间不必要地移动数据。

•充分利用数据库引擎功能,但将机器学习逻辑从数据库特定的实现细节中分离出来。

•利用MPP无共享技术提供的并行性和可扩展性,如Greenplum或HAWQ数据库系统。

•开放实施,保持与Apache社区的积极联系和持续的学术研究。

操作本地数据的思想与Hadoop是一致的。为了使全局的带宽消耗和I/O延迟降到尽可能小,在选择数据时,MADlib总是选择距离读请求最近的存储节点。如果在读请求所在节点的同一个主机上有需要的数据副本,那么MADlib会尽量选择它来满足读请求。如果数据库集群跨越多个数据中心,那么存储在本地数据中心的副本会优先于远程副本被选择。

MADlib库表现为数据库内置的函数。当函数在SQL语句中执行时,可以充分利用数据库引擎提供的功能。例如,在HAWQ中执行MADlib函数时,每个物理Segment在执行查询的时候会启动多个查询执行器(Query Executor, QE),使得单一物理Segment看起来就像多个虚拟Segment,从而使HAWQ能够更好地利用所有可用资源。虚拟Segment是内存、CPU等资源的容器,每个虚拟Segment都含有为查询启动的一个QE。查询就是在虚拟Segment中被QE所执行的。

MADlib利用Greenplum或HAWQ数据库系统使用的MPP(Massively Parallel Processing,大规模并行处理)架构,使用户能够获益于经过锤炼的基于MPP的分析功能及其查询性能,兼顾了低延时与高扩展。

MADlib现已成为Apache顶级项目,其整个项目和代码是在Apache上开源的,开发是在Pivotal的支持下基于Apache社区的,与社区有很好的互动。

1.1.3 MADlib的工作原理

现以HAWQ上的MADlib为例解释它的工作原理。图1-1是HAWQ的架构。当一个客户端查询向HAWQ发出请求时,Master节点会对查询进行处理,根据查询成本、资源队列定义、数据局部化和当前系统中的资源使用情况,为查询规划资源分配。之后查询被分发到Segment节点所在的物理主机并行处理,可能是节点子集或整个集群。每个Segment节点上的资源实施器监控着查询对资源的实时使用情况,避免异常资源占用。查询处理完成后,最后的结果再通过Master返回客户端。

图1-1 HAWQ架构

MADlib就是构建在HAWQ架构之上的,通过定义HAWQ上的UDA和UDF建立In-Database Functions。当我们使用SQL调用MADlib时,MADlib会首先进行输入的有效性判断和数据的预处理,将处理后的查询传给HAWQ,之后所有的计算即等同于普通的查询处理请求在HAWQ内执行。图1-2显示了MADlib在HAWQ上的工作原理。

图1-2 MADlib在HAWQ上的工作原理

1.1.4 MADlib的执行流程

图1-3中是整个MADlib函数调用过程的执行流程。在客户端,我们可以使用Jupyter、Zeppelin、psql等工具连接数据库并调用MADlib Function。MADlib预处理后根据具体算法生成多个查询传入数据库服务器,之后数据库服务器执行查询并返回String(一般是一个或多个存放结果的表)。

图1-3 MADlib执行流程

1.1.5 MADlib架构

MADlib架构如图1-4所示。

图1-4 MADlib架构

处于架构最上面一层的是用户接口。如前所述,用户只需通过在SQL查询语句中调用MADlib提供的函数来完成机器学习工作。当然这里的SQL语法要与特定数据库管理系统相匹配。最底层则是Greenplum、PostgreSQL、HAWQ等数据库管理系统,最终由它们处理查询请求。中间四层是构成MADlib的组件。从图1-4中可以看到,MADlib系统架构自上而下由四个主要组件构成:

(1)Python调用SQL模板实现的驱动函数

驱动函数是用户输入的主入口点,调用优化器执行迭代算法的外层循环。

(2)Python实现的高级抽象层

高级抽象层负责算法的流程控制。与驱动函数一起实现输入参数验证、SQL语句执行、结果评估,并可能在循环中自动执行更多的SQL语句直至达到某些收敛标准。

(3)C++实现的核心函数

这部分函数是由C++编写的核心函数,在内层循环中实现特定机器学习算法。出于性能考虑,这些函数使用C++而不是Python编写。

(4)C++实现的低级数据库抽象层

这些函数提供一个编程接口,对所有的PostgreSQL数据库内核实现细节进行抽象。它们提供了一种机制,使得MADlib能够支持不同的后端平台,从而使用户将关注点集中在内部功能而不是平台集成上。