將Zeppelin分享給多個人同時使用的策略

Zeppelin在0.6的版本以後開始支援了認證機制,可以允許多個人同時登入Zeppelin來享用Zeppelin跟Spark的資源

當初原本想說就這樣放出去給別人使用,但後來很快就出了問題,Zeppelin的interpreter預設是shared模式,所有使用者會去共享interpreter instance的資源.所以會出現大家一起搶資源的情況,也就是單一個人在執行job的時候,其他人勢必要等待
https://zeppelin.apache.org/docs/latest/interpreter/spark.html#interpreter-setting-option

如果只是要使用spark的SQL資源的話倒是有個現成的簡單解決方案,到interpreter的spark設定將zeppelin.spark.concurrentSQL設定成ture就行了.不過今天我遇到的問題沒這麼簡單,我希望所有使用者都可以不被互相影響的使用Zeppelin.而後我稍微研究了一下zeppelin interpreter的其他兩個模式

  • scoped模式: interpter的instance可以並行處理,但是sparkcontext會被所有instance共享

    • 優點:相對節省資源,假設有N個Notebook同時在運行Spark, R, Python, 那就會有 Spark * 1 + R * N + Python * N 也就是約2N+1個instance同時在執行
    • 缺點:大家在同一艄船上,一個人把sparkcontext給搞掛還是stop,其他所有人都會一起遭殃
  • isolated模式: 所有的Notebook有自己獨立的process在處理

    • 優點:完全獨立的環境,每個notebook有自己獨立的資源
    • 缺點:耗資源,假設有N個Notebook同時在運行Spark, R, Python, 那就會有 Spark * N + R * N + Python * N 也就是約3N個instance同時在執行

以實務面上來說scoped模式是不可行的,我最後選用了isolated去其他服務給我的使用者.
但後來遇到另一個問題,由於我是使用Yarn-client模式去跑zeppelin,每個使用者的作業會一直掛在yarn上面不放掉
假設一個使用者固定開給他30個yarn container,有30個使用者就會同時吃掉900個container,這會耗費掉許多無用的資源

後來想到一個替代方案就是寫一個監控程式將閒置過久的Spark Job直接用yarn api去kill掉,不過這延伸出另外一個問題,使用者的spark context沒辦法再使用了,如果一旦呼叫就會出現如下錯誤:Cannot call methods on a stopped SparkContext.

現階段暫時想不到一個漂亮的解法,只能夠過重開Zeppelin interpreter去重啟SparkContext,但這樣一來就會讓其他無辜的使用者遭殃,所以用監控程式去砍掉閒置job的想法也沒辦法直接使用.

後來想到可以用動態分配Spark資源的方式去節約資源,再搭配監控程式去砍掉閒置過久的zeppelin job
雖說稱不上一個完美方案,但現階段也足夠應付需求了

新增Spark設定如下

啟動spark動態分配

  • spark.dynamicAllocation.enabled=true
  • spark.shuffle.service.enabled=true

設定兩分鐘閒置就自動回收,cache時間為idle的兩倍

  • spark.dynamicAllocation.executorIdleTimeout=120
  • spark.dynamicAllocation.cachedExecutorIdleTimeout=240

設定每個使用者可使用資源

  • spark.dynamicAllocation.initialExecutors=2
  • spark.dynamicAllocation.minExecutors=0
  • spark.dynamicAllocation.maxExecutors=100

修改YANR設定

  • yarn.nodemanager.aux-services=mapreduce_shuffle,spark_shuffle
  • yarn.nodemanager.aux-services.spark_shuffle.class=org.apache.spark.network.yarn.YarnShuffleService

09/10

承上
後來在Zeppelin的JIRA翻到0.7以後的版本會增加針對單一notebook重啟的功能
https://issues.apache.org/jira/browse/ZEPPELIN-1306
這樣kill yarn job造成spark context 失效的問題或多或少可以有個解決方案吧

11/08

最近發現vcore的數量設太多的時候,會導致YARN container吃的資源加倍,這樣能用的Container就變少了
後來決定把spark.executor.cores設成1,這樣可以比較降低單一container所占用的資源

comments powered by Disqus