1.3.3 交互式SQL处理框架SparkSQL
Spark SQL的四个特点如下:
其一,能在Scala代码里写SQL,支持简单的SQL语法检查,能把RDD指
为Table存储起来。此外支持部分SQL语法的DSL。对SQL的支持主要依赖Catalyst这个新的查询优化框架,在把SQL解析成逻辑执行计划之后,利用Catalyst包里的一些类和接口,执行一些简单的执行计划优化,最后变成RDD的计算。
其二,支持Parquet文件的读/写,且保留Schem。Parquet是一个列式存储格式的文件系统,使用Parquet进行文件读/写可以极大降低对CPU和磁盘I/O的消耗。
其三,支持直接多JSON格式数据的操作。JSON是一种流行的数据存储和传输格式,SPark SQL提供的对JSON的操作丰富了Spark SQL的应用场景和数据来源。
其四,能在Scala代码里访问Hive元数据,能执行Hive语句,并且把结果取回作为RDD使用。Spark SQL作为Spark生态的一员继续发展,而不再受限于Hive,只是兼容Hive;而Hive on Spark是一个Hive的发展计划,该计划将Spark作为Hive的底层引擎之一,也就是,Hive将不再受限于一个引擎,可以采用map-reduce、Tez、Spark等引擎。
1.3.4 机器学习框架(Spark MLlib)
MLlib是Spark对常用的机器学习算法的实现库,同时包括相关的测试和数据生成器。MLlib目前支持4种常见的机器学习问题:二元分类、回归、聚类以及协同过滤,同时也包括一个底层的梯度下降优化基础算法。
1. 依赖
MLlib将会调用jblas线性代数库,这库依赖于原生的Fortran程序。
2. 二元分类
二元分类是一个监督学习问题。MLlib目前支持两个适用于二元分类的标准模型家族:线性支持向量机(SVMs)和逻辑回归,同时也包括分别适用于这两个模型家族的L1和L2正则化变体。二元分类算法的输入值是一个正则参数(regParam)和多个与梯度下降相关的参数(stepSize,numIterations,miniBatchFraction)。
目前可用的二元分类算法:SVMWithSGD、LogisticRegressionWithSGD。
3. 线性回归
MLlib支持线性回归与与之相关的L1(lasso)和L2(ridge)正则化的变体。MLlib中的回归算法业利用了底层的梯度下降基础算法,输入参数与二元分类算法一致。
目前可用的线性回归算法:LineearRegressionWithSGD、RidgeRegressionWithSGD、LassoWithSGD。
4. 聚类
聚类通常被用于探索性的分析,或者作为层次化监督学习管道网的一个组件(其中每一个类簇都会用于训练不同的分类器或者回归模型)。MLlib目前已经支持作为最被广泛使用的聚类算法之一的k-means聚类算法,根据事先定义的类簇个数,这个算法能对数据进行聚类。MLlib的实现中包含一个k-means++方法的并行化变体kmeans||。MLlib里面的实现包含如下参数:
Ø k是所需的类簇的个数;
Ø maxIterations是最大的迭代次数;
Ø initializationMode这个参数决定了是用随机初始化还是通过k-means||初始化;
Ø runs是跑k-means算法的次数(k-mean算法不能保证能找出最优解,如果在给定的数据集上运行多次,算法将会返回最佳的结果);
Ø initializiationSteps决定了k-means||算法的步数;
Ø epsilon决定了判断k-means是否收敛的距离阀值。
5. 协同过滤
协同过滤常被应用于推荐系统。这一技术旨在补充用户--商品关联矩阵中所缺失的部分。MLlib当前支持基于模型的协同过滤,其中用户和商品通过一组隐语义因子进行表达,并且这些因子也用于预测缺失的元素。为此,实现交替最小二乘法(ALS)来学习这些隐性语义因子。在MLlib中的实现有如下参数:
n numBlocks是用于并行化计算的分块个数(设置为-1为自动配置);
n rank是模型中隐语义因子的个数;
n iterations是迭代的次数;
n lambda是ALS的正则化参数;
n implicitPrefs决定了是用显性反馈ALS的版本还是用隐性反馈数据集的版本;
n alpha是一个针对于隐性反馈ALS版本的参数,这个参数决定了偏好行为强度的基准。
隐性反馈与显性反馈
基于矩阵分解的协同过滤的标准方法一般将用户商品矩阵中的元素作为用户对商品的显性偏好。
在现实生活的很多场景中,常常只能接触到隐性的反馈。本质上,这个方法将数据作为二元偏好值和偏好强度的一个结合,而不是对评分、矩阵直接进行建模。目前可用的协同过滤的算法:ALS。
6. 梯度下降基础算法
梯度下降(及其随机的变种)是非常适用于大型分布式计算的一阶优化方案。梯度下降旨在通过向一个函数当前点(当前的参数值)的负梯度方向移动的方式迭代地找到这个函数的本地最优解。MLlib以梯度下降作为一个底层的基础算法,梯度下降算法有如下参数:
l gradient这个类是用来计算要被优化的函数的随机梯度。MLlib包含常见损失函数(hinge、logistic、least-squares)的梯度类。梯度类将训练样本、标签,以及当前的参数值作为输入值。
l updater是在梯度下降的每一次迭代中更新权重的类。MLlib包含适用于无正则项、L1正则项和L2正则项3种情况下的类。
l stepSize是一个表示梯度下降初始步长的数值。MLlib中所有的更新器第t步的步长等于stepSize/sqrt(t)。
l numIterations表示迭代的次数。
l regParam是在使用L1、L2正则项时的正则化参数。
l miniBatchFraction是每一次迭代中用来计算梯度的数据百分比。
目前可用的梯度下降算法:GradientDescent。