在启用Kerberos的Hadoop集群中运行Livy作业

在启用Kerberos的Hadoop集群中运行Livy作业,hadoop,authentication,kerberos,cloudera,livy,Hadoop,Authentication,Kerberos,Cloudera,Livy,我使用com.cloudera.Livy.Job类创建了一个示例Livy(Spark)应用程序,用于计算Pi的近似值(源代码:),作为jar文件导出到例如C:/path/to/the/pijob.jar 实际上,我是从另一个Main类运行此作业的,就像这样(也是从上面的链接复制并改编的): 该应用程序在外部(从我的客户机开始)的不安全Hadoop集群中完美工作。但当我尝试在支持Kerberos的集群上运行它时,它失败了 我试图在LivyClientBuilder类中设置相应的Kerberos属性

我使用
com.cloudera.Livy.Job
类创建了一个示例Livy(Spark)应用程序,用于计算Pi的近似值(源代码:),作为jar文件导出到例如
C:/path/to/the/pijob.jar

实际上,我是从另一个
Main
类运行此作业的,就像这样(也是从上面的链接复制并改编的):

该应用程序在外部(从我的客户机开始)的不安全Hadoop集群中完美工作。但当我尝试在支持Kerberos的集群上运行它时,它失败了

我试图在
LivyClientBuilder
类中设置相应的Kerberos属性:

Properties props = new Properties();
props.put("livy.environment", "production");
props.put("livy.impersonation.enabled", "true");
props.put("livy.server.auth.kerberos.keytab", "/etc/security/keytabs/spnego.service.keytab");
props.put("livy.server.auth.kerberos.principal", "HTTP/_HOST@MYCLUSTER.DE");
props.put("livy.server.auth.type", "kerberos");
props.put("livy.server.csrf_protection.enabled", "true");
props.put("livy.server.kerberos.keytab", "/etc/security/keytabs/livy.service.keytab");
props.put("livy.server.kerberos.principal", "livy/_HOST@MYCLUSTER.DE");
props.put("livy.server.port", "8998");
props.put("livy.server.session.timeout", "3600000");
props.put("livy.superusers", "zeppelin-MyCluster");

LivyClient client = new LivyClientBuilder().setAll(props).setURI(new URI(livyUrl)).build();
但我仍然得到一个例外,即需要身份验证:

Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Authentication required: <html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>
<title>Error 401 </title>
</head>
<body>
<h2>HTTP ERROR: 401</h2>
<p>Problem accessing /sessions/. Reason:
<pre>    Authentication required</pre></p>
<hr /><i><small>Powered by Jetty://</small></i>
</body>
</html>

    at com.cloudera.livy.client.http.HttpClient.propagate(HttpClient.java:185)
    at com.cloudera.livy.client.http.HttpClient.<init>(HttpClient.java:85)
    at com.cloudera.livy.client.http.HttpClientFactory.createClient(HttpClientFactory.java:38)
    at com.cloudera.livy.LivyClientBuilder.build(LivyClientBuilder.java:124)
    at livy.Main.main(Main.java:34)
Caused by: java.io.IOException: Authentication required: <html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>
<title>Error 401 </title>
</head>
<body>
<h2>HTTP ERROR: 401</h2>
<p>Problem accessing /sessions/. Reason:
<pre>    Authentication required</pre></p>
<hr /><i><small>Powered by Jetty://</small></i>
</body>
</html>

    at com.cloudera.livy.client.http.LivyConnection.sendRequest(LivyConnection.java:230)
    at com.cloudera.livy.client.http.LivyConnection.sendJSONRequest(LivyConnection.java:204)
    at com.cloudera.livy.client.http.LivyConnection.post(LivyConnection.java:180)
    at com.cloudera.livy.client.http.HttpClient.<init>(HttpClient.java:82)
    ... 3 more
线程“main”java.lang.RuntimeException中的异常:java.io.IOException:需要身份验证:
错误401
HTTP错误:401
访问/sessions/时出现问题。原因:
需要身份验证


由码头提供动力:// 位于com.cloudera.livy.client.http.HttpClient.propagate(HttpClient.java:185) 位于com.cloudera.livy.client.http.HttpClient.(HttpClient.java:85) 位于com.cloudera.livy.client.http.HttpClientFactory.createClient(HttpClientFactory.java:38) 位于com.cloudera.livy.LivyClientBuilder.build(LivyClientBuilder.java:124) 在livy.Main.Main(Main.java:34) 原因:java.io.IOException:需要身份验证: 错误401 HTTP错误:401 访问/sessions/时出现问题。原因: 需要身份验证


由码头提供动力:// 位于com.cloudera.livy.client.http.LivyConnection.sendRequest(LivyConnection.java:230) 位于com.cloudera.livy.client.http.LivyConnection.sendJSONRequest(LivyConnection.java:204) 位于com.cloudera.livy.client.http.LivyConnection.post(LivyConnection.java:180) 位于com.cloudera.livy.client.http.HttpClient.(HttpClient.java:82) ... 3个以上
这一点上的问题对我来说是:

  • 这些都是我需要的Kerberos设置吗?
    • 或者我必须添加更多内容才能登录
  • 我是否必须在我的客户机上提供配置文件/键表?
    • 或者我仍然可以使用服务器路径(就像我到目前为止所做的那样)
  • 是否有一些关于Kerberos的有用文档可供Livy使用

Livy服务道具是关于服务器端的东西。但HTTP消息似乎是关于对Livy服务的客户端身份验证。如果没有客户端凭据,“模拟”设置将无法工作…通过HTTP的Kerberos身份验证通常通过SPNego完成。关于这一点,S.O.上有很多帖子。你能解决这个问题吗,@D.Müller??我也有同样的错误,尝试了几种不同的按键设置,但没有运气。另外,关于Kerberos上Livy的文档也不存在!
Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Authentication required: <html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>
<title>Error 401 </title>
</head>
<body>
<h2>HTTP ERROR: 401</h2>
<p>Problem accessing /sessions/. Reason:
<pre>    Authentication required</pre></p>
<hr /><i><small>Powered by Jetty://</small></i>
</body>
</html>

    at com.cloudera.livy.client.http.HttpClient.propagate(HttpClient.java:185)
    at com.cloudera.livy.client.http.HttpClient.<init>(HttpClient.java:85)
    at com.cloudera.livy.client.http.HttpClientFactory.createClient(HttpClientFactory.java:38)
    at com.cloudera.livy.LivyClientBuilder.build(LivyClientBuilder.java:124)
    at livy.Main.main(Main.java:34)
Caused by: java.io.IOException: Authentication required: <html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>
<title>Error 401 </title>
</head>
<body>
<h2>HTTP ERROR: 401</h2>
<p>Problem accessing /sessions/. Reason:
<pre>    Authentication required</pre></p>
<hr /><i><small>Powered by Jetty://</small></i>
</body>
</html>

    at com.cloudera.livy.client.http.LivyConnection.sendRequest(LivyConnection.java:230)
    at com.cloudera.livy.client.http.LivyConnection.sendJSONRequest(LivyConnection.java:204)
    at com.cloudera.livy.client.http.LivyConnection.post(LivyConnection.java:180)
    at com.cloudera.livy.client.http.HttpClient.<init>(HttpClient.java:82)
    ... 3 more