1.4 Spark 3.0核心——ML
首先谈一下新旧版本MLlib的区别。ML和MLlib都是Spark中的机器学习库,都能满足目前常用的机器学习功能需求。Spark官方推荐使用ML,因为它功能更全面、更灵活,未来会主要支持ML,MLlib很有可能会被废弃。
ML主要操作的是DataFrame,而MLlib操作的是RDD,也就是说二者面向的数据集不一样。相比于MLlib在RDD提供的基本操作,ML在DataFrame上的抽象级别更高,数据和操作耦合度更低。ML中的操作可以使用Pipeline,跟Sklearn一样,可以把很多操作(算法、特征提取、特征转换)以管道的形式串起来,然后让数据在这个管道中流动。ML中无论是什么模型,都提供了统一的算法操作接口,比如模型训练都是fit。
如果将Spark比作一颗闪亮的星星,那么其中最明亮、最核心的部分就是ML。ML是一个构建在Spark上、专门针对大数据处理的并发式高性能机器学习库,其特点是采用较为先进的迭代式、内存存储的分析计算,使数据的计算处理速度大大高于普通的数据处理引擎。
ML机器学习库还在不停地更新中,Apache的相关研究人员仍在不停地为其中添加更多的机器学习算法。目前ML中已经有通用的学习算法和工具类,包括统计、分类、回归、聚类、降维等,如图1-2所示。
图1-2 ML的算法和工具类
对预处理后的数据进行分析,从而获得包含着数据内容的结果。ML作为Spark的核心处理引擎,在诞生之初就为处理大数据而采用了“分治式”的数据处理模式,将数据分散到各个节点中进行相应的处理。通过数据处理的“依赖”关系,使处理过程层层递进。这个过程可以依据要求具体编写,好处是避免了大数据处理框架所要求进行的大规模数据传输,从而节省了时间、提高了处理效率。
ML借助函数式程序设计思想,让程序设计人员在编写程序的过程中只需要关注其数据,而不必考虑函数调用顺序,不用谨慎地设置外部状态。所有要做的就是传递代表了边际情况的参数。
ML采用Scala语言编写。Scala语言是运行在JVM上的一种函数式编程语言,特点是可移植性强,最重要的特点是“一次编写,到处运行”。借助于RDD或DataFrame数据统一输入格式,让用户可以在不同的IDE上编写数据处理程序,通过本地化测试后可以在略微修改运行参数后直接在集群上运行。对结果的获取更为可视化和直观,不会因为运行系统底层的不同而造成结果的差异与改变。
ML是Spark的核心内容,也是其中最闪耀的部分。对数据的分析和处理是Spark的精髓,也是挖掘大数据这座宝山的金锄头。Spark 3.0中的数据集使用DataFrame格式,并且支持使用管道API进行运算。它对机器学习算法的API进行了标准化,以便更轻松地将多种算法组合到单个管道或工作流中。有了Pipeline(见图1-3)之后,ML更适合创建包含从数据清洗到特征工程再到模型训练等一系列工作。
图1-3 ML管道的工作流程