Spark SQL的性能
Spark SQL提供对表的缓存功能,可以极大地改善程序的性能。Spark SQL采用在内存中的列式存储来缓存数据,这样的结构不仅可以有效地利用缓存空间,还使得在缓存之后的后续查询可以仅依赖于数据的子集。
Spark SQL还采用了一种“pull down”的方式将查询的一部分往下拉到查询引擎中,这样可以避免读取数据库的整个Dataset。
Spark SQL还提供了与性能调优有关的选项:
选项 | 默认值 | 说明 |
---|---|---|
spark.sql.codegen | false | 若设置为true,Spark SQL会将每个查询都编译为Java字节码。当查询量较大时,这样的设置能够改进查询性能,但不适用于查询量小的情形。 |
spark.sql.inMemoryColumnarStorage.compressed | true | 设置为true时,会自动压缩内存中的列式存储。 |
spark.sql.inMemoryColumnarStorage.batchSize | 1000 | 需要视存储数据量而定,若此值设置过大,可能导致内存溢出。 |
spark.sql.parquet.compression.codec | snappy | 可以设置多种编码方式,除了snappy外,还可以设置为uncompressed,gzip和lzo。 |
这些选项可以放在配置文件中,也可以以编程方式设置SQLContext。例如:
val sqlContext = new SQLContext(sc)
sqlContext.setConf("spark.sql.codegen", true)
sqlContext.setConf("spark.sql.inMemoryColumnarStorage.batchSize", "10000")
注意,当把spark.sql.codegen设置为true时,由于需要初始化编译器,在第一次执行查询时,可能会影响查询性能。