Spark 1.6今天发布
今天,我们很开心的宣布发布Apache Spark 1.6!这也是开源社区开发的一个里程碑,2015年贡献spark的代码是1000行,是2014一整年的两倍,见下图。
接下来揭开Spark 1.6新发布的功能。
Spark 1.6包含了超过1000个patches,在这里我们主要展示三个方面的主题:新的Dataset API,性能提升(读取Parquet 50%的性能提升,自动内存管理,streaming state management十倍的性能提升),以及大量新的机器学习和统计分析算法。
性能提升
根据2015年Spark官方调研发现,91%的用户觉得性能提升是Spark最重要的方面。因此,性能优化是Spark开发一直的关注点。
读取Parquet性能提升:Parquet是在Spark使用中最常用的数据格式。Parquet读取性能对海里数据应用有着极其重大的影响。在过去,Spark中读取Parquet依赖于Parquet的(parquert-mr)MR来读取并解析Parquet文件。当我们优化Spark程序时,你会发现太多的时间消耗在从Parquet列解析成记录集的过程中。而在Spark 1.6中我们采用一种新型的Parquet reader读取器,它可以避开”parquert-mr”式的记录集解析,并使用更加优化的字节码路径来解析Parquet的schemas。在我们的基准测试中可以发现,新型的Parquet reader读取器读取Parquet文件有 50%的性能提升(从2.9 million/秒提升到4.5million/秒)。
自动内存管理:Spark 1.6另外一个性能提升是在内存管理方面。在Spark 1.6之前,Spark静态地把内存划分成两部分:execution memory 和 cache memory。Execution memory主要用来做sort,hash和shuff。Cache memory是用来缓存热点数据的。Spark 1.6引进新的内存管理机制能自动调节这两种内存的区域,运行时自动增长,回收时根据执行的应用适时进行。
这意味着在无需用户干预的情况下使用join和aggregation操作时内存的自适应有大幅的提升。
对于读取Parquet和自动内存管理两种性能提升也不需要开发者更改老版本的代码。
streaming state management十倍的性能提升:State management是Spark Streaming应用开发里重要的功能,经常用来保存聚合信息或session信息。通过社区开发者的反馈,我们重新设计了state management API,并引入 mapWithState API (可随updates的数目线性扩展)。这意味着能更有效的跟踪增量变化,而不是每次update都要对数据进行一次全scan。我们已经创建了一个 notebook 来展示怎么使用这个new feature,后面会发blog进一步对这个功能进行详细讲解。
Dataset API
在今年早些时候我们引入DataFrame,它可以提供high-level functions让Spark更好的处理数据结构和计算。这让 Catalyst optimizer 和 Tungsten execution engine 自动加速大数据分析。
发布DataFrame之后我们收到了很多反馈,其中一个主要的是大家反映缺乏编译时类型安全。为了解决这个问题,我们采用新的Dataset API (DataFrame API的类型扩展)。
Dataset API扩展DataFrame API支持静态类型和运行已经存在的Scala或Java语言的用户自定义函数。对比传统的RDD API,Dataset API提供更好的内存管理,特别是在长任务中有更好的性能提升,请参见 blog 。
新的数据科学功能
机器学习管道持久化:现在许多机器学习的应用采用Spark的ML pipeline功能来构建机器学习pipelines。老版本中,如果想在外部存储pipeline,需要用户自己完成持久化代码部分。在Spark 1.6中已经提供了对应的function来存储和重新加载pipelines,并把先前的models应用到新的数据中。
大量新的机器学习和统计分析算法:
这次发布增加了以下算法:
· 无偏估计统计
· 生成分析
· 最小二乘法的归一化
· 二分k均值聚类算法
· 在线假设检验
· LDA算法
· 支持R语言的广义线性模型的统计
· 公式的交互
· 支持R语言的广义线性模型的权重
· LIBSVM数据源
· 支持非标准的JSON数据
这篇blog只显示了这次发布中的主要功能,我们也编译了一个更详细的 release notes 。