改造zeppelin、spark和hive三端源代码,实现SQL based Authorization标准权限验证
问题导读:
1.什么是zeppelin?2.怎样实现zeppelin多租户使用?
http://www.aboutyun.com/static/image/hrline/4.gif
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模式,会报错)
报错: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
因此设置以下即可:
val state = new SessionState(hiveConf)
state.setIsHiveServerQuery(hiveConf.get("spark.hiveserver2.enabled","false").toBoolean)// spark默认是false,这里强制改为true
logWarning(s"------------isHiveServerQuery: ${state.isHiveServerQuery}")
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
整个验证流程如下图:
对于这个设计方案,本人尝试过在Spark ThriftServer端进行表验证,但是没有成功实现,故转而采取在hive端暴露表验证接口,这样做会有时间开销,但能解决当前需求,也是一种选择,后期继续改善。
来源:csdn作者:xwc35047
页:
[1]