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时,由于需要初始化编译器,在第一次执行查询时,可能会影响查询性能。

results matching ""

    No results matching ""