Kyuubi服務(wù)源碼解析:KyuubiServer

??Kyuubi服務(wù)與HiveServer2服務(wù)非常相似,在Kyuubi中很多類的設(shè)計(jì)和代碼邏輯都參照了HiveServer2(Spark SQL Thrift Server也是同樣的道理)乎折。
??HiveServer2服務(wù)啟動(dòng)的源碼解析參見(jiàn):
??Hive源碼剖析之HiveServer2服務(wù)啟動(dòng)過(guò)程
??Spark SQL Thrift Server服務(wù)啟動(dòng)的源碼解析參見(jiàn)以下兩處文章:
??SparkSQL Hive ThriftServer 源碼解析:Intro
??Spark SQL源碼走讀(一):HiveThriftServer2:Intro

(注:以下代碼模塊中,英文注釋皆為作者注釋蜓席,中文注釋是我自己加上的)

KuubiServer.scala

  • KuubiServer類聲明及成員
/**
 * Main entrance of Kyuubi Server
 */
private[kyuubi] class KyuubiServer private(name: String)
  extends CompositeService(name) with Logging {
  //BackendService服務(wù)
  private[this] var _beService: BackendService = _
  def beService: BackendService = _beService
  //FrontendService服務(wù)
  private[this] var _feService: FrontendService = _
  def feService: FrontendService = _feService
  ***后續(xù)代碼省略***
}

??簡(jiǎn)單介紹一下KyuubiServer中兩個(gè)很重要的成員FrontendServiceBackendService:FrontendService負(fù)責(zé)維護(hù)與客戶端的連接枣耀,與客戶端進(jìn)行交互祈搜,將客戶端的SQL請(qǐng)求轉(zhuǎn)發(fā)至FrontendService;BackendService負(fù)責(zé)執(zhí)行SQL并將執(zhí)行結(jié)果返回給FrontendService笼痛。FrontendService最后將結(jié)果返回至客戶端裙秋。

  • main方法
def main(args: Array[String]): Unit = {
    SparkUtils.initDaemon(logger)
    //加載配置
    val conf = new SparkConf(loadDefaults = true)
    setupCommonConfig(conf)

    try {
      val server = new KyuubiServer()
      //對(duì)各種服務(wù)進(jìn)行初始化
      server.init(conf)
      //啟動(dòng)各種服務(wù)
      server.start()
      info(server.getName + " started!")
      if (HighAvailabilityUtils.isSupportDynamicServiceDiscovery(conf)) {
        info(s"HA mode: start to add this ${server.getName} instance to Zookeeper...")
        HighAvailabilityUtils.addServerInstanceToZooKeeper(server)
      }
    } catch {
      case e: Exception =>
        error("Error starting Kyuubi Server", e)
        System.exit(-1)
    }
  • init方法
  override def init(conf: SparkConf): Unit = synchronized {
    this.conf = conf
    _beService = new BackendService()
    _feService = new FrontendService(_beService)
    //將BackendService和FrontendService服務(wù)加入serviceList中
    addService(_beService)
    addService(_feService)
    //調(diào)用父類CompositeService的init方法
    super.init(conf)
    SparkUtils.addShutdownHook {
      () => this.stop()
    }
  }

CompositeService的init方法:

  override def init(conf: SparkConf): Unit = {
    //依次調(diào)用serviceList中各個(gè)服務(wù)的init方法
    for (service <- serviceList) {
      service.init(conf)
    }
    super.init(conf)
  }
  • start方法
  override def start(): Unit = {
    //遍歷serviceList中所有的服務(wù)并依次啟動(dòng)
    serviceList.zipWithIndex.foreach { case (service, i) =>
      try {
        service.start()
      } catch {
        case e: Throwable =>
          error("Error starting services " + getName, e)
          stop(i)
          throw new ServiceException("Failed to Start " + getName, e)
      }
    }
    super.start()
  }

??調(diào)用各個(gè)服務(wù)的init和start方法時(shí),最終都會(huì)調(diào)用AbstractService的init和start方法(這些服務(wù)類要么直接繼承AbstractService缨伊,要么繼承CompositeService摘刑。而CompositeService又繼承自AbstractService)。

AbstractService的init和start方法:

  override def init(conf: SparkConf): Unit = {
    ensureCurrentState(State.NOT_INITED)
    this.conf = conf
    changeState(State.INITED)
    info("Service: [" + getName + "] is initialized.")
  }

  override def start(): Unit = {
    startTime = System.currentTimeMillis
    ensureCurrentState(State.INITED)
    changeState(State.STARTED)
    info("Service: [" + getName + "] is started.")
  }

??對(duì)照Kyuubi服務(wù)啟動(dòng)日志刻坊,可以看到KyuubiServer依次啟動(dòng)的服務(wù)有:KyuubiServer枷恕、OperationManager、SessionManager谭胚、BackendService和FrontendService(至于為什么也啟動(dòng)了OperationManager和SessionManager服務(wù)徐块,在后續(xù)解析BackendService的源碼時(shí)會(huì)提及)未玻。

Kyuubi服務(wù)啟動(dòng)日志

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市胡控,隨后出現(xiàn)的幾起案子扳剿,更是在濱河造成了極大的恐慌,老刑警劉巖昼激,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庇绽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡橙困,警方通過(guò)查閱死者的電腦和手機(jī)瞧掺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)凡傅,“玉大人辟狈,你說(shuō)我怎么就攤上這事∠孽危” “怎么了上陕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)拓春。 經(jīng)常有香客問(wèn)我,道長(zhǎng)亚隅,這世上最難降的妖魔是什么硼莽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮煮纵,結(jié)果婚禮上懂鸵,老公的妹妹穿的比我還像新娘。我一直安慰自己行疏,他們只是感情好匆光,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著酿联,像睡著了一般终息。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贞让,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天周崭,我揣著相機(jī)與錄音,去河邊找鬼喳张。 笑死续镇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的销部。 我是一名探鬼主播摸航,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼制跟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了酱虎?” 一聲冷哼從身側(cè)響起雨膨,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逢净,沒(méi)想到半個(gè)月后哥放,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爹土,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年甥雕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胀茵。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡社露,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出琼娘,到底是詐尸還是另有隱情峭弟,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布脱拼,位于F島的核電站瞒瘸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏熄浓。R本人自食惡果不足惜情臭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赌蔑。 院中可真熱鬧俯在,春花似錦、人聲如沸娃惯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)趾浅。三九已至愕提,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間潮孽,已是汗流浹背揪荣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留往史,地道東北人仗颈。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親挨决。 傳聞我的和親對(duì)象是個(gè)殘疾皇子请祖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容