目录
二:为什么有Hive,Shark,Spark SQL等一类的组件?
1、内存列存储(in-memory columnar storage)
2、字节码生成技术(byte-code generation)
一:顺序图谱
Hadoop.Hive => Shark => Spark SQL
二:为什么有Hive,Shark,Spark SQL等一类的组件?
意义:让那些不熟悉Java,无法深入进行MapReduce编程的数据分析师,能够使用他们熟悉的关系型数据库的SQL模型,来操作HDFS上的数据————数据仓库的建模和建设,对数据仓库中的数据进行统计和分析
(1)Hive
底层基于MapReduce,而MapReduce的shuffle又是基于磁盘的 => 性能异常低下。进场出现复杂的SQL ETL,要运行数个小时,甚至数十个小时的情况
(2)Shark
依赖了Hive的语法解析器、查询优化器等组件
修改了内存管理、物理计划、执行三个模块,底层使用Spark的基于内存的计算模型
(3)Spark SQL
1、支持多种数据源:Hive、RDD、Parquet、JSON、JDBC等。
2、多种性能优化技术:in-memory columnar storage、byte-code generation、cost model动态评估等。
3、组件扩展性:对于SQL的语法解析器、分析器以及优化器,用户都可以自己重新开发,并且动态扩展
三:Spark SQL的性能优化技术详解
1、内存列存储(in-memory columnar storage)
内存列存储意味着,Spark SQL的数据,不是使用Java对象的方式来进行存储,而是使用面向列的内存存储的方式来进行存储。也就是说,每一列,作为一个数据存储的单位。从而大大优化了内存使用的效率。采用了内存列存储之后,减少了对内存的消耗,也就避免了gc大量数据的性能开销。
事例:在大数据量中,面向纵列比横列而言,大大的减少了对象的产生,从而大大减少了因为多个对象而产生的指针占用字节和因对象过多导致的GC性能开销
2、字节码生成技术(byte-code generation)
Spark SQL在其catalyst模块的expressions中增加了codegen模块,对于SQL语句中的计算表达式,比如select num + num from table这种的sql,就可以使用动态字节码生成技术来优化其性能。
事例:https://blog.csdn.net/bbb5b555/article/details/84811829
虚函数的调用与流水线的打断
3、Scala代码编写的优化
对于Scala代码编写中,可能会造成较大性能开销的地方,自己重写,使用更加复杂的方式,来获取更好的性能。比如Option样例类、for循环、map/filter/foreach等高阶函数,以及不可变对象,都改成了用null、while循环等来实现,并且重用可变的对象。
例子:(减少不必要情况的判断及过滤,更专注,从而获得更高的性能)
SELECT * FROM TABLE WHERE 1=1 => SELECT * FROM TABLE