Hadoop Oozie shell操作中的kerberos票证和委托令牌使用

时间:2016-06-10 13:28:35

标签: hadoop hive kerberos oozie kerberos-delegation

我是hadoop的新手并且试图理解为什么我的oozie shell动作即使在做了kinit之后也没有拿到新票。这是我的情景。

  1. 我使用我的ID“A”登录,并为我的身份证有一张kerberos票。我使用我的ID提交oozie worklow和shell动作。 在oozie shell动作中,我做另一个kinit获取ID“B”的票。 只有这个ID“B”才能访问某些HDFS文件。 kinit工作正常,因为klist显示了id为“B”的票。现在,当我读取只有B有权访问的HDFS文件时,我得到权限被拒绝错误,说“A”没有访问此文件的权限。 但是当我从linux cli,oozie外面做同样的事情,在我做了kinit并为“B”取票之后,我能够将HDFS文件读作“B”。 但同样的步骤不适用于oozie shell操作,并且hadoop fs命令似乎总是作为提交oozie工作流的用户而不是用于存在kerberos票证的用户。 有人可以解释为什么会这样吗?我无法理解这一点。

  2. 在相同的shell操作中,尽管hadoop fs命令无法更改为用户“B”,但hbase shell仍然作为用户B工作。为了进行测试,我创建了一个只有“A”才能访问的hbase表。我添加了hbase shell以在此表上执行get命令。如果我为用户“B”做kinit -kt并得到它的票,这也失败了,说“B”无法访问该表。所以我认为hbase正在使用新票而不是提交oozie工作流的用户的委托令牌。当我在shell动作中不执行kinit -kt时,hbase命令会成功。 如果我做kinit,我甚至无法运行hive查询说“A”没有执行访问某些目录,如/ tmp / B /只有“B”有权访问,所以我无法理解蜂巢是如何工作的,如果它将获取在提交oozie工作流时创建的委托令牌,或者是否正在为新用户创建新票证。
    有人可以帮我理解上面的情况吗?哪些hadoop服务需要新的身份验证凭据以及哪些命令采用委托令牌(如hadoop fs命令)?这是它如何工作或我做错了什么? 我只是不明白为什么同样的hadoop fs命令从外部oozie作为不同的用户工作,但即使在kinit之后也没有在oozie shell动作中工作。

  3. 这个委托令牌实际上是什么时候创建的?它是仅在提交oozie worklow时创建的,还是我发出hadoop fs命令? 谢谢!

2 个答案:

答案 0 :(得分:1)

理论上 - Oozie 自动提交者(即A)的凭据传输到运行该作业的YARN容器。您不必关心kinit,因为事实上,它太晚了。 您不应该冒充Oozie作业中的其他用户,这会破坏严格Kerberos身份验证的目的

实际上更棘手 - (1)核心Hadoop服务(HDFS,YARN)只检查一次Kerberos令牌,然后创建一个在所有节点之间共享的“委托令牌”和所有服务。

(2)oozie服务用户具有特殊权限,它可以执行一种Hadoop“sudo”,以便它以oozie的形式连接到YARN,但YARN为其创建“委托令牌”作业提交者(即A)就是这样,你不能改变那个令牌的改变。

(3)好吧,实际上你可以使用备用令牌,但只有一些显式创建{{ 1}}替代用户的对象。 Hadoop命令行界面不这样做。

(4)非核心Hadoop,即HBase或Hive Metastore,或非Hadoop的东西,即Zookeeper?他们根本不使用“代表团令牌”。您可以在Java代码中明确管理UserGroupInformation,或者在连接时使用默认的Kerberos令牌 这就是你的HBase shell工作的原因,如果你使用了Beeline(JDBC瘦客户端)而不是Hive(传统的胖客户端),它可能也会工作。

(5)Oozie尝试用Hive,Beeline (“Hive2”动作),HBase等的特定UserGroupInformation选项填补这一空白;我不确定它是如何工作的,但它必须暗示一个非默认的Kerberos票证缓存,在你的作业容器本地。

答案 1 :(得分:0)

我们发现一旦oozie工作流程启动,就有可能成为另一个路边的校长。我们必须运行一个shell动作然后使用自定义-Djava.security.auth.login.config = custom_jaas.conf运行java,然后将提供jvm kinit作为其他人。这与Samson的(3)一致,虽然这个kinit甚至可以是一个完全不同的领域。