我是hadoop的新手,我试图理解为什么我的oozie shell操作即使在完成kinit之后也没有获得新的票证。这是我的设想。
我使用我的id“a”登录,并拥有一个用于我的id的kerberos票证。我使用我的id提交带有shell操作的oozie worklow。在oozie shell操作中,我执行另一个kinit来获取id“b”的票证。只有这个id“b”有权访问某些hdfs文件。kinit工作正常,因为klist出示了id“b”的票。现在,当我读取只有b有权访问的hdfs文件时,我得到了permission denied错误,即“a”没有访问该文件的权限。但是,当我在linux cli中,在oozie之外做同样的事情时,在我完成kinit并获取“b”的票证之后,我能够将hdfs文件读取为“b”。但是同样的步骤在oozie shell操作中不起作用,hadoop fs命令似乎总是作为提交oozie工作流的用户而不是存在kerberos票证的用户来工作。有人能解释一下为什么会这样吗?我无法理解这一点。
在相同的shell操作中,虽然hadoop fs命令未能更改为用户“b”,但hbase shell作为用户b工作。为了测试,我创建了一个只有“a”可以访问的hbase表。我添加了hbase shell来在此表上执行get命令。如果我为用户“b”执行kinit-kt并获取其票证,那么这也失败了,因为“b”没有访问此表的权限。因此,我认为hbase使用的是新的票证,而不是提交oozie工作流的用户的委托令牌。当我在shell操作中不执行kinit-kt时,hbase命令会成功。如果我这样做,我甚至不能运行配置单元查询,说“a”没有对某些目录(如/tmp/b/)的执行访问权限,而只有“b”有权访问这些目录,因此我无法理解配置单元是如何工作的,它是使用在提交oozie工作流时创建的委派令牌,还是使用为新用户创建的新票证。
有人能帮我理解上面的情景吗?哪些hadoop服务接受新的身份验证票证,哪些命令接受委派令牌(如hadoop fs命令)?是这样的还是我做错了什么?我只是不明白为什么相同的hadoop fs命令作为不同的用户在oozie外部工作,但即使在kinit之后也不能在oozie shell操作内部工作。
这个委托令牌实际上是什么时候创建的?它是否只有在提交oozie worklow或者我发出hadoop fs命令时才被创建?谢谢您!
2条答案
按热度按时间vtwuwzda1#
理论上——oozie会自动将提交者(即a)的凭证传输到运行作业的容器中。你不必关心
kinit
,因为,事实上,已经太晚了。您不应该在oozie作业中模拟另一个用户,这将破坏严格kerberos身份验证的目的
实际上更棘手的是(1)核心hadoop服务(hdfs,yarn)只检查kerberos令牌一次,然后创建一个“委托令牌”,在所有节点和所有服务之间共享。
(2) 那个
oozie
服务用户有特权,它可以做一种hadoop“sudo”,这样它就可以连接到yarn上oozie
但是,yarn为作业提交者(即a)创建“委托令牌”,仅此而已,您不能更改该令牌。(3) 实际上,您可以使用备用令牌,但只能使用一些显式创建
UserGroupInformation
对象。hadoop命令行接口不能做到这一点。(4) 非核心hadoop呢,比如hbase或hive metastore,或者非hadoop的东西,比如zookeeper?他们根本不使用“委托代币”。要么你明确地管理
UserGroupInformation
在java代码中,或者在连接时使用默认的kerberos令牌。这就是hbase shell工作的原因,如果您使用beeline(jdbc瘦客户机)而不是hive(遗留胖客户机),它也可能工作。
(5) oozie试图用具体的
<credentials>
hive、beeline(“hive2”操作)、hbase等选项;我不确定它是如何工作的,但它必须暗示一个非默认的kerberos票证缓存,在您的作业容器本地。6za6bjd02#
我们发现,一旦启动oozie工作流,就有可能成为另一个kerb负责人。我们必须运行一个shell操作,然后用一个自定义的-djava.security.auth.login.config=custom\u jaas.conf运行java,然后它将提供一个与其他人绑定的jvm。这是沿着参孙(3)的路线,虽然这个近义词甚至可以是一个完全不同的领域。