HiveServer2 源码分析

来源:互联网 发布:虚拟男朋友聊天软件 编辑:程序博客网 时间:2024/05/17 11:55

1.启动脚本

 $HIVE_HOME/bin/hive --service hiveserver2   --> $HIVE_HOME/bin/ ext/hiveserver2.sh --> 可以看到入口类和 org.apache.hive.service.server.HiveServer2

2.简要介绍

HiveServer2 主要包括cliServer 和 thriftCLIService,通过zk注册,可以启动多个server。cliServer 主要负责逻辑, thriftCLIService提供thrift服务,

thriftCLIService 会调用cliServer 封装的逻辑。

 

thriftCLIService  中通过HiveAuthFactory 来实现用户登录验证,ThriftBinaryCLIService 继承ThriftCLIService接口,在运行的时候,会初始化HiveAuthFactory

HiveAuthFactory 支持NOSASL, NONE ,LDAP,KERBEROS,CUSTOM,PAM 6中方式, CUSTOM 属于自定义,通过thrift中TSaslServerTransport 中实现。

具体逻辑可以参考: PlainSaslHelper

 

CLIService 通过sessionManger 进行管理session, 实现了对外服务的接口, 主要接口 ExecuteStatement 执行语句。

3.入口类

(1)  ServerOptionsProcessor 解析参数解析hiveconf 等参数

(2)LogUtils.initHiveLog4j()  加载log日志

(3) 通过StartOptionExcutor 来startHiveServer2

(4) 创建HiveServer2 初始化,启动运行

4.HiveServer2 初始化

(1) 创建CLIService  (继承ICLIService 接口, 并实现这些接口)

(2) 将cliService 加入服务

(3) 创建ThriftBinaryCLIService(集成TCLIService.Iface 接口,并实现这些接口, 这些接口实现会调用CLIService 的接口实现)

(4) 将thriftCLIService 加入服务

(5) 调用父类初始化(此时会调用cliService  和 thriftCLIService的初始化(初始化ip和端口) )

5.CliService 初始化

(1)  创建SessionManager, 此类主要用户session的管理

(2) applyAuthorizationConfigPolicy (如果是开启授权,并且是V2版本授权,fs, add, delete, compile, and reset是禁止的,

     此时通过 hive.security.authorization.sqlstd.confwhitelist来进行定制)

(3) 调用父类的初始化(此时会调用SessionManager 的初始化,SessionManager初始化里面会调用OperationManager的初始化

6.HiveServer2 运行

(1) start 同init的,会遍历ServerList里面的Service 进行启动,首先CLIService的start -->SessionManager.start -->OperationManager.start

(2) 调用ThriftBinaryCLI

(3) run 函数中会替换 TTransportFactory 和 TProcessorFactory

7.HiveServer2 运行ExecuteStatement  分析

 (1)  CLIService.executeStatement -->  HiveSessionImpl.executeStatement -->HiveSessionImpl.executeStatementInternal

 (2)  通过OperationManager 获取对应ExecuteStatementOperation 返回的可能是集成于它的子类SQLOperation 或者HiveCommandOperation

        具体HiveCommandOperation 中的命令可以参考CommandProcessorFactory(SET RESET ADD and so on)

 (3) SQLOperation 运行:operation.run()  会调用子类中的runInternal() 调用prepare, 通过Driver 进行compileAndRespond 后面就是

       org.apache.hadoop.hive.ql.Driver.compileAndRespond(Driver.java:1106)

       org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1112)

       org.apache.hadoop.hive.ql.Driver.compile(Driver.java:307)

       org.apache.hadoop.hive.ql.Driver.compile(Driver.java:467)

       org.apache.hadoop.hive.ql.Driver.doAuthorization(Driver.java:565)

(4) 后面主要讲下授权方面:(这里正对sql standard based auth)

Driver(doAuthorization –>doAuthorizationV2) --> 通过session 获取 HiveAuthorizerImpl 的具体实现(HiveAuthorizerImpl.checkPrivileges) -->

调用SQLStdHiveAuthorizationValidator 中的checkPrivileges, 会通过不同的HivePrivilegeObjectType 进行不同的授权

GLOBAL, DATABASE, TABLE_OR_VIEW, PARTITION, COLUMN, LOCAL_URI, DFS_URI, COMMAND_PARAMS, FUNCTION 为类别

权限验证:

首先通过Operation2Privilege.getRequiredPrivs 获取一个类型需要的权限(requiredPrivs)

然后SQLAuthorizationUtils.getPrivilegesFromMetaStore 获取目前改用户的权限(availPrivs)

看目前权限是否满足requiredPrivs

具体哪些操作需要哪些权限可以在Operation2Privilege 中查看。

 

(5)HiveCommandOperation,  比如运行的是 add jar "aaa.jar";

   ExecuteStatementOperation 中 newExecuteStatementOperation 通过processor = CommandProcessorFactory.getForHiveCommand(tokens, parentSession.getHiveConf()); 获取

   得到AddResourceProcessor();  执行run

   调用authorizeCommand 进行授权: -->authorizeCommandThrowEx – > ss.getAuthorizerV2().checkPrivileges

   调用hiveSession 中的 add_resources


0 0
原创粉丝点击