简介
本篇主要讲解Zeppelin LDAP Kerberos HDP集群多租户。
经过验证,目前情况下Zeppelin LDAP多租户在非Kerberos集群可完美工作(参见Flink Zeppelin Hudi Hive 整合环境配置和使用)。但是在Kerberos集群多租户仍存在一些不完善之处。目前情况是:
- 使用Zeppelin管理员/最高权限用户可自动进行Kerberos认证,Shell,Spark,Flink解析器工作正常。
- 使用租户账户登录,Zeppelin采用认证为管理员principal,提交作业时候代理成租户的方式,Spark解析器工作正常,Shell和Flink解析器出现权限问题无法启动。
希望本篇能够抛砖引玉。欢迎大家提出完美的解决方案。本篇不定期更新。
参考文献
环境配置
下面例子中采用Zeppelin的服务启动/管理账户为zeppelin。租户账户为paul。
必须的配置和检查的内容如下:
- LDAP(如果使用的话)和Linux中创建zeppelin用户。所有租户都通过zeppelin用户提交作业。
- 租户账户必须存在对应的Linux用户。
- 配置了zeppelin服务启动用户向租户账户的ssh免密。
- 需要通过Ranger赋予zeppelin用户的HDFS访问权限和Yarn队列的提交权限。
- Kerberos创建zeppelin用户对应的principal和keytab。
- 配置并验证Hadoop的
auth_to_local
。 - Hadoop中配置zeppelin的proxy。
LDAP/Linux创建管理员和租户账户
在Linux中执行:
# 创建zeppelin用户并配置密码
useradd zeppelin
passwd zeppelin
# 创建paul用户并配置密码
useradd paul
passwd paul
# 配置zeppelin用户到paul的ssh免密
su zeppelin
ssh-keygen -t rsa
ssh-copy-id paul@hostname
LDAP创建管理员/租户账户推荐使用Apache Directory Studio完成。或者在Linux中创建用户之后,使用migrationtools迁移用户到LDAP。具体做法参见OpenLDAP 安装配置和使用)。
Ranger赋予zeppelin用户HDFS目录和Yarn队列提交权限
这一部通过Ranger组件来完成赋权。由于zeppelin是管理员账户,需要赋予较大的权限,否则会遇到作业执行权限不足等问题。我们可以赋予zeppelin用户和HDFS集群yarn用户相同的权限。赋权操作可以通过Ranger图形界面完成,不再赘述。
Kerberos创建zeppelin的principal和keytab
在kadmin所在服务器执行kadmin.local
,然后执行如下命令:
addprinc zeppelin@PAULTECH.COM
ktadd -k /etc/security/keytabs/zeppelin.keytab zeppelin@PAULTECH.COM
其中PAULTECH.COM
为集群Kerberos的realm。执行时候替换为真实值。
配置完毕后执行:
kinit -kt /etc/security/keytabs/zeppelin.keytab zeppelin@PAULTECH.COM
klist
验证是否可以成功认证。
配置并验证Hadoop的auth_to_local
该配置项名为hadoop.security.auth_to_local
。它定义了一系列规则,决定如何将Kerberos的principal名称映射为Hadoop的用户名。配置方法较为复杂,参见Auth-to-local Rules Syntax - Cloudera Community - 245316。一般情况下默认的配置是可以满足要求的。可通过如下命令验证用户名转换逻辑是否正确:
$ hadoop org.apache.hadoop.security.HadoopKerberosName zeppelin@PAULTECH.COM
Name: zeppelin@PAULTECH.COM to zeppelin
输出结果表明将zeppelin@PAULTECH.COM
转换成了zeppelin
,符合我们的要求。
配置zeppelin的用户代理
Hadoop core-site.xml
增加配置:
<property>
<name>hadoop.proxyuser.zeppelin.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.zeppelin.users</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.zeppelin.hosts</name>
<value>*</value>
</property>
允许zeppelin模拟任意机器上的任意用户组的任意用户提交任务。当然也可以根据实际情况加以限制。
Zeppelin配置
环境配置完毕后接下来开始Zeppelin的配置。
zeppelin-site.xml
文件添加:
<property>
<name>zeppelin.server.kerberos.keytab</name>
<value>/etc/security/keytabs/zeppelin.keytab</value>
<description>keytab for accessing kerberized hdfs</description>
</property>
<property>
<name>zeppelin.server.kerberos.principal</name>
<value>zeppelin@PAULTECH.COM</value>
<description>principal for accessing kerberized hdfs</description>
</property>
然后Zeppelin中用到的解析器需要配置impersonation。参见Flink Zeppelin Hudi Hive 整合环境配置和使用或官网Apache Zeppelin 0.10.1 Documentation: Impersonation。
Interpreter配置
这一章我们分别配置Shell,Spark和Flink的interpreter。
Shell interpreter
Shell interpreter的Kerberos认证需要配置:
- zeppelin.shell.auth.type: KERBEROS
- zeppelin.shell.keytab.location: /etc/security/keytabs/zeppelin.keytab
- zeppelin.shell.principal: zeppelin@PAULTECH.COM
完成这些认证配置后,Shell interpreter在执行shell命令之前,会自动为我们做kinit
操作。
我们验证下配置是否生效。使用zeppelin管理员用户登录Zeppelin后执行:
klist
可以发现已认证成功。
存在问题:使用其他租户登录(例如paul)执行会报错。Shell interpreter启动异常,提示没有权限。
Spark interpreter
需要配置:
- SPARK_HOME
- spark.master: yarn
- spark.submit.deployMode: client
spark.submit.deployMode
配置cluster会出现IP地址NumberFormatException问题。无需再额外配置认证相关项目。
接下来我们验证功能。使用zeppelin用户登录可以成功提交任务。
使用租户paul登录也可以提交任务。提交任务成功后,进入Yarn管理页面可以发现运行作业的用户为paul而不是zeppelin。Spark interpreter使用了--proxy-user
参数,让zeppelin用户代理paul用户。目前功能的实现是本篇3个interpreter中较为完美的。但存在的问题是尽管作业以paul用户执行,但是拥有的权限和zeppelin用户相同。
Flink interpreter
Flink interpreter无需额外的认证配置。Flink环境相关的配置项参见:Flink Zeppelin Hudi Hive 整合环境配置和使用。
经过验证发现,使用zeppelin用户登录可以成功提交任务。
然而使用paul租户登录无法提交任务,提示没有权限。
网友评论