一.概述
- MapReduce每次读写,都需要序列化到磁盘。一个复杂任务,需要多次处理,几十次磁盘读写
- Spark只需要一次磁盘读写,大部分处理在内存中进行
- spark-shell(交互窗口模式):运行spark-shell需要指向申请资源的standalone spark集群信息,其参数为MASTER,还可以指定executor及driver的内存大小。spark-shell启动完成后,可以在交互窗口中输入scala命令,进行操作,其中spark-shell已经默认生成spark对象
- DataFrame-based API is primary API
1.第一代API:RDD
优点
- 编译时类型安全,编译时就能检查出类型错误
- 面向对象的编程风格,直接通过类名点的方式来操作数据
缺点
- 序列化和反序列化的性能开销,无论是集群间的通信,还是IO操作都需要对对象的结构和数据进行序列化和反序列化
- GC性能开销,频繁创建和销毁对象,势必会增加GC
2.第二代API:DataFrame
核心特征
- Schema:包含了ROW为单位的每行数据的列的信息;spark通过schema就能够读懂数据,因此在通信和IO时就只需要序列化和反序列化数据,而结构的部分就可以省略了
- off-heap:spark能够以二进制的形式序列化数据(不包括结构)到off-heap中,当要操作数据时,就直接操作off-heap内存
- Tungsten:新的执行引擎
- Catalyst:新的语法解析框架
优点
- off-heap就像地盘,schema就像地图,Spark有地图又有自己地盘了,就可以自己说了算了,不再受JVM的限制,也就不再受GC的困扰了,通过schema和off-heap,DataFrame解决了RDD的缺点。对比RDD提升计算效率,较少数据读取,底层计算优化
缺点
- DataFrame解决了RDD的缺点,但是却丢了RDD的优点。DataFrame不是类型安全的,API也不是面向对象风格的
3.第三代API:DataSet
- DataSet 核心:Encoder
二.Pipelines的主要概念
spark.ml 提供了基于DataFrames高层次的API,可以用来构建机器学习工作流(pipeline)
DataFrame(数据模型)
- DataFrame作为ML的数据集
- ML可以应用于各种各样的数据类型,比如向量,文本,图形和结构化数据。API采用Spark SQL的DataFrame就是为了支持各种各样的数据类型
Transformer(转换器)
- 转换器是特征变换和机器学习模型的抽象。转换器必须实现transform方法,这个方法将一个DataFrame转换成另一个DataFrame,通常是附加一个或多个列
Estimators(模型学习器)
- Estimators模型学习器是拟合和训练数据的机器学习算法或者其它算法的抽象
- Estimators(模型学习器)实现fit()方法,这个方法输入一个DataFrame并产生一个model即一个transformer(转换器)
- 例如:一个机器学习算法是一个estimator模型学习器,比如这个算法是LogisticRegression,调用fit()方法训练出一个LogisticRegressionModel,这是一个Model,因此也是一个Transformer(转换器)
Pipeline(管道)
- Pipeline将多个Transformers和Estimators绑在一起形成一个工作流,在机器学习中,通常会执行一系列算法来处理和学习模型,比如,一个简单的文本文档处理流程可能包含这几个步骤:把每个文档的文本分割成单词 → 将这些单词转化成一个数值型特征向量 → 使用特征向量和标签学习一个预测模型
- MLlib代表一个流水线,就是一个pipeline,pipeline包含了一系列有特定顺序的管道步骤(transformers和estimators)
Parameter(参数)
- MLlib的Estimators(模型学习器)和Transformer(转换器)使用统一的API来指定参数。Param是具有自包含定义的参数,ParamMap是一组(参数,值)对
- 将参数传递给算法主要有两种方式
三.Pipelines的实例
- 一个pipeline由多个步骤组成,每个步骤都是一个Transformer(转换器)或Estimator(模型学习器)
- 这些步骤按顺序执行,首先输入的DataFrame,然后通过每个阶段进行转换
- 在Transformer(转换器)步骤中,DataFrame会调用transform()方法
- 在Estimator(模型学习器)步骤中,fit()方法被调用并产生一个Transformer(转换器)会成为pipelinemodel的一部分,或者适配pipeline,并且dataframe会调用这个transformer的transform()方法