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

Hadoop Oozie shell操作中kerberos票证和委派令牌的使用,hadoop,hive,kerberos,oozie,kerberos-delegation,Hadoop,Hive,Kerberos,Oozie,Kerberos Delegation,我是hadoop的新手,我试图理解为什么我的oozie shell操作即使在完成kinit之后也没有获得新的票证。这是我的设想 我使用我的ID“A”登录,并且有一个用于我的ID的kerberos票证。我使用我的ID提交带有shell操作的oozie worklow。 在oozie shell操作中,我做了另一个kinit来获取ID“B”的票证。 只有此id“B”可以访问某些HDFS文件。自从klist出示id为“B”的罚单后,kinit运行良好。现在,当我读取只有B有权访问的HDFS文件时,我得

我是hadoop的新手,我试图理解为什么我的oozie shell操作即使在完成kinit之后也没有获得新的票证。这是我的设想

  • 我使用我的ID“A”登录,并且有一个用于我的ID的kerberos票证。我使用我的ID提交带有shell操作的oozie worklow。 在oozie shell操作中,我做了另一个kinit来获取ID“B”的票证。 只有此id“B”可以访问某些HDFS文件。自从klist出示id为“B”的罚单后,kinit运行良好。现在,当我读取只有B有权访问的HDFS文件时,我得到了权限拒绝错误,即“A”无权访问此文件。 但当我在oozie之外的LinuxCLI上做同样的事情时,在我完成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”没有对只有“B”有权访问的某些目录(如/tmp/B/)的执行访问权限,因此我无法理解配置单元是如何工作的,它是使用提交oozie工作流时创建的委派令牌,还是使用为新用户创建的新票证。
    有人能帮我理解上面的情景吗?哪些hadoop服务接受新的身份验证票证,哪些命令接受委派令牌(如hadoop fs命令)?是这样的,还是我做错了什么? 我只是不明白为什么同一个hadoop fs命令作为不同的用户在oozie外部工作,但即使在kinit之后也不能在oozie shell操作内部工作

  • 此委派令牌实际何时创建?它是否仅在提交oozie worklow或甚至我发出hadoop fs命令时创建? 谢谢大家! 理论上——Oozie自动将提交者的凭证(即A)传输到运行作业的纱线容器。你不必关心kinit,因为事实上,现在已经太晚了。
    您不应该在Oozie作业中模拟另一个用户,这将破坏严格Kerberos身份验证的目的

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

    (2)
    oozie
    服务用户拥有特权,它可以执行一种Hadoop“sudo”,这样它就可以作为
    oozie
    连接到Thread,但是Thread为作业提交者(即a)创建“委派令牌”,就是这样,您不能更改该令牌

    (3) 实际上,您可以使用备用令牌,但只能使用一些自定义Java代码,为备用用户显式创建
    UserGroupInformation
    对象。Hadoop命令行接口不能做到这一点

    (4) 那么非核心Hadoop,即HBase或Hive Metastore,或者非Hadoop的东西,即Zookeeper呢?他们根本不使用“委托代币”。要么在Java代码中显式管理
    UserGroupInformation
    ,要么在连接时使用默认的Kerberos令牌。
    这就是为什么你的HBase外壳可以工作的原因,如果你使用了Beeline(JDBC瘦客户端)而不是Hive(传统胖客户端),它可能也可以工作

    (5) Oozie试图用特定的
    选项来填补这一空白,如Hive、Beeline(“Hive2”操作)、HBase等;我不确定它是如何工作的,但它必须意味着一个非默认的Kerberos票证缓存,位于作业容器的本地。

    理论上——Oozie自动将提交者的凭证(即a)传输到运行作业的容器。你不必关心kinit,因为事实上,现在已经太晚了。
    您不应该在Oozie作业中模拟另一个用户,这将破坏严格Kerberos身份验证的目的

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

    (2)
    oozie
    服务用户拥有特权,它可以执行一种Hadoop“sudo”,这样它就可以作为
    oozie
    连接到Thread,但是Thread为作业提交者(即a)创建“委派令牌”,就是这样,您不能更改该令牌

    (3) 实际上,您可以使用备用令牌,但只能使用一些自定义Java代码,为备用用户显式创建
    UserGroupInformation
    对象。Hadoop命令行接口不能做到这一点

    (4) 那么非核心Hadoop,即HBase或Hive Metastore,或者非Hadoop的东西,即Zookeeper呢?他们根本不使用“委托代币”。要么在Java代码中显式管理
    UserGroupInformation
    ,要么在连接时使用默认的Kerberos令牌。
    这就是为什么你的HBase外壳可以工作的原因,如果你使用Beeline(JDBC瘦客户端)而不是Hive(传统胖客户端),它可能也可以工作。