Spark SQL --- 性能调优
3. 性能调优
对于有一定计算量的Spark作业来说,可能的性能改进的方式,不是把数据缓存在内存里,就是调整一些开销较大的选项参数。
3.1 在内存中缓存数据
Spark SQL可以通过调用SQLContext.cacheTable(“tableName”)或者DataFrame.cache()把tables以列存储格式缓存到内存中。随后,Spark SQL将会扫描必要的列,并自动调整压缩比例,以减少内存占用和GC压力。你也可以用SQLContext.uncacheTable(“tableName”)来删除内存中的table。
你还可以使用SQLContext.setConf 或在SQL语句中运行SET key=value命令,来配置内存中的缓存。
属性名 | 默认值 | 含义 |
---|---|---|
spark.sql.inMemoryColumnarStorage.compressed | true | 如果设置为true,Spark SQL将会根据数据统计信息,自动为每一列选择单独的压缩编码方式。 |
spark.sql.inMemoryColumnarStorage.batchSize | 10000 | 控制列式缓存批量的大小。增大批量大小可以提高内存利用率和压缩率,但同时也会带来OOM(Out Of Memory)的风险 |
3.2 其他配置选项
以下选项也可以用于调整查询执行的性能。随着自动执行更多优化,这些选项可能会在将来的版本中弃用。
物业名称 | 默认 | 含义 |
---|---|---|
spark.sql.files.maxPartitionBytes | 134217728(128 MB) | 读取文件时打包到单个分区中的最大字节数。 |
spark.sql.files.openCostInBytes | 4194304(4 MB) | 可以同时扫描打开文件的估计成本(以字节数衡量)。将多个文件放入分区时使用。最好高估一下,然后,具有较小文件的分区将比具有较大文件的分区(首先安排)更快。 |
spark.sql.broadcastTimeout | 300 | 广播加入中广播等待时间的秒数超时 |
spark.sql.autoBroadcastJoinThreshold | 10485760(10 MB) | 配置表的最大大小(以字节为单位),该表在执行联接时将广播到所有工作程序节点。通过将此值设置为-1,可以禁用广播。请注意,当前仅ANALYZE TABLE COMPUTE STATISTICS noscan运行命令的Hive Metastore表支持统计信息 。 |
spark.sql.shuffle.partitions | 200 | 配置在对联接或聚合进行数据混排时要使用的分区数。 |
3.3 SQL查询的广播提示
所述BROADCAST提示导向火花与另一个表或视图接合它们时广播的每个指定的表。当Spark确定连接方法时,即使统计数据高于配置,还是首选广播哈希连接(即BHJ)spark.sql.autoBroadcastJoinThreshold。当指定了连接的两端时,Spark广播统计信息较少的一方。注意Spark不能保证始终选择BHJ,因为并非所有情况(例如完全外部联接)都支持BHJ。当选择广播嵌套循环联接时,我们仍然遵守提示。
参考
https://spark.apache.org/docs/latest/sql-programming-guide.html