Spark 2.x管理與開發-Spark SQL-性能優化(一)在內存中緩存數據(最常用最有效)
性能調優主要是將數據放入內存中操作。
通過spark.cacheTable("tableName")或者dataFrame.cache()。使用spark.uncacheTable("tableName")來從內存中去除table。
Demo案例:
1.從Oracle數據庫中讀取數據,生成DataFrame
val oracleDF = spark.read.format("jdbc")
.option("url","jdbc:oracle:thin:@192.168.88.101:1521/orcl.example.com")
.option("dbtable","scott.emp")
.option("user","scott")
.option("password","tiger").load
2.將DataFrame注冊成表:
oracleDF.registerTempTable("emp")
3.執行查詢,並通過Web Console監控執行的時間
spark.sql("select * from emp").show
4.將表進行緩存,並查詢兩次,並通過Web Console監控執行的時間
spark.sqlContext.cacheTable("emp")
5.清空緩存:
spark.sqlContext.cacheTable("emp")
spark.sqlContext.clearCache
**********自己操作*********
1)概述:
與RDD相似,
在內存中緩存表的數據
把數據緩存到內存中,可以通過直接讀取內存中的值來提高性能。
SparkSession.sqlContext.cacheTable(“要緩存的表名”)
----------------------------------------------------------
2)開始操作:
注意:
因為當前操作是要Spark讀取MySQL中的數據,所以在啟動Spark之前要將之前連接Hive時用的和Hive相關的配置文件都移走(我這里就將這些文件移動到了tmp_files下的spark-hiveHA-hadoopHA目錄下了)
(1)啟動
接下來啟動Spark
啟動Spark-shell:
[root@bigdata111 bin]# ./spark-shell --master spark://bigdata111:7077 --jars /usr/local/mysql-connector-java-8.0.11.jar --driver-class-path /usr/local/mysql-connector-java-8.0.11.jar
(2)讀取MySQL數據
scala> val mysqlDF=spark.read.format("jdbc").option("url","jdbc:mysql://192.168.212.1:3306/xinrong?serverTimezone=UTC&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true").option("user","root").option("password","123456").option("dbtable","student").option("driver","com.mysql.jdbc.Driver").load
(3)建臨時的表
scala> mysqlDF.registerTempTable("student")
warning: there was one deprecation warning; re-run with -deprecation for details
這和視圖的創建類似,只是視圖里沒有數據,而表中有數據
(4)開始查詢
scala> spark.sql("select * from student").show
(5)緩存
scala> spark.sqlContext.cacheTable("student")
和RDD類似,這步是標識student表要緩存
再次查詢,依然從MySQL中讀取數據,這次是將結果存入了緩存中
效果和剛才一樣:
第三次查詢,是從緩存中讀取的結果數據,效果同上
現在查看Spark的可視化頁面,可以看到內存中緩存數據確實可將性能優化很多:
(6)清空緩存
spark.sqlContext.clearCache