hadoop - Hadoop 集群交互式用户的永久 Kerberos 票证
问题描述
我有一个 Hadoop 集群,它使用公司的 Active Directory 作为 Kerberos 领域。节点和最终用户 Linux 工作站都是 Ubuntu 16.04。它们使用 PowerBroker PBIS 加入同一个域,因此工作站和网格节点之间的 SSH 登录是单点登录。最终用户从他们的工作站运行长时间运行的脚本,这些脚本反复使用 SSH 首先在集群上启动 Spark/Yarn 作业,然后跟踪他们的进度,这些工作必须在晚上和周末持续运行,远远超过 10 小时Kerberos 票证的生命周期。
我正在寻找一种方法来为用户安装永久的、服务式的 Kerberos 密钥表,从而减轻他们处理kinit的需要。我知道这意味着任何对网格具有 shell 访问权限的人都可以作为特定用户进行身份验证。
我还注意到,使用密码执行非 SSO SSH 登录会自动创建从登录时有效的网络票证。如果可以为 SSO 登录启用此行为,那将解决我的问题。
解决方案
如果您正在访问 Hive/Hbase 或任何其他需要 kerberos 票证的组件,请让您的 spark 代码在票证过期时重新登录。您必须更新票证才能使用 keytab,而不是依赖 TGT 已经存在于缓存中。这是通过使用 Hadoop 安全包中的 UserGroupInformation 类来完成的。在您的火花作业中添加以下代码段以进行长时间运行-
val configuration = new Configuration
configuration.addResource("/etc/hadoop/conf/hdfs-site.xml")
UserGroupInformation.setConfiguration(configuration)
UserGroupInformation.getCurrentUser.setAuthenticationMethod(AuthenticationMethod.KERBEROS)
UserGroupInformation.loginUserFromKeytabAndReturnUGI(
"hadoop.kerberos.principal", " path of hadoop.kerberos.keytab file")
.doAs(new PrivilegedExceptionAction[Unit]() {
@Override
def run(): Unit = {
//hbase/hive connection
// logic
}
})
上面我们指定了我们的服务主体的名称和我们生成的 keytab 文件的路径。只要该 keytab 有效,我们的程序就会对所有操作使用所需的服务主体,而不管运行程序的用户是否已经通过身份验证并收到了 TGT。
如果除了 spark 没有其他组件访问,那么您不需要编写上述代码。只需在 spark submit 命令中提供 keytab 和 principal。
spark-submit --master yarn-cluster --keytab "xxxxxx.keytab" --principal "svc-xxxx@xxxx.COM" xxxx.jar
推荐阅读
- c++ - 快速排序算法引发堆栈转储错误的 C++ 运行时错误
- python - 需要在python中迭代字典列表并仅以列表形式获取dict的值
- ios - 目标 C - 不知道用于选择的类方法
- python - django viewset 扩展 mixins.UpdateModelMixin 但邮递员通过补丁方法更新模型返回'细节:不允许方法补丁'
- python - 我在这个带有 pool.map 的文件中做错了什么,导致什么都没有出现,我必须重新启动 shell?
- html - 第一行和第二行之间有间隙的自定义单选按钮
- vue.js - 注销时清除 nuxt 存储和所有子模块
- c# - 卡在 HttpPost 方法上,试图输入 JSON 文本,但对象应该是“空的”
- aws-lambda - 如何根据请求主体变量/项目执行不同的 aws lambda(aws api 网关)
- bing - 需要防止网站链接显示在 Bing 搜索结果中