DataFrame履行后端优化(Tungsten第一阶段)
DataFrame能够说是悉数Spark项目最中心的有些,在1.5这个开发周期内最大的改变即是Tungsten项目的第一阶段现已完结。首要的改变是由Spark自个来办理内存而不是运用JVM,这么能够防止JVM GC带来的功用丢失。内存中的Java方针被存储成Spark自个的二进制格局,核算直接发生在二进制格局上,省去了序列化和反序列化时刻。一起这种格局也愈加紧凑,节约内存空间,并且能十分好的估量数据量巨细和内存运用情况。假如咱们对这有些的代码感兴趣,能够在源代码里边查找那些Unsafe最初的类即可。在1.4版别只供给UnsafeShuffleManager等少量功用,剩余的大有些都是1.5版别新参加的功用。
别的优化还包含默许运用code generation; cache-aware算法对join, aggregation, shuffle, sorting的增强;window function功用的进步级。
那么功用究竟能进步多少呢?能够参阅DataBricks给出的这个比如。这是一个16 million行的记载,有1 million的组合键的aggregation查询别离运用Spark 1.4和1.5版别的功用比照,在这个测验中都是运用的默许装备。
那么假如咱们想自个测验下Tungsten第一阶段的功用改怎么测验呢?Spark 1.4曾经的版别中spark.sql.codegen, spark.sql.unsafe.enabled等几个参数在1.5版别里边合并成spark.sql.tungsten.enabled并默许为true,只需要修正这一个参数就能够装备是不是敞开tungsten优化(默许是敞开的)。
DataFrame/SQL/Hive
在DataFrame API方面,完成了新的聚合函数接口AggregateFunction2以及7个相应的build-in的聚合函数,一起根据新接口完成了相应的UDAF接口。新的聚合函数接口把一个聚合函数拆解为三个动作: initialize/update/merge,然后用户只需要界说其间的逻辑既能够完成不一样的聚合函数功用。Spark的这个新的聚合函数完成办法和Impala里边十分相似。
Spark内置的expression function 得到了很大的增强,完成了100多个这么的常用函数,例如string, math, unix_timestamp, from_unixtime, to_date等。一起在处理NaN值的一些特性也在增强,例如 NaN = Nan 回来true;NaN大于任何别的值等约定都越来越契合SQL界的规矩了。
用户能够在履行join操作的时分指定把左面的表或许右边的表broadcast出去,因为根据cardinality的估量并不是每次都是很准的,假如用户对数据了解能够直接指定哪个表更小然后被broadcast出去。
Hive模块最大的改变是支撑衔接Hive 1.2版别的metastore,一起支撑metastore partition pruning(经过spark.sql.hive.metastorePartitionPruning=true敞开,默许为false)。因为许多公司的Hive集群都晋级到了1.2以上,那么这个改善关于需要拜访Hive元数据的Spark集群来说十分主要。Spark 1.5支撑能够衔接Hive 0.13, 0.14, 1.0/0.14.1, 1.1, 1.2的metastore。
在External Data Source方面,Parquet的支撑有了很大的加强。Parquet的版别晋级到1.7;更快的metadata discovery和schema merging;一起能够读取别的东西或许库生成的非标准合法的parquet文件;以及更快更鲁棒的动态分区刺进。
因为Parquet晋级到1.7,本来的一个主要bug被修正,所以Spark SQL的Filter Pushdown默许改为敞开状况(spark.sql.parquet.filterPushdown=true),能够协助查询过滤掉不必要的IO。
Spark 1.5能够经过指定spark.sql.parquet.output.committer.class参数挑选不一样的output committer类,默许是org.apache.parquet.hadoop.ParquetOutputCommitter,用户能够承继这个类完成自个的output committer。因为HDFS和S3这两种文件存储体系的差异,假如需要向S3里边写入数据,能够运用DirectParquetOutputCommitter,能够有用进步写功率,然后加速Job履行速度。
别的还有一些改动,包含:StructType支撑排序功用;TimestampType的精度减小到1us;Spark如今的checkpoint是根据HDFS的,从1.5版别开端支撑根据memory和local disk的checkpoint。这种类型的checkpoint功用更快,尽管不如根据HDFS的牢靠,可是关于迭代型机器学习运算仍是很有协助的。
机器学习MLlib
MLlib最大的改变即是从一个机器学习的library开端转向构建一个机器学习作业流的体系,这些改变发生在ML包里边。MLlib模块下如今有两个包:MLlib和ML。ML把悉数机器学习的进程笼统成Pipeline,一个Pipeline是由多个Stage构成,每个Stage是Transformer或许Estimator。
曾经机器学习工程师要花费很多时刻在training model之前的feature的抽取、改换等准备作业。ML供给了多个Transformer,极大进步了这些作业的功率。在1.5版别以后,现已有了25+个feature transformer,其间CountVectorizer, Discrete Cosine Transformation, MinMaxScaler, NGram, PCA, RFormula, StopWordsRemover, and VectorSlicer这些feature transformer都是1.5版别新增加的,做机器学习的兄弟能够看看哪些满意你的需要。
这儿边的一个亮点即是RFormula的支撑,方针是运用户能够把本来用R写的机器学习程序(如今只支撑GLM算法)不必修正直接搬到Spark渠道上来履行。不过如今只支撑会集简略的R公式(包含’.', ‘~’, ‘+’和 ‘-’),社区在接下来的版别中会增强这项功用。
别的不断增加的算法也作为Estimator搬到了ML下面,在1.5版别中新搬过来的有Naive Bayes, K-means, Isotonic Regression等。咱们不要认为仅仅简略的在ML下面供给一个调用相应算法的API,这儿边改换仍是挺多的。例如Naive Bayes本来的模型别离用Array[Double>和Array[Array[Double]]来存储pi和theta,而在ML下面新的API里边运用的是Vector和Matrix来存储。从这也能够看出,新的ML框架下一切的数据源都是根据DataFrame,一切的模型也尽量都根据Spark的数据类型标明。在ML里边的public API下基本上看不到对RDD的直接操作了,这也与Tungsten项目的规划方针是共同的。
除了这些既有的算法在ML API下的完成,ML里边也增加了几个新算法:
MultilayerPerceptronClassifier(MLPC) 这是一个根据前馈神经网络的分类器,它是一种在输入层与输出层之间富含一层或多层隐含结点的具有正向传达机制的神经网络模型,中心的节点运用sigmoid (logistic)函数,输出层的节点运用softmax函数。输出层的节点的数目标明分类器有几类。MLPC学习进程中运用BP算法,优化疑问笼统成logistic loss function并运用L-BFGS进行优化。
MLlib包里边增加了一个频频项发掘算法PrefixSpan,AssociationRules能够把FreqItemset生成相关式规矩。
在MLlib的核算包里边完成了Kolmogorov–Smirnov查验,用以查验两个经历散布是不是不一样或一个经历散布与另一个抱负散布是不是不一样。
别的还有一些现有算法的增强:LDA算法,决策树和ensemble算法,GMM算法。
ML里边的多个分类模型如今都支撑猜测成果的概率而不像曩昔只支撑猜测成果,像LogisticRegressionModel, NaiveBayesModel, DecisionTreeClassificationModel, RandomForestClassificationModel, GBTClassificationModel等,别离运用predictRaw, predictProbability, predict别离能够得到初始猜测、概率猜测和最终的分类猜测。一起这些分类模型也支撑经过设置thresholds指定各个类的阈值。
RandomForestClassificationModel和RandomForestRegressionModel模型都支撑输出feature importance
GMM EM算法完成了当feature维度或许cluster数目比较大的时分的散布式矩阵求逆核算。试验标明当feature维度>30,cluster数目>10的时分,这个优化功用进步显着。
关于LinearRegressionModel和LogisticRegressionModel完成了LinearRegressionTrainingSummary和LogisticRegressionTrainingSummary用来记载模型练习进程中的一些核算目标。
1.5版别的Python API也在不断加强,不断增加的算法和功用的Python API基本上与Scala API对等了。此外在tuning和evaluator上也有增强。
其它
从1.5开端,Standalone, YARN和Mesos三种布置方法悉数支撑了动态资本分配。
SparkR支撑运行在YARN集群上,一起DataFrame的函数也供给了一些R个性的别号,能够下降了解R的用户的搬迁本钱。
在Streaming和Graphx方面也有十分大的改善,在这儿不在逐个赘述