当
able.doAs这个参数表⽰,当连接hiveserver2或者spark thriftserver时,模拟连接的⽤户进⾏操作。⽐如使⽤hive⽤户启动hiveserver2,jdbc连接HiveServer2时输⼊的⽤户是hdfs,则在该连接内,所有操作都是hdfs⽤户的权限。该参数在hive中完全正常使⽤,但在spark thriftserver中却不可⽤。测试过程如下:
前置条件:使⽤spark 2.3版本,HDFS的unmask是022,HDP平台,able.doAs为true
使⽤spark⽤户启动thriftserver,JDBC连接时输⼊的⽤户是hdfs
建表:表存储路径的owner是hdfs,但在元数据中owner却是spark。假设表名为tab01,在hdfs上对应的⽬录
建表:
为/warehouse/tab01,则该⽬录的owner为hdfs,但是在hive元数据TBLS表中,该表的owner却是spark。
插⼊数据:插⼊失败,错误显⽰spark⽤户对/warehouse/tab01没有权限,说明是spark⽤户执⾏的插⼊操作。
插⼊数据:
使⽤setfacl命令对spark⽤户赋予权限(hdfs dfs setfacl -m user:spark:rwx /warehouse/tab01),插⼊扔失败,原因是在插⼊过程中创建了⼦⽬录,⼦⽬录的owner扔是hdfs。继续对spark加上default acl(hdfs dfs setfacl -m default:user:spark:rwx
/warehouse/tab01),插⼊数据还是失败,原因是spark没有向临时⽂件w的权限。
查询数据:⾸先去掉/warehouse/tab01上spark⽤户的acl权限,并将该⽬录设置为700。执⾏查询,错误显⽰spark⽤户对该查询数据:
⽬录⽆X权限,说明select是spark⽤户
总结:以上为⾮kerberos环境下的测试。使⽤spark thriftserver时,最好不要将able.doAs设置为true,否则就会发⽣⽤户混乱的问题。该⽂使⽤spark 2.3做测试,spark更低版本应该都有同样的问题
在kerberos环境下,启动spark thriftserver,认证⽤户是在l中配置的,如下所⽰:
kerberos环境下,able.doAs设为true,启动spark thriftserver后,在集某节点kinit hi
ve⽤户,再⽤beeline连接spark thriftserver,报错:Error: Failed to open new session: java.lang.RuntimeException: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User:
spark/online-slave1@HADOOP.COM is not allowed to impersonate hive (state=,code=0)
总结:kerberos环境下,doAs为true时,beeline连接存在问题
另外⼀个spark-thriftserver的使⽤注意点:使⽤JDBC连接spark thriftserver时,创建的临时函数是对当前Connection有效的,对其他Connection不可见。猜测可能是因为spark thriftserver对每个连接新建了⼀个sparksession,⽽临时函数是属于sparksession的,所以各个连接的临时函数不互见
thrift
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论