【问题标题】:Submit Oozie Job from another job's java action with Kerberos使用 Kerberos 从另一个作业的 java 操作提交 Oozie 作业
【发布时间】:2017-05-12 13:08:17
【问题描述】:

我正在尝试使用来自另一个 Job 的 java 操作的 Java Client API 提交 Oozie 作业。集群正在使用 Kerberos。

这是我的代码:

// get a OozieClient for local Oozie
    String oozieUrl = "http://hadooputl02.northamerica.xyz.net:11000/oozie/";
    AuthOozieClient wc = new AuthOozieClient(oozieUrl);

    wc.setDebugMode(1);
// create a workflow job configuration and set the workflow application path
    Properties conf = wc.createConfiguration();
    conf.setProperty(OozieClient.APP_PATH, wfAppPath);
    conf.setProperty("jobTracker", "yarnRM");
    conf.setProperty("nameNode", "hdfs://ingestiondev");

// submit and start the workflow job
    String jobId = wc.run(conf);
    System.out.println("Workflow job submitted");

但我收到以下错误:

 org.apache.oozie.action.hadoop.JavaMainException: IO_ERROR : 
java.io.IOException: Error while connecting Oozie server. No of retries = 1. Exception = Could not authenticate, GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
      ...
 Caused by: AUTHENTICATION : Could not authenticate, GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
      ...
Caused by: org.apache.hadoop.security.authentication.client.AuthenticationException: GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
      ...
Caused by: GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)

我相信代码中还需要一些东西才能让节点/用户通过 kerberos 访问 oozie 服务器。

谁能指出在 Kerberized 集群上使用 Oozie Java API 的正确方法?

谢谢!

【问题讨论】:

    标签: hadoop kerberos oozie java


    【解决方案1】:

    错误消息是明确的:Failed to find any Kerberos tgt。您的作业在 YARN 容器中运行,在随机节点上,并且那里没有可用的 Kerberos 票证。

    您有没有想过 Oozie 如何使用您的 Kerberos 凭据开始工作,即使它不知道您的密码?那是因为它使用了内置在 Hadoop 中的后门。但是您的工作没有适当的 Kerberos 凭据,因此当您尝试执行未涵盖的操作时会看到消息。


    Oozie 如何在没有凭据的情况下管理身份验证
    • 您连接到边缘节点,使用 kinit 创建 Kerberos 票证,运行 Oozie 命令行以提交协调器(它将在特定日期和时间触发工作流)
    • Oozie CLI 使用本地 Kerberos 票证针对 Oozie 服务器进行身份验证,因此协调器(和工作流)“属于您”
    • 当 Coordinator 触发 Workflow,Workflow 启动 Action,Action 启动 YARN 作业时... Oozie 服务器对 YARN ResourceManager(通常为 oozie)进行身份验证 - 您的 Kerberos票可能早就过期了
    • 但是因为 oozie 在 YARN 配置中被定义为特权 代理帐户,因此 RM 接受在 您的 帐户下开始工作,甚至尽管您没有通过 Kerberos 正确进行身份验证
    • 这怎么可能?因为在内部 YARN 和 HDFS 使用委托令牌——通常,您使用 Kerberos 进行一次身份验证,然后您获得一个令牌,并且您对所有节点上的所有核心服务都有好处;有了 Oozie,您甚至不必进行身份验证...

    但有一个问题:委托令牌不适用于任何使用纯 Kerberos 身份验证的服务 - 即 Hive Metastore、Hive JDBC、HBase、ZooKeeper、Oozie 等。
    这就是为什么 Oozie 有一个解决方法:explicit <credential> requests 用于 Hive 操作、Hive2 操作、HBase 操作等。[免责声明:我真的不知道它是如何工作的] em>

    我怀疑这些“凭据”中的任何一个都不会对 Oozie 本身起作用......!


    如何管理自己的自定义身份验证
    1. 用你的密码在里面构建一个keytab文件(参见Linux命令ktutil
    2. 将该文件上传到 HDFS访问受限 -- 因为任何可以访问该文件的人都可以以 身份登录!!!
    3. 告诉 Oozie 将文件下载到运行 Java 操作的容器中,使用 <file> -- 它将在当前工作目录中可用,因此您不必关心实际路径
    4. 创建一个 JAAS 配置文件,向 Java 解释 “每当 Oozie REST 服务器通过 SPNEGO 请求身份验证时,使用此主体即时创建 Kerberos 票证,其密码在该密钥表文件中” em>(而不是默认的“查找票证缓存并在那里获取现有票证”
    5. 将该 JAAS 配置文件上传到 HDFS,使用另一个 <file> 等。
    6. 使用 Java 系统属性激活 JAAS 配置

    您将在我的那篇帖子中找到更多详细信息:Error when connect to impala with JDBC under kerberos authrication

    免责声明:我不知道 Oozie 期望哪个 JAAS“主题”(例如,ZooKeeper 期望 Client,Hive 期望 com.sun.security.jgss.krb5.initiate


    替代方案:忘记 JAAS 并使用缓存。
    • 将环境变量 KRB5CCNAME 设置为容器 CWD 中的临时文件(作业停止时将自动销毁)
    • 产生一个Linux命令kinit -kt myname.keytab myname@REALM,它将在KRB5CCNAME定义的缓存中获得一个Kerberos票据
    • 并让 JAAS 遵循默认流程

    【讨论】:

    • 感谢您的评论。所以我认为我们应该排除委托令牌,因为 oozie 不使用它们。甚至“凭证”也不适用于 oozie。唯一的方法是 Kerberos 身份验证。有没有办法在不部署 keytab 文件的情况下做到这一点?
    • 1. 这不是评论,这是答案 > 2.如果我知道另一种方式,我会提到它 > 3. 现在你自己了
    • 根据这篇文章,如果我的主体属于 user/host@domain 类型,那么我只能从主机启动,而不是其他节点。我的校长是上述表格。所以我想上面讨论中的kiniting也被排除了:-| ! 1.community.cloudera.com/t5/Hadoop-101-Training-Quickstart/…
    • 您的意思是您不是使用“客户端”用户帐户来运行作业,而是使用 SPN?太疯狂了! SPN 仅用于标识 Kerberos 身份验证过程中的服务。现在,停止这种废话,创建一个类似xyz_batch@REALM 的应用帐户,并使用它为应用 XYZ 运行批处理作业。
    【解决方案2】:

    Oozie 似乎不支持使用 keytab 进行身份验证。因此,您必须在程序外部生成 kerberos 票证缓存。例如,您可以在执行程序之前执行以下命令:

    kinit -kt kerberos.keytab examplePrinciple/domain@example.com
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 2015-12-02
      相关资源
      最近更新 更多