与Kerberos建立Spark SQL连接



我有一个简单的Java应用程序,可以使用

之类的代码使用Hive或Impala连接和查询我的群集
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
...
Class.forName("com.cloudera.hive.jdbc41.HS2Driver");
Connection con = DriverManager.getConnection("jdbc:hive2://myHostIP:10000/mySchemaName;hive.execution.engine=spark;AuthMech=1;KrbRealm=myHostIP;KrbHostFQDN=myHostIP;KrbServiceName=hive");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from foobar");

,但是现在我想尝试进行相同的查询,但是使用Spark SQL。我很难弄清楚如何使用Spark SQL API。特别是如何设置连接。我看到了如何设置Spark会话的示例,但目前尚不清楚我需要提供什么值,例如

  SparkSession spark = SparkSession
  .builder()
  .appName("Java Spark SQL basic example")
  .config("spark.some.config.option", "some-value")
  .getOrCreate();

如何告诉Spark SQL使用什么主机和端口,使用什么模式以及如何告诉Spark SQL我正在使用哪种身份验证技术?例如,我正在使用Kerberos进行身份验证。

上面的SPARK SQL代码来自https://github.com/apache/spark/spark/blob/master/master/examples/src/main/java/java/opache/apache/sparke/spark/spark/spark/sql/sql/javasparksqlexsqlexlexplame.javaplample.javaplample.javaplample.jjaplample.jjaplampl>

更新:

我能够取得一点进步,我想我想出了如何告诉Spark SQL连接使用哪种主机和端口。

...
SparkSession spark = SparkSession
.builder()
.master("spark://myHostIP:10000")
.appName("Java Spark Hive Example")
.enableHiveSupport()
.getOrCreate();

我在我的pom.xml文件中添加了以下依赖关系

<dependency>
   <groupId>org.apache.spark</groupId>
   <artifactId>spark-hive_2.11</artifactId>
   <version>2.0.0</version>
</dependency>

通过此更新,我可以看到连接正在进一步发展,但由于我没有经过身份验证,现在看来已经失败了。我需要弄清楚如何使用kerberos进行身份验证。这是相关的日志数据

2017-12-19 11:17:55.717  INFO 11912 --- [o-auto-1-exec-1] org.apache.spark.util.Utils              : Successfully started service 'SparkUI' on port 4040.
2017-12-19 11:17:55.717  INFO 11912 --- [o-auto-1-exec-1] org.apache.spark.ui.SparkUI              : Bound SparkUI to 0.0.0.0, and started at http://myHostIP:4040
2017-12-19 11:17:56.065  INFO 11912 --- [er-threadpool-0] s.d.c.StandaloneAppClient$ClientEndpoint : Connecting to master spark://myHostIP:10000...
2017-12-19 11:17:56.260  INFO 11912 --- [pc-connection-0] o.a.s.n.client.TransportClientFactory    : Successfully created connection to myHostIP:10000 after 113 ms (0 ms spent in bootstraps)
2017-12-19 11:17:56.354  WARN 11912 --- [huffle-client-0] o.a.s.n.server.TransportChannelHandler   : Exception in connection from myHostIP:10000
java.io.IOException: An existing connection was forcibly closed by the remote host

您可以在运行连接之前尝试进行kerberos登录:

        Configuration conf = new Configuration();
        conf.set("fs.hdfs.impl", DistributedFileSystem.class.getName());            
        conf.addResource(pathToHdfsSite);
        conf.addResource(pathToCoreSite);
        conf.set("hadoop.security.authentication", "kerberos");
        conf.set("hadoop.rpc.protection", "privacy");
        UserGroupInformation.setConfiguration(conf);
        UserGroupInformation.loginUserFromKeytab(ktUserName, ktPath);
        //your code here

ktusername在这里是主要的,例如-user@test.com并且您需要在计算机上使用Core-Site.xml,HDFS-Site.xml和Keytab来运行此操作。

使用Impala与Kerberos身份验证的Impala创建

我能够与Kerberos身份验证进行Impala连接。在这里查看我的git仓库。也许这会有所帮助。

相关内容

  • 没有找到相关文章

最新更新