spark2.0 新特性总结

版权声明:本文为博主原创文章,未经博主允许不得转载。违者必究,究也没用! https://blog.csdn.net/young_0609/article/details/80934720

新特性:

1,用sparksession实现hivecontext和sqlcontext统一

2,whole-stage code generation,大幅提高计算性能,因为把物理计划变成硬编码,每秒处理的sql中的数据量增加十倍,即对物理执行的多次调用转化为代码for循环,蕾丝hardcode方式,减少执行的函数调用次数,当数据记录多时,这个调用次数时很大的。

3,合并dataframe和datasets,1.6的dataset包含了dataframe的功能,这样两者存在很大冗余,所以2.0将两者统一,保留dataset api,把dataframe表示为dataset[Row],即dataset的子集。dataframe是sql查询结果rdd的抽象类,相当于java里的resultset。

4,结构化流计算,sparkstreaming是把流计算看成一个一个的离线计算来完成流计算,提供一套dstream的流api,相比其他的流计算,sparkstreaming的优点是容错行和吞吐量上有优势,在2.0以前的版本,用户在使用时,如果有流计算,又有离线计算,就需要两套api去编写程序,一套是rddapi,一套是dstream api,而且dstream api在易用性上远不如sql或dataframe。为了真正将流计算和离线计算在编程api上统一,同时也让streaming作业能够享受dataframe/dataset上所带来的优势:性能提升和API易用,于是提出了structed streaming,最后我们只需要基于dataframe/dataset可以开发离线计算和流计算的程序,很容易使得spark在api跟业界所说的dataflow来统一离线计算和流计算效果一样。比如在做batch聚合时我们可以写成下面代码:

logs = ctx.read.format("json").open("s3://logs")

logs.groupBy(logs.user_id).agg(sum(logs.time)).write.format("jdbc").save("jdbc:mysql//...")

那么对于流计算时,我们仅仅是调用了dataframe/dataset的不同函数代码,如下:

logs = ctx.read.format("json").stream("s3://logs")

logs.groupBy(logs.user_id).agg(sum(logs.time)).write.format("jdbc").stream("jdbc:mysql//...")

5,sql优化,增加了以前很多不支持的sql语句

6,采用vectorized Parquet decoder读取parquet上数据,以前是一行一行的读取,然后处理,现在改为一次读取4096行记录,不需要没处理一行纪录去调用一次parquet获取记录的方法,而是改为一批去调用一次(spark-12854) 。加上parquet本身是列存储,这个优化使得parquet读取速度提高三倍

7,采用radix sort提高sort的性能(spark-14724)。在某些情况下排序性能可以提高10~20倍

8,使用vectorizedhashmap来代替java的hashmap加速groupby的执行

9,将hive中的window函数用native spark window实现,因为native spark window在内存管理上有优势

10,避免复杂语句中的逻辑相同部分在执行时重复计算

11,压缩算法默认使用lz4

12,mllib里的计算用dataframe-based api代替以前的rdd计算逻辑

13,提供更多的r语言算法

14,使用scala-2.11编译运行

15,在和旧版本的兼容方面,将hive语句解析以及语法移动到core里,在没有hive原数据库和hive依赖包时,我们可以像以前版本使用标准sql一样去使用hivesql语句。

猜你喜欢

转载自blog.csdn.net/young_0609/article/details/80934720