Database 如何使用java从安全的kerberos环境访问配置单元数据库

Database 如何使用java从安全的kerberos环境访问配置单元数据库,database,hive,hadoop2,Database,Hive,Hadoop2,我正在将hadoop与kerberos环境结合使用,而且我是kerberos新手。我想使用java访问hive数据库,我浏览了hive官方网站,但他们提供了非常概括的信息。 有人能给我一个具体的答案吗?我认为kerbrose的实现是一个非常庞大的概念,完成一个小任务可能会非常耗时。 这是你的问题的快速解决方法! 要访问蜂箱并在安全的环境中考虑以下事项: -要访问配置单元,您需要提供特定于该配置单元版本的所有JAR,如配置单元官方网站上的列表所示。 -接下来,提供特定于配置单元版本的驱动程序名称,

我正在将hadoop与kerberos环境结合使用,而且我是kerberos新手。我想使用java访问hive数据库,我浏览了hive官方网站,但他们提供了非常概括的信息。
有人能给我一个具体的答案吗?

我认为kerbrose的实现是一个非常庞大的概念,完成一个小任务可能会非常耗时。 这是你的问题的快速解决方法! 要访问蜂箱并在安全的环境中考虑以下事项: -要访问配置单元,您需要提供特定于该配置单元版本的所有JAR,如配置单元官方网站上的列表所示。 -接下来,提供特定于配置单元版本的驱动程序名称,例如用于配置单元服务器2 org.apache.hive.jdbc.HiveDriver的驱动程序名称 -提供配置单元连接URL,例如jdbc:hive2://node.addr:10000/default;主体=配置单元/节点。addr@ABCREALM.LOCAL 我们在连接URL中提供连接地址和安全认证。对于kerberos,将有身份验证字符串,这是我们在kerberos实现时设置的kerberos原则。 此字符串与我们使用beeline连接到配置单元服务器时提供的字符串相同,例如beeline-u jdbc:hive2://node.addr:10000/default;主体=配置单元/节点。addr@ABCREALM.LOCAL 下面是一个小代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Date;

public class Connect {

    private static ResultSet res;

       public static void main(String[] args) throws Exception {
              Class.forName("org.apache.hive.jdbc.HiveDriver");
              System.out.println("Process started at:"+new Date());
              Connection con = DriverManager.getConnection("jdbc:hive2://node.addr:10000/default;principal=hive/node.addr@ABCREALM.LOCAL");

              Statement stmt = con.createStatement();
              stmt.execute("create table testTable (key string,col1 string)");
              System.out.println("Table Created successfully");
              con.close();
          }
    }

我认为kerbrose的实现是一个非常庞大的概念,完成一个小任务可能会非常耗时。 这是你的问题的快速解决方法! 要访问蜂箱并在安全的环境中考虑以下事项: -要访问配置单元,您需要提供特定于该配置单元版本的所有JAR,如配置单元官方网站上的列表所示。 -接下来,提供特定于配置单元版本的驱动程序名称,例如用于配置单元服务器2 org.apache.hive.jdbc.HiveDriver的驱动程序名称 -提供配置单元连接URL,例如jdbc:hive2://node.addr:10000/default;主体=配置单元/节点。addr@ABCREALM.LOCAL 我们在连接URL中提供连接地址和安全认证。对于kerberos,将有身份验证字符串,这是我们在kerberos实现时设置的kerberos原则。 此字符串与我们使用beeline连接到配置单元服务器时提供的字符串相同,例如beeline-u jdbc:hive2://node.addr:10000/default;主体=配置单元/节点。addr@ABCREALM.LOCAL 下面是一个小代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Date;

public class Connect {

    private static ResultSet res;

       public static void main(String[] args) throws Exception {
              Class.forName("org.apache.hive.jdbc.HiveDriver");
              System.out.println("Process started at:"+new Date());
              Connection con = DriverManager.getConnection("jdbc:hive2://node.addr:10000/default;principal=hive/node.addr@ABCREALM.LOCAL");

              Statement stmt = con.createStatement();
              stmt.execute("create table testTable (key string,col1 string)");
              System.out.println("Table Created successfully");
              con.close();
          }
    }

使用Kerberos,一切都会变得更复杂

任何jdbc代码之前的配置:

进口:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.log4j.Logger;
初始化配置代码:

Configuration systemConf = new Configuration();
        if (isLocalRun()) {
            LOG.info("Running on cluster, using hive-site.xml config");
            systemConf.addResource(new Path("/etc/hadoop/current/hive/hive-site.xml"));
        } else {
            LOG.info("Running from local computer, no hive-site.xml added, using only JDBC");
        }
        systemConf.set("hadoop.security.authentication", "Kerberos");
        UserGroupInformation.setConfiguration(systemConf);
        UserGroupInformation.loginUserFromKeytab(principal, keytabPath);
然后您可以获得连接:

 try (Connection conn = DriverManager.getConnection(conf.hive().getConnectionString())) {
            HiveDatabaseMetaData metadata = (HiveDatabaseMetaData) conn.getMetaData();
            parseDatabase(hiveDatabase, conn, metadata, 
        }
配置单元jdbc驱动程序的maven依赖项

    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-jdbc</artifactId>
        <version>2.0.0</version>
        <classifier>standalone</classifier>
    </dependency>
isLocalRun=这取决于是在计算机中运行还是直接在集群上运行 在集群上运行时,您需要添加hive-site.xml,它可能会有所不同 路径比本例中所有配置的路径都要长 从本地将jdbc连接字符串用于外部集群连接
使用Kerberos,一切都会变得更复杂

任何jdbc代码之前的配置:

进口:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.log4j.Logger;
初始化配置代码:

Configuration systemConf = new Configuration();
        if (isLocalRun()) {
            LOG.info("Running on cluster, using hive-site.xml config");
            systemConf.addResource(new Path("/etc/hadoop/current/hive/hive-site.xml"));
        } else {
            LOG.info("Running from local computer, no hive-site.xml added, using only JDBC");
        }
        systemConf.set("hadoop.security.authentication", "Kerberos");
        UserGroupInformation.setConfiguration(systemConf);
        UserGroupInformation.loginUserFromKeytab(principal, keytabPath);
然后您可以获得连接:

 try (Connection conn = DriverManager.getConnection(conf.hive().getConnectionString())) {
            HiveDatabaseMetaData metadata = (HiveDatabaseMetaData) conn.getMetaData();
            parseDatabase(hiveDatabase, conn, metadata, 
        }
配置单元jdbc驱动程序的maven依赖项

    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-jdbc</artifactId>
        <version>2.0.0</version>
        <classifier>standalone</classifier>
    </dependency>
isLocalRun=这取决于是在计算机中运行还是直接在集群上运行 在集群上运行时,您需要添加hive-site.xml,它可能会有所不同 路径比本例中所有配置的路径都要长 从本地将jdbc连接字符串用于外部集群连接
另外,如果您没有可用的Kerberos票证(例如,您的代码在Windows上运行),则必须告诉Java如何使用Kerberos配置文件以及指向存储加密密码的密钥表文件的JAAS配置文件动态创建票证。此外,如果您没有可用的Kerberos票证(例如,您的代码在Windows上运行),则,您必须告诉Java如何使用Kerberos配置文件以及指向存储加密密码的KeyTab文件的JAAS配置文件动态创建票据。