MADlib是Pivotal公司与伯克利大学合作开发的一个开源机器学习库,提供了多种数据转换、数据探索、统计、数据挖掘和机器学习方法,使用它能够简易地对结构化数据进行分析和挖掘。用户可以非常方便地将MADlib加载到数据库中,扩展数据库的分析功能。2015年7月MADlib成为Apache软件基金会的孵化器项目,经过两年的发展,于2017年8月毕业成为Apache顶级项目。其当前最新版本为MADlib 1.12,可以与PostgreSQL、Greenplum和HAWQ等数据库系统无缝集成。
无论是经典的SAS、SPSS,还是时下流行的MATLAB、R、Python,所有这些机器学习或数据挖掘软件,都是自成系统的。具体说就是具有一套完整的程序语言及其集成开发环境,提供了丰富的数学和统计分析函数,具备良好的人机交互界面,支持从数据准备、数据探索、数据预处理,到开发和实现模型算法、数据可视化,再到最终结果的验证与模型部署到应用的全过程。它们都是面向程序员的系统或语言,重点在于由程序员自己利用系统提供的基本计算方法或函数,通过编程的方式实现所需的模型算法。表1给出了5种常用数据挖掘工具在功能、特点、适用场景方面的比较,从中可以看出,每种工具都有自己的特点和适应条件。
工具名称 |
功能 |
特点 |
适用场景 |
MATLAB |
不仅具有较强的数据统计、科学计算功能,还具有金融、经济等众多的行业应用工具箱 |
擅长矩阵计算和仿真模拟; 具有丰富的数学函数,适合算法开发或自主的程序开发; 具有强大的绘图功能 |
适合学习研究算法和灵活的产品开发 |
SAS |
功能强大的统计分析软件 |
具有较强的大数据处理能力; 支持二次开发 |
有一些行业标准,适合工业使用 |
SPSS |
侧重统计分析 |
使用方便,但不适合自己开发代码,就是说扩展上受限,如果要求不高,已经足够 |
界面友好,使用简单,但功能强大,也可以编程,能解决大部分统计学问题,适合初学者 |
WEKA |
具有丰富数据挖掘函数,包括分类、聚类、关联分析等主流算法 |
Java开发的开源数据分析、机器学习工具 |
适合于具有一定程序开发经验的工程师,尤其适合于用Java进行二次开发 |
R |
类似MATLAB,具有丰富的数学和统计分析函数 |
开源并支持二次开发 |
适合算法学习、小项目的产品研发 |
表1 常用数据挖掘工具的比较
MADlib具有与上述工具完全不同的设计理念,它不是面向程序员的,而是面向数据库开发或DBA的。如果用一句话说明什么是MADlib,那就是“SQL中的大数据机器学习库”。通常SQL查询能发现数据最明显的模式和趋势,但要想获取数据中最为有用的信息,需要的其实是完全不同的另一套技术,一套牢固扎根于数学和应用数学的技能,当然指的就是数据挖掘或机器学习,而具备这种技术的人才似乎只存在于学术界中。如果能将SQL的简单易用与数据挖掘的复杂算法结合起来,充分利用两者的优势和特点,那对于广大传统数据库应用技术人员来说,学习和从事数据挖掘工作的门槛将大大降低。现在,鱼和熊掌兼得的机会来了,DBAer不用现学Python、R或MATLAB,只要使用MADlib,用SQL就能实现简单的数据挖掘。
对用户而言,MADlib仅提供了可在SQL查询语句中调用的函数。其中不但包括基本的线性代数运算和统计函数,而且还提供了常用的、现成的机器学习或数据挖掘模型函数。用户不需要深入了解算法的程序实现细节,只要搞清楚各函数中相关参数的含义,从而提供正确的入参,并且能够理解和解释函数的输出结果即可。这种使用方式无疑会极大地提高开发效率,节约开发成本。在MADlib的世界里,一切皆函数,就是这么简单。
然而任何事物都具有两面性,MADlib提供了使用方便性,但相对于其它数据挖掘系统而言,灵活性、扩展性与功能完备性显然是其短板。这很好理解,首先,模型已经被封装在SQL函数中,性能优劣完全依赖于函数本身,基本没有留给用户进行性能调整的空间。其次,函数只能在SQL中调用,而SQL依赖于数据库系统,也就是说单独的MADlib函数库是无意义的,它必须与PostgreSQL、Greenplum和HAWQ等数据库系统结合使用。最后,既然MADlib是SQL中的机器学习库,注定它不关心数据可视化,本身不带数据的图形化表示功能。由此可见,MADlib作为工具,并不是传统意义上的数据挖掘系统软件,而只是一套可在SQL中调用的函数库,其出发点是让数据库技术人员用SQL快速完成简单的数据挖掘工作。
即便如此,MADlib的易用性已经足以引起我们的兴趣。在了解了MADlib是什么及其优缺点后,用户就能根据自己的实际情况和需求,有针对性地选择和使用MADlib来实现特定业务目标。
MADlib架构如图1所示。
图1 MADlib架构
处于架构最上面一层是用户接口。如前所述,用户只需通过在SQL查询语句中调用MADlib提供的函数来完成数据挖掘的工作。当然这里的SQL语法要与特定数据库管理系统相匹配。最底层则是Greenplum、PostgreSQL等数据库管理系统,最终由它们处理查询请求。
从图1中看到,MADlib系统架构自上至下由以下四个主要组件构成:
(1)Python驱动函数
驱动函数是用户输入的主入口点,调用优化器执行迭代算法的外层循环。
(2)Python实现的高级抽象层
高级抽象层负责算法的流程控制。与驱动函数一起实现输入参数验证、SQL语句执行、结果评估,并可能在循环中自动执行更多的SQL语句直到达到某些收敛标准。
(3)C++实现的核心函数
这部分函数是由C++编写的核心函数,在内层循环中实现特定机器学习或数据挖掘算法。出于性能考虑,这些函数使用C++而不是Python编写。
(4)C++实现的低级数据库抽象层
这些函数提供一个编程接口,将所有的Postgres数据库内核实现细节进行抽象。它们提供了一种机制,使得MADlib能够支持不同的后端平台,从而将关注点集中在内部功能而不是平台集成上。
驱动MADlib架构的主要设计思想与Hadoop是一致的,体现在以下方面:
MADlib支持以下常用的数据挖掘与机器学习模型类型,其中大部分模型都包含训练和预测两组函数。
(1)回归
如果所需的输出具有连续性,我们使用回归方法建立模型,预测输出值。例如,如果有真实的描述房地产属性的数据,我们就可以建立一个模型,预测基于房屋已知特征的售价。因为输出反应了连续的数值而不是分类,所以该场景是一个回归问题。
(2)分类
如果所需的输出实质上是分类的,可以使用分类方法建立模型,预测新数据会属于哪一类。分类的目标是能够将输入记录标记为正确的类别。例如,假设有描述人口统计的数据,以及个人申请贷款和贷款违约历史数据,那么我们就能建立一个模型,描述新的人口统计数据集合贷款违约的可能性。此场景下输出的分类为“违约”和“正常”两类。
(3)关联规则挖掘
有时又叫做购物篮分析或频繁项集挖掘。相对于随机发生,确定哪些事项更经常一起发生,指出事项之间的潜在关系。例如,在一个网店应用中,关联规则挖掘可用于确定哪些商品倾向于被一起售出,然后将这些商品输入到客户推荐引擎中,提供促销机会,就像著名的啤酒与尿布的故事。
(4)聚类
识别数据分组,一组中的数据项比其它组的数据项更相似。例如,在客户细分分析中,目标是识别客户行为相似特征组,以便针对不同特征的客户设计各种营销活动,以达到市场目的。如果提前了解客户细分情况,这将是一个受控的分类任务。当我们让数据识别自身分组时,这就是一个聚类任务。
(5)主题建模
主题建模与聚类相似,也是确定彼此相似的数据组。但这里的相似通常特指在文本领域中,具有相同主题的文档。
(6)描述性统计
描述性统计不提供模型,因此不被认为是一种机器学习方法。但描述性统计有助于向分析人员提供信息以了解基础数据,为数据提供有价值的解释,可能影响数据模型的选择。例如,计算数据集中每个变量内的数据分布,可以帮助分析理解哪些变量应被视为分类变量,哪些变量是连续性变量,以及值的分布情况。描述性统计通常是数据探索的组成部分。
(7)模型验证
如果不了解一个模型的准确性就开始使用它,很容易导致糟糕的结果。正因如此,理解模型存在的问题,并用测试数据评估模型的精度尤为重要。需要将训练数据和测试数据分离,频繁进行数据分析,验证统计模型的有效性,评估模型不过分拟合训练数据。N-fold交叉验证方法经常被使用。
MADlib的功能特色如图2所示。
图2 MADlib功能
下面基于MADlib 1.1.10版本,预览MADlib提供的具体模型算法或功能。
(1)Data Types andTransformations(数据类型与转换)
Arraysand Matrices(数组与矩阵)
ArrayOperations(数组运算)
MatrixOperations(矩阵运算)
MatrixFactorization(矩阵分解)
Low-rankMatrix Factorization(低阶矩阵分解)
SingularValue Decomposition(SVD,奇异值分解)
Normsand Distance functions(范数和距离函数)
SparseVectors(稀疏向量)
DimensionalityReduction(降维)
PrincipalComponent Analysis(PCA主成分分析)
PrincipalComponent Projection(PCP主成分投影)
Pivot(透视表)
EncodingCategorical Variables(分类变量编码)Stemming(词干提取)
(2)Graph(图)
SingleSource Shortest Path(单源最短路径)
(3)Model Evaluation(模型评估)
CrossValidation(交叉验证)
PredictionMetrics(指标预测)
(4)Statistics(统计)
DescriptiveStatistics(描述性统计)
Pearson’s Correlation(皮尔逊相关系数)
Summary(摘要汇总)
InferentialStatistics(推断性统计)
HypothesisTests(假设检验)
ProbabilityFunctions(概率函数)
(5)Supervised Learning(监督学习)
ConditionalRandom Field(条件随机场)
RegressionModels(回归模型)
ClusteredVariance(聚类方差)
Cox-ProportionalHazards Regression(Cox比率风险回归)
ElasticNet Regularization(弹性网络回归)
GeneralizedLinear Models(广义线性回归)
LinearRegression(线性回归)
LogisticRegression(逻辑回归)
MarginalEffects(边际效应)
MultinomialRegression(多分类逻辑回归)
OrdinalRegression(有序回归)
RobustVariance(鲁棒方差)
SupportVector Machines(支持向量机)
TreeMethods(树方法)
DecisionTree(决策树)
RandomForest(随机森林)
(6)Time Series Analysis(时间序列分析)
ARIMA(自回归积分滑动平均)
(7)UnsupervisedLearning(无监督学习)
AssociationRules(关联规则)
AprioriAlgorithm(Apriori算法)
Clustering(聚类)
k-MeansClustering(k-Means)
TopicModelling(主题模型)
LatentDirichlet Allocation(LDA)
(8)Utility Functions(应用函数)
DeveloperDatabase Functions(开发者数据库函数)
LinearSolvers(线性求解器)
DenseLinear Systems(稠密线性系统)
SparseLinear Systems(稀疏线性系统)
PathFunctions(路径函数)
PMMLExport(PMML导出)
Sessionize(会话化)
TextAnalysis(文本分析)
TermFrequency(词频)
MADlib最新发布版本是1.12,可以安装在PostgreSQL、Greenplum和HAWQ中,在不同的数据库中安装过程也不尽相同。这里以在HAWQ2.1.1.0中安装MADlib为例,演示MADlib的安装与卸载过程。后续进行的一系列示例也都在此实验环境中进行。HAWQ的安装与部署参见“HAWQ技术解析(二) —— 安装部署”。
数据挖掘需要数据库系统提供有效的存储、索引和查询处理支持。源于高性能(并行)计算的技术在处理海量数据集方面常常是重要的。分布式技术也能帮助处理海量数据,并且当数据不能集中到一起处理时更是至关重要。
比照以上数据挖掘对数据库系统提出的要求,我们不妨简单考量一下HAWQ。先提出一点,HAWQ目前不支持索引。但是,对于存储在Hadoop集群上的“大数据”分析应用而言,实际执行的操作几乎都是表扫描,很少需要定位几行数据,因此传统的由用户定义的索引,其作用在此场景下微乎其微。而HAWQ使用的随机分布存储策略具有较好的数据本地化特性,优化器在制定查询计划时,内部实现已然利用了索引的思想。HAWQ使用专为HDFS量身打造的,基于成本的查询优化框架来增强其性能。所采用的MPP架构,使用户能够获益于基于MPP的分析功能及其查询性能,同时有效利用HDFS的分布式存储、容错机制、机架感知等功能,兼顾了低延时与高扩展。由此看来,在HAWQ上运行MADlib,实现大数据挖掘,是一个比较合理的选择。
下载地址为:https://network.pivotal.io/products/pivotal-hdb。2.1.1.0版本的HAWQ提供了四个安装文件,如图3所示。经过测试,本环境只有MADlib 1.10.0版本的文件可以正常安装。
图3 下载MADlib安装文件
以下命令需要使用gpadmin用户,在HAWQ的Master主机上执行。
(1)解压缩
tar -zxvfmadlib-ossv1.10.0_pv1.9.7_hawq2.1-rhel5-x86_64.tar.gz
(2)安装MADlib的gppkg文件
gppkg -imadlib-ossv1.10.0_pv1.9.7_hawq2.1-rhel5-x86_64.gppkg
该命令在HAWQ集群的所有节点(Master和Segment)上创建MADlib的安装目录和文件,缺省目录为/usr/local/hawq_2_1_1_0/madlib。gppkg是Greenplum的包管理器应用程序,用于在集群所有节点上安装Greenplum数据库扩展包及其依赖。
(3)在指定数据库中部署MADlib
$GPHOME/madlib/bin/madpack install -c /dm-s madlib -p hawq
该命令在HAWQ的dm数据库中建立madlibschema,-p参数指定平台为HAWQ。命令执行后可以查看在madlib schema中创建的数据库对象。
dm=# set search_path=madlib;
SET
dm=# \dt
List of relations
Schema | Name | Type | Owner | Storage
--------+------------------+-------+---------+-------------
madlib | migrationhistory | table | gpadmin | append only
(1 row)
dm=# \ds
List of relations
Schema | Name | Type | Owner | Storage
--------+-------------------------+----------+---------+---------
madlib | migrationhistory_id_seq | sequence | gpadmin | heap
(1 row)
dm=# select type,count(*)
dm-# from (select p.proname as name,
dm(# case when p.proisagg then 'agg'
dm(# when p.prorettype
dm(# = 'pg_catalog.trigger'::pg_catalog.regtype
dm(# then 'trigger'
dm(# else 'normal'
dm(# end as type
dm(# from pg_catalog.pg_proc p, pg_catalog.pg_namespace n
dm(# where n.oid = p.pronamespace and n.nspname='madlib') t
dm-# group by rollup (type);
type | count
--------+-------
agg | 135
normal | 1324
| 1459
(3 rows)
从查询结果可以看到,MADlib部署应用程序madpack首先创建数据库模式madlib,然后在该模式中创建数据库对象,包括一个表,一个序列,1324个普通函数,135个聚合函数。所有的机器学习和数据挖掘模型、算法、操作和功能都是通过调用这些函数实际执行的。
(4)验证安装
$GPHOME/madlib/bin/madpack install-check -c/dm -s madlib -p hawq
该命令通过执行29个模块的77个案例,验证所有模块都能正常工作。命令输出如下,如果看到所有案例都已经正常执行,说明MADlib安装成功。这条命令需要执行较长时间。
[gpadmin@hdp3 Madlib]$ $GPHOME/madlib/bin/madpack install-check -c /dm -s madlib -p hawq
madpack.py : INFO : Detected HAWQ version 2.1.
TEST CASE RESULT|Module: array_ops|array_ops.sql_in|PASS|Time: 1851 milliseconds
TEST CASE RESULT|Module: bayes|gaussian_naive_bayes.sql_in|PASS|Time: 24222 milliseconds
TEST CASE RESULT|Module: bayes|bayes.sql_in|PASS|Time: 70634 milliseconds
…
TEST CASE RESULT|Module: pca|pca.sql_in|PASS|Time: 523230 milliseconds
TEST CASE RESULT|Module: validation|cross_validation.sql_in|PASS|Time: 33685 milliseconds
[gpadmin@hdp3 Madlib]$
卸载过程基本上是安装的逆过程。
(1)删除madlib模式
方法1,使用madpack部署应用程序删除模式。
$GPHOME/madlib/bin/madpack uninstall -c /dm-s madlib -p hawq
方法2,使用SQL命令手工删除模式。
drop schema madlib cascade;
(2)删除其它遗留数据库对象
删除模式
如果模型验证过程中途出错,数据库中可能包含测试的模式,这些模式名称的前缀都是madlib_installcheck_,只能手工执行SQL命令删除这些模式,如:
drop schema madlib_installcheck_kmeanscascade;
删除用户
如果存在遗留的测试用户,则删除它,如:
drop user if existsmadlib_1100_installcheck;
(3)删除MADlib rpm包
查询包名:
gppkg -q --all
输出如下:
[gpadmin@hdp3 Madlib]$ gppkg -q --all
20170630:16:19:53:076493 gppkg:hdp3:gpadmin-[INFO]:-Starting gppkg with args: -q --all
madlib-ossv1.10.0_pv1.9.7_hawq2.1
删除rpm包:
gppkg -rmadlib-ossv1.10.0_pv1.9.7_hawq2.1