閱讀471 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Spark SQL CLI 實現分析

背景

本文主要介紹了Spark SQL裏目前的CLI實現,代碼之後肯定會有不少變動,所以我關注的是比較核心的邏輯。主要是對比了Hive CLI的實現方式,比較Spark SQL在哪塊地方做了修改,哪些地方與Hive CLI是保持一致的。可以先看下總結一節裏的內容。


Spark SQL的hive-thriftserver項目裏是其CLI實現代碼,下麵先說明Hive CLI的主要實現類和關係,再說明Spark SQL CLI的做法。


Hive CLI

核心啟動類是org.apache.hive.service.server.HiveServer2,啟動方式:

    try {
      ServerOptionsProcessor oproc = new ServerOptionsProcessor("hiveserver2");
      if (!oproc.process(args)) {
        LOG.fatal("Error starting HiveServer2 with given arguments");
        System.exit(-1);
      }
      HiveConf hiveConf = new HiveConf();
      HiveServer2 server = new HiveServer2();
      server.init(hiveConf);
      server.start();
    } catch (Throwable t) {
      LOG.fatal("Error starting HiveServer2", t);
      System.exit(-1);
    }

HiveServer2繼承CompositeService類,CompositeService類內部維護一個serviceList,能夠加入、刪除、啟動、停止不同的服務。HiveServer2在init(hiveConf)的時候,會加入CLIService和ThriftCLIService兩個Service。根據傳輸模式,如果是http或https的話,就使用ThriftHttpCLIService,否則使用ThriftBinaryCLIService。無論是哪個ThriftCLIService,都傳入了CLIService的引用,thrift隻是一個封裝。

加入了這些服務後,把服務都啟動起來。


CLIService也繼承自CompositeService,CLIService 在init的時候會加入SessionManager服務,並且根據hiveConf,從 hadoop shims裏得到UGI裏的serverUsername。

SessionManager管理hive連接的開啟、關閉等管理功能,已有的連接會維護在一個HashMap裏,value為HiveSession類,裏麵大致是用戶名、密碼、hive配置等info。

所以CLIService裏幾乎所有的事情都是委托給SessionManager做的。

 

SessionManager內主要是OperationManager這個服務,是最重要的和執行邏輯有關的類,下麵會具體說。

 

另外,關於ThriftCLIService,有兩個實現子類,子類隻複寫了run()方法,設置thrift server相關的網絡連接,其他對CLIService的調用邏輯都在父類ThriftCLIService本身裏麵。


實際上,ThriftCLIService裏很多事情也是委托給CLIService做的。

 

那麼上麵大致是Hive CLI、Thrift server啟動的流程,以及幾個主要類的相互關係。


Spark SQL CLI

根據上麵Hive CLI的邏輯,看看Spark SQL的CLI是怎麼做的。

Spark裏的HiveThriftServer2(這個類名看起來有點奇怪)繼承了Hive的HiveServer2,並且複寫了init方法,其初始化的時候加入的是SparkSQLCLIService和ThriftBinaryCLIService兩個服務。前者繼承了Hive的CLIService,有一些不同的邏輯;後者直接使用的是Hive的類,但傳入的是SparkSQLCLIService的引用。


SparkSQLCLIService內部,類似Hive的CLIService,有一個SparkSQLSessionManager,繼承自Hive的SessionManager。也有得到serverUsername的邏輯,代碼和CLIService是一樣的。

 

SparkSQLSessionManager複寫了init這個方法,裏麵有Spark自己的SparkSQLOperationManager服務,繼承自Hive的OperationManager類。

 

可能上麵這幾個類有點看暈了,本質上都是一些封裝而已,沒什麼大的區別。真正重要的是SparkSQLOperationManager這個類裏麵,定義了如何使用Spark SQL來處理query操作。


SparkSQLOperationManager關鍵邏輯

Hive的CLI Operation父類有如下的子類繼承體係,代表hive cli會處理的不同操作類型:

最後更新:2017-04-03 05:39:41

  上一篇:go 高質量的CSS
  下一篇:go 說說那幾款查看源代碼的工具