使用Kerberos设置Spark SQL连接

时间:2017-12-14 21:06:21

标签: java apache-spark apache-spark-sql kerberos

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

这样的代码使用Hive或Impala连接和查询我的集群
aggregate.count()

但是现在我想尝试使用Spark SQL执行相同的查询。我很难搞清楚如何使用Spark SQL API。具体如何设置连接。我看到了如何设置Spark会话的示例,但我不清楚我需要提供哪些值,例如

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我正在使用哪种身份验证技术?例如,我正在使用Kerberos进行身份验证。

上面的Spark SQL代码来自https://github.com/apache/spark/blob/master/examples/src/main/java/org/apache/spark/examples/sql/JavaSparkSQLExample.java

更新

我能够取得一些进展,我想我想出了如何告诉Spark SQL连接使用什么主机和端口。

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

我在pom.xml文件中添加了以下依赖项

...

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

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

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

2 个答案:

答案 0 :(得分:1)

您可以在运行连接之前尝试进行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才能运行此程序。

答案 1 :(得分:0)

Dataframe creation using Impala with Kerberos authentication

我可以使用kerberos身份验证进行Impala连接。在这里查看我的git repo。也许这会有所帮助。