IT星球论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 99|回复: 0

Spark SQL Thrift Server 配置 Kerberos身份认证和权限管理

[复制链接]

2004

主题

1

好友

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

优秀会员 助人为乐 辛勤工作 技术精英 多才多艺 优秀班竹 灌水天才 星球管理 宣传大使 灌水之王 财富勋章 版主勋章 动漫勋章 勤奋会员 论坛精英 PS高手 心 8 闪游皮肤 双鱼座 8★8➹ 志愿者 乖

发表于 2017-3-22 12:35:52 |显示全部楼层
Spark SQL Thrift Server 配置 Kerberos身份认证和权限管理

转载请注明出处:http://www.cnblogs.com/xiaodf/

  之前的博客介绍了通过Kerberos + Sentry的方式实现了hive server2的身份认证和权限管理功能,本文主要介绍Spark SQL JDBC方式操作Hive库时的身份认证和权限管理实现。

 ThriftServer是一个JDBC/ODBC接口,用户可以通过JDBC/ODBC连接ThriftServer来访问SparkSQL的数据。ThriftServer在启动的时候,会启动了一个sparkSQL的应用程序,而通过JDBC/ODBC连接进来的客户端共同分享这个sparkSQL应用程序的资源,也就是说不同的用户之间可以共享数据;ThriftServer启动时还开启一个侦听器,等待JDBC客户端的连接和提交查询。所以,在配置ThriftServer的时候,至少要配置ThriftServer的主机名和端口,如果要使用hive数据的话,还要提供hive metastore的uris。

前提:

  本文是在以下几个部署前提下进行的实验:

  (1)CDH 开启了Kerberos身份认证,并安装了Sentry;

  (2)Hive权限通过Sentry服务控制;

  (3)HDFS开启了HDFS ACL与Sentry的权限同步功能,通过sql语句更改Hive表的权限,会同步到相应的HDFS文件。

  以上各项配置可参考我之前博客:http://www.cnblogs.com/xiaodf/p/5968248.html

1、Thrift Server 安装配置1.1. 下载spark安装包

CDH自带的spark不支持thrift server,所以需要自行下载spark编译好的安装包,下载地址如下:http://spark.apache.org/downloads.html

本文下载的spark版本为1.5.2,

1.2. 添加配置文件

  将集群hive-site.xml文件拷贝到spark目录的conf下

[root@t162 spark-1.5.2-bin-hadoop2.6]# cd conf/[root@t162 conf]# lltotal 52-rw-r--r-- 1 root root  202 Oct 25 13:05 docker.properties.template-rw-r--r-- 1 root root  303 Oct 25 13:05 fairscheduler.xml.template-rw-r--r-- 1 root root 5708 Oct 25 13:08 hive-site.xml-rw-r--r-- 1 root root  949 Oct 25 13:05 log4j.properties.template-rw-r--r-- 1 root root 5886 Oct 25 13:05 metrics.properties.template-rw-r--r-- 1 root root   80 Oct 25 13:05 slaves.template-rw-r--r-- 1 root root  507 Oct 25 13:05 spark-defaults.conf.template-rwxr-xr-x 1 root root 4299 Oct 25 13:08 spark-env.sh-rw-r--r-- 1 root root 3418 Oct 25 13:05 spark-env.sh.template-rwxr-xr-x 1 root root  119 Oct 25 13:09 stopjdbc.sh

  修改hive-site.xml参数hive.server2.enable.doAs为true,注意doAs务必是true,否则又会包shim包找不到的错误。

      hive.server2.enable.doAs    true  

  生成spark-env.sh文件,并添加参数

export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/cloudera/parcels/CDH/lib/hadoop/lib/native

  此处HADOOP_HOME=/opt/cloudera/parcels/CDH/lib/hadoop

1.3. 生成启动thrift服务脚本startjdbc.sh

  调用start-thriftserver.sh脚本启动thrift server

#!/bin/sh#start Spark-thriftserverexport YARN_CONF_DIR=/etc/hadoop/conffile="hive-site.xml"dir=$(pwd)cd conf/if [ ! -e "$file" ]then cp /etc/hive/conf/hive-site.xml $dir/conf/ficd ../sbin./start-thriftserver.sh --name SparkJDBC --master yarn-client  --num-executors 10 --executor-memory 2g --executor-cores 4 --driver-memory 10g --driver-cores 2  --conf spark.storage.memoryFraction=0.2 --conf spark.shuffle.memoryFraction=0.6 --hiveconf hive.server2.thrift.port=10001 --hiveconf hive.server2.logging.operation.enabled=true --hiveconf hive.server2.authentication.kerberos.principal=hive/t162@HADOOP.COM --hiveconf hive.server2.authentication.kerberos.keytab /home/hive.keytab  

  上面脚本实际上就是提交了一个spark job,其中主要参数如下:

  master :指定spark提交模式为yarn-client  hive.server2.thrift.port : 指定thrift server的端口  hive.server2.authentication.kerberos.principal:指定启动thrift server的超级管理员principal,此处超级管理员为hive  hive.server2.authentication.kerberos.keytab : 超级管理员对应的keytab 1.4. 生成关闭thrift服务脚本stopjdbc.sh#!/bin/sh# Stop SparkJDBCcd sbin./spark-daemon.sh stop org.apache.spark.sql.hive.thriftserver.HiveThriftServer2 12、认证测试

  Spark SQL Thriftserver认证,目的是让不同的用户,使用不同的身份来登录beeline。使用Kerberos,的确可以解决服务互相认证、用户认证的功能。

2.1. 启动thrift server

  使用使用管理员账户启动,已配置在启动脚本中。thriftserver实际是个spark Job,通过spark-submit提交到YARN上去,需要这个账户用来访问YARN和HDFS;如果使用一些普通账户,由于HDFS权限不足,可能启动不了,因为需要往HDFS写一些东西。

[root@t162 spark-1.5.2-bin-hadoop2.6]# ./startjdbc.sh starting org.apache.spark.sql.hive.thriftserver.HiveThriftServer2, logging to /home/iie/spark-1.5.2-bin-hadoop2/spark-1.5.2-bin-hadoop2.6/sbin/../logs/spark-root-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2-1-t162.out......16/10/25 16:56:07 INFO thrift.ThriftCLIService: Starting ThriftBinaryCLIService on port 10001 with 5...500 worker threads

  可以通过输出日志查看服务启动情况

[root@t162 spark-1.5.2-bin-hadoop2.6]# tailf /home/iie/spark-1.5.2-bin-hadoop2/spark-1.5.2-bin-hadoop2.6/sbin/../logs/spark-root-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2-1-t162.out2.2. 通过beeline连接thrift server

  因为服务启动了kerberos身份认证,没有认证时连接服务会报错,如下所示:

[root@t161 ~]# beeline -u "jdbc:hive2://t162:10001/;principal=hive/t162@HADOOP.COM"16/10/25 16:59:04 WARN mapreduce.TableMapReduceUtil: The HBase-prefix-tree module jar containing PrefixTreeCodec is not present.  Continuing without it.scan complete in 2msConnecting to jdbc:hive2://t162:10001/;principal=hive/t162@HADOOP.COM16/10/25 16:59:06 [main]: ERROR transport.TSaslTransport: SASL negotiation failureJavax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]

  我们用user1用户进行认证,就可以连接了,用户事先已创建,创建方式见http://www.cnblogs.com/xiaodf/p/5968282.html

[root@t161 ~]# kinit user1Password for user1@HADOOP.COM: [root@t161 ~]# beeline -u "jdbc:hive2://t162:10001/;principal=hive/t162@HADOOP.COM"16/10/25 17:01:46 WARN mapreduce.TableMapReduceUtil: The hbase-prefix-tree module jar containing PrefixTreeCodec is not present.  Continuing without it.scan complete in 3msConnecting to jdbc:hive2://t162:10001/;principal=hive/t162@HADOOP.COMConnected to: Spark SQL (version 1.5.2)Driver: Hive JDBC (version 1.1.0-cdh5.7.2)Transaction isolation: TRANSACTION_REPEATABLE_READBeeline version 1.1.0-cdh5.7.2 by Apache Hive0: jdbc:hive2://t162:10001/>  3、权限测试

  不同的用户通过kinit使用自己的Principal+密码通过Kerberos的AS认证拿到TGT,就可以登录到spark sql thriftserver上去查看库、表;

  不过由于sts还不支持sqlbased authorization,所以还只能做到底层hdfs的权限隔离,比较可惜;相对来说hive的完整度高一些,支持SQLstandard authorization。

  因为事先我们已经开启了HDFS ACL与Sentry的权限同步功能,所以这部分权限功能可以通过Sentry,利用sql语句进行修改,表和数据库的权限会同步到对应的HDFS目录和文件,spark sql thriftserver基于hdfs的权限隔离实现权限管理功能。

  权限测试可参考之前博客:http://www.cnblogs.com/xiaodf/p/5968282.html,此处略

4、问题

  使用spark1.6.0版本,启动thrift server服务后,执行“show databases”报如下错误:

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient  

  查询资料说这可能是1.6版本的一个bug,换成1.5.2版本后,没有这个问题了。下面为此问题的查询链接:https://forums.databricks.com/qu ... led-hadoophive.html

Spark SQL Thrift Server 配置 Kerberos身份认证和权限管理

相关帖子

该会员没有填写今日想说内容.
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

回顶部