阅读471 返回首页    go 微软 go windows


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 说说那几款查看源代码的工具