Spark SQL性能優化

==> 在內存中緩存數據

    ---> 性能調優主要是將數據放入內存中操作

    ---> 使用例子:

// 從 Oracle 數據庫中讀取數據,生成 DataFrame
val oracleDF = spark.read.format("jdbc")
        .option("url", "jdbc:oracle:thin:@192.168.10.100:1521/orcl.example.com")
        .option("dbtable", "scott.emp")
        .option("user", "scott")
        .option("password", "tiger").load
        
// 將 DataFrame 註冊成表
oracleDF.registerTempTable("emp")

// 執行查詢,並通過 Web Console 監控執行的時間
spark.sql("select * from emp").show

// 將表進行緩存,並查詢兩次,通過 Web Console 監控執行的時間
spark.sqlContext.cacheTable("emp")

// 清空緩存
spark.sqlContext.cacheTable("emp")
spark.sqlContext.clearCache


==> 優化相關參數

    ---> spark.sql.inMemoryColumnarStorage.compressed

        ---- 默認值: true

        ---- Spark SQL 將會基於統計信息自動地爲每一列選擇一種壓縮編碼方式


    ---> spark.sql.inMemoryColumnarStorage.batchSize

        ---- 默認值: 10000

        ---- 緩存批處理大小, 較大的批處理可以提高內存利用率和壓縮率,但同時也會帶來 OOM(Out Of Memory)的風險

    ---> spark.sql.files.maxPartitionBytes

        ---- 默認值: 128M

        ---- 讀取文件時單個分區可容納的最大字節數

    ---> spark.sql.files.openCostinBytes

        ---- 默認值: 4M

        ---- 打開文件的估算成本,按照同一時間能夠掃描的字節數來測量,當往一個分區寫入多個文件時會使用,高估相對較好,這樣小文件分區將會比大文件分區速度更快(優先調度)

    ---> spark.sql.autoBroadcastJoinThreshold

        ---- 默認值:10M

        ---- 用於配置一個表在執行 join 操作時能夠廣播給所有 worker 節點的最大字節大小,通地將這個值設置爲-1可以禁用廣播

        ---- 注意:當前 數據統計僅支持已經運行了 ANALYZE TABLE <tablename> COMPUTE STATISTICS noscan 命令的 Hive Metastore 表

    ---> spark.sql.shuffle.partitions

        ---- 默認值: 200

        ---- 用於配置 join 或聚合操作混洗(shuffle)數據時使用的分區數



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章