最近在学习spark时,觉得Spark SQL性能调优比较重要,所以自己写下来便于更过的博友查看,欢迎大家指导。

在spark中,Spark SQL性能调优只要是通过下面的一些选项进行优化的:

1 spark.sql.codegen 默认值为false,当它设置为true时,Spark SQL会把每条查询的语句在运行时编译为java的二进制代码。这有什么作用呢?它可以提高大型查询的性能,但是如果进行小规模的查询的时候反而会变慢,就是说直接用查询反而比将它编译成为java的二进制代码快。所以在优化这个选项的时候要视情况而定。

2 spark.sql.inMemoryColumnStorage.compressed 默认值为false 它的作用是自动对内存中的列式存储进行压缩

3 spark.sql.inMemoryColumnStorage.batchSize 默认值为1000 这个参数代表的是列式缓存时的每个批处理的大小。如果将这个值调大可能会导致内存不够的异常,所以在设置这个的参数的时候得注意你的内存大小

4 spark.sql.parquet.compressed.codec 默认值为snappy 这个参数代表使用哪种压缩编码器。可选的选项包括uncompressed/snappy/gzip/lzo

uncompressed这个顾名思义就是不用压缩的意思

                          下面是总结的几种压缩选项的特点

格式

可分割

平均压缩速度

文本文件压缩效率

Hadoop压缩编解码器

纯java实现

原生

备注

snappy


非常快


org.apache.hadoop.io.

compress.SnappyCodec

 



Snappy有纯java



的移植版,



但是在Spark/



Hadoop中



不能用

gzip




org.apache.hadoop.io.

compress.GzipCodec




lzo


非常快

中等

org.apache.hadoop.io.

compress.LzoCodec



需要在每个节点上

安装LZO

当然在设置上面这些参数的时候需要给予特别的考量。第一spark.sql.codegen,这个选项可以让Spark SQL把每条查询语句在运行前编译为java二进制代码,由于生成了专门运行指定查询的代码,codegen可以让大型查询或者频繁重复的查询明显变快,然而在运行特别快(1-2秒)的即时查询语句时,codegen就可能增加额外的开销(将查询语句编译为java二进制文件)。

codegen还是一个实验性的功能,但是在大型的或者重复运行的查询中使用codegen。

调优时可能还需要考虑第二个选项是spark.sql.inMemoryColumnarStorage.batchSize,在缓存SchemaRDD(Row RDD)时,Spark SQL会安照这个选项设定的大小(默认为1000)把记录分组,然后分批次压缩。

太小的批处理会导致压缩比过低,而太大的话,比如当每个批处理的数据超过内存所能容纳的大小时,也有可能引发问题。

如果你表中的记录比价大(包含数百个字段或者包含像网页这样非常大的字符串字段),就可能需要调低批处理的大小来避免内存不够(OOM)的错误。如果不是在这样的场景下,默认的批处理 的大小是比较合适的,因为压缩超过1000条压缩记录时也基本无法获得更高的压缩比了。