對(duì)一些SparkSQL任務(wù),可以通過(guò)緩存數(shù)據(jù)、調(diào)優(yōu)參數(shù)、增加并行度提升性能
緩存數(shù)據(jù)
sqlContext.cacheTable("tableName")或dataFrame.cache()構(gòu)建一個(gè)內(nèi)存中的列格式緩存
使用sqlContext.uncacheTable("tableName")移除緩存
緩存設(shè)置
可以通過(guò)sqlContext.setConf或在SQL中運(yùn)行SET key=value
setConf("spark.sql.inMemoryColumnarStorage.compressed","true") ,為每列自動(dòng)選擇壓縮碼
setConf("spark.sql.inMemoryColumnarStorage.batchSize","1000") ,列式緩存的批處理大小,大批量可以提升內(nèi)存使用率和壓縮了,但是緩存是會(huì)有溢出風(fēng)險(xiǎn)
調(diào)優(yōu)參數(shù)
| 參數(shù) | 默認(rèn)值 | 解釋 |
|---|---|---|
| spark.sql.autoBroadcastJoinThreshold | 10485760(10M) | Join操作時(shí),要被廣播的表的最大字節(jié)數(shù),-1為禁止廣播 |
| spark.sql.tungsten.enabled | true | 開(kāi)啟tungsten優(yōu)化 |
| spark.sql.shuffle.partitions | 200 | shuffle數(shù)據(jù)時(shí),可用分區(qū)數(shù) |
| spark.sql.planner.externalSort | true | 根據(jù)需要執(zhí)行Sort溢出到磁盤上,否則在每個(gè)分區(qū)內(nèi)存中 |
增加并行度
Spark采用內(nèi)存列式存儲(chǔ),實(shí)際執(zhí)行查詢效率很高,相對(duì)而言數(shù)據(jù)加載階段耗時(shí)較長(zhǎng),合理設(shè)置并行度提升文件加載效率
Spark的并行度指的是什么?
spark作業(yè)中,各個(gè)stage的task的數(shù)量,也就代表了spark作業(yè)在各個(gè)階段stage的并行度
如何提高并行度?
可以參考Spark調(diào)優(yōu)