spark jobserver設計[1]--整體架構概覽

      sparkjobserver的設計初衷即"spark as service",將spark作爲一個long running服務並且對外提供rest接口,用戶在不用關心底層配置細節的情況下提交作業至jobserver上運行。目前,jobserver這塊已經承擔了公司大數據平臺後臺的作業運行,進過幾次迭代開發,性能與穩定性已經明顯提升。

      sparkjobserver的特性如下:

      1)  long running服務,對外提供rest接口;

      2) 支持sql、job、python等不同的運行任務;

      3) 可以同時提交到不同的yarn集羣;

      4) 作業日誌記錄執行進度、完善的任務監控;

      5) 支持企業級的Kerberos認證。

      jobserver整體的架構如下所示:

                            

      jobserver整體分爲兩個部分:control端和yarn端,yarn端是真正用於運行服務的地方,spark提交採用cluster模式,yarn端服務隨機運行於不同的節點上,提高了服務的容錯性以及可擴展性;control端接收用戶的任務請求並且選擇可用的yarn服務。

      jobserver的設計採用了資源池的概念,當一個yarn端服務啓動之後,會被自動加入到資源池中以供下一次作業運行選擇,這樣,一個server在運行完作業可以接着運行下一個作業,具體的提交流程如下:

      1) 用戶調用rest接口提交作業至control端,提交的參數包括:作業類型、作業id、用戶id、集羣code、作業內容;

      2) control端根據集羣code查詢當前code對應的server列表中是否有空閒的server,如果有,返回該server對應的地址端口;

      3) 如果當前code對應的列表中沒有可用的server,則會重新提交一個server至yarn中,並且將該server的信息記錄到數據庫中;

      4) 如果提交過程中報錯,則返回錯誤信息給用戶。


      jobserver-control可以提交yarn程序至不同的yarn集羣中,具體的實現方式是,首先需要準備待提交yarn集羣的配置文件,包括hdfs-site.xml、yarn-site.xml、hive-site.xml等,將這些配置文件存放於某個文件夾下、啓動spark-submit之前,指定HADOOP_CONF_DIR和YARN_CONF_DIR爲該文件夾對應的路徑即可。

      yarn端是基於springboot的微服框架,主要接收control發出的請求,在啓動時,會初始化好sparkcontext,該context具有全局唯一性,在任何時候,yarn端只能運行一個用戶的一個作業,運行完成後,狀態變成空閒,可以再次接收作業請求。

      下圖所示爲jobserver yarn端的監控頁面:


      可以看見,每個server在同一時刻只會運行一個作業實例,空閒狀態的server可以接收新的任務請求。

     默認的server配置爲driver端爲5g內存,executor爲10g內存,採用動態分配機制(spark.dynamicAllocation.enabled設置爲true),當server處於空閒狀態時,自動移除空閒的executor以減少資源佔用。

      爲了支持企業級的部署需求,jobserver添加了Kerberos認證功能、當集羣開啓Kerberos時,用戶需要提供krb5和keytab配置文件以及登陸用戶名完成Kerberos認證,核心代碼如下:

  String krb5Conf = getKrb5ConfPath(dir);
  String keyTab = getKeyTabPath(dir);
  if(StringUtils.isEmpty(krb5Conf) || StringUtils.isEmpty(keyTab)){
      throw new RuntimeException("can not get krb5conf or keytab file");
  }
  System.setProperty("java.security.krb5.conf", krb5Conf);
  System.setProperty("zookeeper.server.principal", "zookeeper/hadoop.hadoop.com");
  Configuration conf = getConfByCode(code);
  if(conf!=null){
      UserGroupInformation.setConfiguration(conf);
  }
  UserGroupInformation.loginUserFromKeytab(kerberosUser+"@HADOOP.COM", keyTab);


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