8.4.1 MLlib简介

MLlib是一些常用的机器学习算法和库在Spark平台上的实现,是AMPLab的在研机器学习项目MLBase的底层组件。MLBase是一个机器学习平台,MLI是一个接口层,提供很多结构,MLlib是底层算法实现层。三者关系如图8-24所示。

8.4.1 MLlib简介 - 图1

图8-24 MLbase

MLlib在Spark 1.0中包含分类与回归、聚类、协同过滤、数据降维组件以及底层的优化库。

通过图8-25,读者可以对MLlib的整体组件和依赖库有宏观的把握。

8.4.1 MLlib简介 - 图2

图8-25 MLlib组件

下面简要介绍图8-25中,读者可能不太熟悉的底层组件。

BLAS/LAPACK层:LAPACK是用Fortran编写的算法库,顾名思义,Linear Algebra PACKage是为了解决通用的线性代数问题的。另外必须要提的算法包是BLAS(Basic Linear Algebra Subprograms),其实LAPACK底层使用了BLAS库。不少计算机厂商都提供了针对不同处理器进行了优化的BLAS/LAPACK算法包。

Netlib-java(官网地址为https://github.com/fommil/netlib-java/)是一个对底层BLAS、LAPACK封装的Java接口层。

Breeze(官网地址为:https://github.com/scalanlp/breeze)是一个Scala编写的数值处理库,提供向量、矩阵运算等API。

库依赖:MLlib底层使用了Scala编写的线性代数库Breeze,Breeze底层依赖netlib-java库。netlib-java底层依赖原生的Fortran routines。因此,当用户使用时,需要在节点上预先安装gfortran runtime library(下载地址为https://github.com/mikiobraun/jblas/wiki/Missing-Libraries)。由于许可证(license)问题,官方的MLlib依赖集中没有引入netlib-java原生库的依赖。如果运行时环境没有可用原生库,就会看到警告信息。如果程序中需要使用netlib-java的库,就需要在项目中引入com.github.fommil.netlib:all:1.1.2的依赖或者参照指南(网址为https://github.com/fommil/netlib-java/blob/master/README.md#machine-optimised-system-libraries)build用户自己的项目。如果需要使用python接口,则需要1.4或者更高版本的NumPy。(注意:MLlib源码中注释有Experimental/DeveloperApi的API在未来的发布版本中可能会调整和改变,官方会在不同版本发布时提供迁移指南。)