Spark2 的 Whole-stage Code Generation、Vectorization 技术 与Spark1 的 Volcano Iterator Model 技术 的对比分析
目录
- 1、Spark1 的 Volcano Iterator Model 技术
- 2、Spark2 的 Whole-stage Code Generation、vectorization 技术
- 3、总结
Spark 1.x会使用一种最流行、最经典的查询求值策略,该策略主要基于 Volcano Iterator Model。在这种模型中,一个查询会包含多个operator,每个operator都会实现 一个接口,提供一个next()方法,该方法返回operator tree中的下一个operator。让每一个operator都实现一个iterator接口, 可以让查询引擎优雅的组装任意operator在一起,而不需要查询引擎去考虑每个operator 具体的一些处理逻辑,比如数据类型等。Vocano Iterator Model也因此成为了数据库SQL执行引擎领域内内的20年中最流行的一种标准。而且Spark SQL最初的SQL执行引擎也是基于这个思想来实现的。
2、Spark2 的 Whole-stage Code Generation、vectorization 技术
【Spark2 的 Whole-stage Code Generation、Vectorization 技术 与Spark1 的 Volcano Iterator Model 技术 的对比分析】(1)Whole-stage Code Generation:Spark第二代Tungsten引擎的新技术,whole-stage code generation。通过该技术,SQL语句编译后的operator-treee中,每个operator执行时就不是自己来执行逻辑了,而是通过whole-stage code generation技术,动态生成代码,生成的代码中会尽量将所有的操作打包到一个函数中,然后再执行动态生成的代码。如果只是一个简单的查询,那么Spark会尽可能就生成一个stage,并且将所有操作打包到一起。但是如果是复杂的操作,就可能会生成多个stage。 从Spark 1.1版本开始,就一直听说有code generation类的feature引入,这跟spark 2.0中的这个技术有什么不同呢。实际上在spark 1.x版本中,code generation技术仅仅被使用在了expression evoluation方面(比如a + 1),即表达式求值,还有极其少数几个算子上(比如filter等)。而spark 2.0中的whole-stage code generation技术是应用在整个spark运行流程上的。
(2)vectorization : 对于很多查询操作,whole-stage code generation技术都可以很好地优化其性能。但是有一些特殊的操作,却无法很好的使用该技术,比如说比较复杂一些操作,如parquet文件扫描、csv文件解析等,或者是跟其他第三方技术进行整合。 如果要在上述场景提升性能,spark引入了另外一种技术,称作“vectorization”,即向量化。向量化的意思就是避免每次仅仅处理一条数据,相反,将多条数据通过面向列的方式来组织成一个一个的batch,然后对一个batch中的数据来迭代处理。每次next()函数调用都返回一个batch的数据,这样可以减少virtual function dispatch的开销。同时通过循环的方式来处理,也可以使用编译器和CPU的loop unrolling等优化特性。这种向量化的技术,可以使用到之前说的3个点中的2个点。即,减少virtual function dispatch,以及进行loop unrolling优化。但是还是需要通过内存缓冲来读写中间数据的。所以,仅仅当实在无法使用whole-stage code generation时,才会使用vectorization技术。
3、总结
问题:whole-stage code generation技术能否保证将spark 2.x的性能比spark 1.x来说提升10倍以上呢?
解答:这是无法完全保证的。虽然说目前的spark架构已经搭载了目前世界上最先进的性能优化技术,但是并不是所有的操作都可以大幅度提升性能的。简单来说,CPU密集型的操作,可以通过这些新技术得到性能的大幅度提升,但是很多IO密集型的操作,比如shuffle过程的读写磁盘,是无法通过该技术提升性能的。在未来,spark会花费更多的精力在优化IO密集型的操作的性能上。
推荐阅读
- spark|spark UDAF根据某列去重求合 distinct sum
- 大数据|spark UDAF 自定义聚合函数 UserDefinedAggregateFunction 带条件的去重操作
- Spark 写入 MySQL 乱码问题
- SCD|一种基于SparkSQL的Hive数据仓库拉链表缓慢变化维(SCD2+SCD1)的示例实现
- spark算子--action篇
- 大数据|Spark调优解决方案(一)之提交任务时合理分配资源
- spark|spark2.1 新特性
- Spark Aggregate算子