1.將數(shù)據(jù)緩存到內(nèi)存
性能調(diào)優(yōu)主要是將數(shù)據(jù)放入內(nèi)存中逃呼,以加快處理數(shù)據(jù)的速度疗疟。通過spark.cacheTable(“tableName”)或者dataFrame.cache()可以將表緩存到內(nèi)存梭冠;使用spark.uncacheTable(“tableName”)可以從內(nèi)存中刪除表。
案例:將從MySQL中讀取到的數(shù)據(jù)緩存到內(nèi)存以加速查詢镰矿。
spark-shell啟動時連接MySQL:
# spark-shell --master spark://localhost:7077
--jars /root/trainings/apache-hive-1.2.2-bin/lib/mysql-connector-java-5.1.46-bin.jar
--driver-class-path /root/trainings/apache-hive-1.2.2-bin/lib/mysql-connector-java-5.1.46-bin.jar
(1)從MySQL數(shù)據(jù)庫中讀取數(shù)據(jù)生成DataFrame
scala> val usersDF = spark.read.format("jdbc")
.option("url","jdbc:mysql://localhost:3306/spark")
.option("dbtable","tblUsers")
.option("user","root")
.option("password","123456")
.load
usersDF: org.apache.spark.sql.DataFrame = [uID: int, uName: string ... 1 more field]
(2)將usersDF注冊成表tblUsers
scala> usersDF.registerTempTable("tblUsers")
warning: there was one deprecation warning; re-run with -deprecation for details
(3)執(zhí)行第一次查詢
scala> spark.sql("select * from tblUsers").show
(4)將表進(jìn)行緩存(標(biāo)記),并執(zhí)行第二次查詢(觸發(fā)緩存)
scala> spark.sqlContext.cacheTable("tblUsers")
scala> spark.sql("select * from tblUsers").show
(5)執(zhí)行第三次查詢
scala> spark.sql("select * from tblUsers").show
(6)通過Web Console查看三次查詢的執(zhí)行時間
在瀏覽器地址欄輸入Spark Master的地址:http://192.168.126.110:8080饭冬,在Running Applications中點擊Spark shell應(yīng)用,打開應(yīng)用詳情頁面:
可以看到?jīng)]有加入緩存時查詢的時間遠(yuǎn)大于加入緩存后的查詢時間揪阶,即前兩次的時間的時間遠(yuǎn)大于第三次的時間昌抠。
(7)清空緩存
scala> spark.sqlContext.cacheTable("tblUsers")
18/07/10 21:33:46 WARN execution.CacheManager: Asked to cache already cached data.
scala> spark.sqlContext.clearCache
2.性能優(yōu)化相關(guān)參數(shù)
2.1緩存相關(guān)的參數(shù)
- spark.sql.inMemoryColumnarStorage.compressed:默認(rèn)為true,Spark SQL將會基于統(tǒng)計信息自動為每一列選擇一種壓縮編碼方式遣钳;
- spark.sql.inMemoryColumnarStorage.batchSize:默認(rèn)值10000扰魂,緩存批處理大小。緩存數(shù)據(jù)時蕴茴,較大的批處理大小可以提高內(nèi)存利用率和壓縮率劝评,但同時也會帶來內(nèi)存OOM風(fēng)險;
2.2其他性能相關(guān)的配置
- spark.sql.files.maxPartitionBytes:默認(rèn)值128MB倦淀,讀取文件時單個分區(qū)可容納的最大字節(jié)數(shù)蒋畜;
- spark.sql.files.openCostInBytes:默認(rèn)值4MB,打開文件的估算成本撞叽,按照同一時間能夠掃描的字節(jié)數(shù)來測量姻成。當(dāng)往一個分區(qū)寫入多個文件時會使用。高估更好愿棋,這樣的話小文件將會比大文件分區(qū)更快(先被調(diào)用)科展;
- spark.sql.autoBroadcastJoinThreshold:默認(rèn)值10MB,用于配置一個表在執(zhí)行join操作時能夠廣播給所有worker節(jié)點的最大字節(jié)大小糠雨。通過將這個值設(shè)置為-1可以禁用廣播才睹。注意,當(dāng)前數(shù)據(jù)統(tǒng)計僅支持已經(jīng)運行了ANALYZE TABLE <tablename> COMPUTE STATISTICS noscan命令的Hive Metastore表甘邀;
- spark.sql.shuffle.partitons:默認(rèn)值200琅攘,用于配置join或者聚合操作的shuffle操作使用的分區(qū)數(shù)。
調(diào)優(yōu)參數(shù)除了默認(rèn)值之外松邪,沒有什么固定值可供參考坞琴,全憑在實際生產(chǎn)環(huán)境中經(jīng)驗來設(shè)置,調(diào)優(yōu)是一項長期的經(jīng)驗積累過程逗抑。本節(jié)介紹僅供參考剧辐。