SparkThiftServer 資源動態分配

背景

在做的項目BI 使用的是sparkJDBC來去查詢和處理數據。依賴的SparkThiftServer這一塊東西還是挺多的,今天來講一下資源動態分配。有了資源動態分配的功能,使其在處理大數據量或者小數據量的時候,都可以處理,而且相對來說不用一直佔用較多資源。
本文大部分參考官方文檔,小部分是自己實際測試得出的結論。
官方文檔地址:https://spark.apache.org/docs/latest/job-scheduling.html#graceful-decommission-of-executors

前置條件

使用動態資源分配的前置條件有兩個

  • 1、設置 spark.dynamicAllocation.enabled 爲true
    設置 spark.shuffle.service.enabled 爲true
  • 2、需要在hadoop 集羣配置文件修改,以及需要將spark shuffle的jar 放到NodeManager(目前只對yarn集羣說明,因爲最常用)
    參照的官網地址:https://spark.apache.org/docs/latest/running-on-yarn.html#configuring-the-external-shuffle-service
    (這塊不詳細說明,我們這裏集羣配置是好的,我這塊沒有實際操作過,都是公司集羣,我這塊就不一一說明了)

動態分配的執行機制

執行機制包括申請和廢棄資源即executor

  • 1、申請資源
    申請資源機制爲 當有還有待完成的task在等待時,當等待時長爲spark.dynamicAllocation.schedulerBacklogTimeout(默認爲1S)時,將觸發請求來申請資源。當申請資源後還體有task在等待的時候,將每spark.dynamicAllocation.sustainedSchedulerBacklogTimeout(默認5S)再申請一次。每次申請的資源將成指數型正常,以1,2,4,8往後遞推。
  • 2、刪除資源
    刪除資源這一點,當一個application閒置超過spark.dynamicAllocation.executorIdleTimeout(默認60S)的時候,將多餘的executor移除。
    ######注意
    不幸的事,在驗證的時候刪除資源這一點並沒有驗證出來,一個application在完成之後很快的將executor移除了。我不知道這塊具體是什麼原因。(這邊走的默認的配置) 具體如下圖,一秒鐘就移除了。
    image.png

資源調度機制

1、默認爲FIFO,即先進先出的策略。官網上說當資源過大,後申請的資源會處於等待狀態。

but if the jobs at the head of the queue are large, then later jobs may be delayed significantly.

但是我這邊使用一個20G 資源的表進行測試,然後再去count(1)小表,這一塊照樣是可以運行的,所以這一塊也讓我很困惑。(我本來打算調優至FAIR模式,但是測試完我猶豫了。)

  • 2、FAIR模式
    設置spark.scheduler.mode爲FAIR (FAIR 必須大寫)

參數配置

這一塊需要配置的參數爲

./start-thriftserver.sh
–master yarn
–conf spark.driver.memory=6G
–executor-memory 9G
–executor-cores 3
–conf spark.shuffle.service.enabled=true
–conf spark.dynamicAllocation.enabled=true
–conf spark.dynamicAllocation.minExecutors=2
–conf spark.dynamicAllocation.maxExecutors=7
–conf spark.dynamicAllocation.sustainedSchedulerBacklogTimeout=3s

這一塊不需要設置num-executors ,因爲即使設置了 ,啓動後也會根據這個參數的大小spark.dynamicAllocation.minExecutors,然後移除多餘的 executor

實際應用

1、實際應用階段的話, spark.dynamicAllocation.sustainedSchedulerBacklogTimeout 這個參數可以適當的調小,因爲這是資源不夠申請資源的時間,因爲BI 對於時延還是有一定的要求

  • 2、maxExecutors 的大小應該設置成倍數較好,就是 1+2+4 依次類推
  • 3、spark.dynamicAllocation.minExecutors 根據實際分配的資源以及要處理的數據量有關。這一塊的話,我們這邊設置的–executor-memory 9G 和–executor-cores 3 spark.dynamicAllocation.minExecutors=2 就可以保證在數據量在1個G 是不需要去申請資源的。當然了,這一塊還是要根據實際情況而定。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章