SparkSQL性能调优

最近在学习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条压缩记录时也基本无法获得更高的压缩比了。

你可能感兴趣的:(数据挖掘)