分享

改造zeppelin、spark和hive三端源代码,实现SQL based Authorization标准权限验证



问题导读:

1.什么是zeppelin?
2.怎样实现zeppelin多租户使用?






1、zeppelin简介
zeppelin是基于Web的可视化交互应用,以notebook为抽象提供服务,支持jdbc、Spark、Python、md、shell等解析器,其可视化功能非常强大,且提供定时任务和文档共享,非常方便数据分析使用。因为zeppelin先天对spark有很好的支持,故生产上采用它来作为使用spark计算引擎的接口,可是zeppelin的权限功能尚不完善,尤其与spark sql对接使用时不能提供完善的权限验证功能,故需要一些改造。

2、业务背景
当前spark的ThriftServer默认是cli模式,设计上仅支持Storage based Authorization标准的权限验证,不能像Hive的HiveServer2一样提供很好的鉴权服务;通过调研,为了让zeppelin通过jdbc连接spark实现SQL based Authorization标准权限验证,本文采用对zeppelin、spark和hive三端进行源代码改造的方式实现更完善的权限验证功能。

3、实现的功能
最终我们实现zeppelin多租户使用,不同用户提交的query对应到不同的yarn的队列上,同时对用户提交的query实现表级鉴权,增强访问安全性。后期还打算对zeppelin使用编码模式提交的SQL进行鉴权,达到全面开放zeppelin的spark应用。

1)Spark端改造
  • spark ThriftServer模块添加自定义的验证类,实现jdbc用户名密码的登入验证。
    • 对spark的conf目录下hive-site.xml配置hive.server2.authentication为CUSTOM,自定义实现jdbc账号密码登入验证功能。
    • 同时把hive.security.authorization.enabled设置为true,开启Hive Client访问验证。
  • 因为上述登入验证需要连接mysql,则复制mysql-connector-java-5.1.31.jar到spark项目jars中。
  • 修改spark源代码中HiveClientImpl类,让访问query的SessionState为HiveServer类型。(否则thriftserver认为所有输入query都认为是cli模式,会报错)

[mw_shl_code=text,true]报错:java.lang.RuntimeException: org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAuthzPluginException: SQL standards based authorization should not be enabled from hive cliInstead the use of storage based authorization in hive metastore is reccomended. Set hive.security.authorization.enabled=false to disable authz within cli
[/mw_shl_code]

因此设置以下即可:

[mw_shl_code=scala,true]val state = new SessionState(hiveConf)
state.setIsHiveServerQuery(hiveConf.get("spark.hiveserver2.enabled","false").toBoolean)  // spark默认是false,这里强制改为true
logWarning(s"------------isHiveServerQuery: ${state.isHiveServerQuery}")[/mw_shl_code]

2)Hive端改造
在hive端,把表权限验证的功能以RESTFul接口风格暴露出来给其他服务调用,所有query查询都需要先经过这个服务进行权限验证。这里仅提供思路,具体实现因人而异。

3)Zeppelin端改造
为了实现权限验证,zeppelin通过jdbc访问spark的ThriftServer,故需要在执行query语句之前,对用户角色和语句进行权限验证,用http连接Hive提供的RESTful接口auth服务,提供用户role和cmd来进行权限验证,验证通过后才把query语句提交给spark的ThriftServer进行处理。

zeppelin-jdbc连接依jar赖包
hive-jdbc-0.14.0.jar、hive-service-0.14.0.jar、MySQL-connector-Java-5.1.31.jar、Hadoop-common-2.6.0.jar、hive-common-0.14.0.jar、libthrift-0.9.0.jar

整个验证流程如下图:

20170112225619211.png

对于这个设计方案,本人尝试过在Spark ThriftServer端进行表验证,但是没有成功实现,故转而采取在hive端暴露表验证接口,这样做会有时间开销,但能解决当前需求,也是一种选择,后期继续改善。





来源:csdn
作者:xwc35047

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条