如何使用Java连接Kerberos的Phoenix

简介: 如何使用Java连接Kerberos的Phoenix


文档编写目的

本文主要介绍如何使用Java代码访问Kerberos环境下的Phoenix5.0。

  1. 内容概述
  • 代码编写
  • 验证
  • 总结
  1. 测试环境
  • CM和CDH版本均为7.1.1
  • Phoenix版本为5.0.0
  • 集群已启用Kerberos

代码编写

1.1 集群环境

CM和CDH版本均为7.1.1

集群已启用Kerberos认证

使用Phoenix查看HBase表情况

phoenix-sqlline
!tables

1.2 编写Java代码

创建一个Maven工程pro-phoenix

添加Maven依赖,pom.xml文件如下:


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.apress.phoenix</groupId>
    <artifactId>pro-phoenix</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <!--<phoenix.version>5.0.0-HBase-2.0</phoenix.version>-->
        <phoenix.version>5.0.0-HBase-2.0</phoenix.version>
        <hadoop.version>2.7.1</hadoop.version>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.phoenix</groupId>
            <artifactId>phoenix-core</artifactId>
            <version>${phoenix.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>hadoop-auth</artifactId>
                    <groupId>org.apache.hadoop</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>hadoop-hdfs</artifactId>
                    <groupId>org.apache.hadoop</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <artifactId>hadoop-auth</artifactId>
            <groupId>org.apache.hadoop</groupId>
            <version>${hadoop.version}</version>
        </dependency>        
  <dependency>
            <artifactId>hadoop-hdfs</artifactId>
            <groupId>org.apache.hadoop</groupId>
            <version>${hadoop.version}</version>
        </dependency>
        <dependency>
            <artifactId>hadoop-common</artifactId>
            <groupId>org.apache.hadoop</groupId>
            <version>${hadoop.version}</version>
        </dependency>
     </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.0</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

新建Kerberos用户hbase/_HOST@HADOOP.COM,并导出keytab文件

kadmin.local
addprinc hbase/_HOST@HADOOP.COM
xst -norandkey -k hbasehost.keytab hbase/_HOST@HADOOP.COM

在项目工程目录下创建conf目录,并将krb5.conf和keytab文件拷贝到该目录下

hbase-site.xml文件拷贝到Maven工程下的resources目录下

在工程下创建测试类PhoenixKrbTest.java,代码如下:

package com.apress.phoenix.chapter3;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.log4j.Logger;
import org.apache.phoenix.jdbc.PhoenixConnection;
import java.io.IOException;
import java.sql.*;
public class PhoenixKrbTest {
    private static Logger log = Logger.getLogger(PhoenixKrbTest.class);
    /**
     * 获取连接
     */
    public Connection getConn() {
        // 连接hadoop环境,进行 Kerberos认证
        Configuration conf = new Configuration();
        conf.set("hadoop.security.authentication", "Kerberos");
        // linux 环境会默认读取/etc/nokrb.cnf文件,win不指定会默认读取C:/Windows/krb5.ini
        /*if (System.getProperty("os.name").toLowerCase().startsWith("win")) {
            System.setProperty("java.security.krb5.conf", "/conf/krb5.conf");
        }*/
        System.setProperty("java.security.krb5.conf", "conf/krb5.conf");
        UserGroupInformation.setConfiguration(conf);
        Connection conn = null;
        try {
            UserGroupInformation.loginUserFromKeytab("hbase/_HOST@HADOOP.COM", "conf/hbasehost.keytab");
            Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
            // kerberos环境下Phoenix的jdbc字符串为 jdbc:phoenix:zk:2181:/znode:principal:keytab
            String url = "jdbc:phoenix:cdp2.hadoop.com:2181:/hbase:hbase/_HOST@HADOOP.COM:conf/hbasehost.keytab";
            conn = DriverManager.getConnection(url).unwrap(PhoenixConnection.class);
        } catch (ClassNotFoundException e) {
            log.error(e.getMessage());
            e.printStackTrace();
        } catch (SQLException e1) {
            log.error(e1.getMessage());
            e1.printStackTrace();
        } catch (IOException e2) {
            log.error(e2.getMessage());
            e2.printStackTrace();
        }
        return conn;
    }
    /**
     * 对表执行操作
     * 通过phoenix 创建表、插入数据、索引、查询数据
     */
    public void operTable() {
        Connection conn = getConn();
        ResultSet rs = null;
        Statement stmt = null;
        try {
            stmt = conn.createStatement();
            stmt.execute("DROP TABLE if EXISTS testjdbc");
            stmt.execute("CREATE TABLE testjdbc (id INTEGER NOT NULL PRIMARY KEY, content VARCHAR)");
            // 创建二级索引
//            stmt.execute("create index test_idx on testjdbc(content)");
            // 循环插入数据
            for (int i = 1; i <= 100; i++) {
                stmt.executeUpdate("upsert INTO testjdbc VALUES (" + i + ",'The num is " + i + "')");
            }
            conn.commit();
            PreparedStatement statement = conn.prepareStatement("SELECT * FROM testjdbc limit 10");
            rs = statement.executeQuery();
            while (rs.next()) {
                log.info("-------------The num is ---------------" + rs.getInt(1));
                String id = rs.getString("id");
                String content = rs.getString("content");
                System.out.println("id = " + id + "; " + "content = " + content);
            }
        } catch (SQLException e) {
            log.error(e.getMessage());
            e.printStackTrace();
        } finally {
            closeRes(conn, stmt, rs);
        }
    }
    /**
     * 关闭资源
     *
     * @param conn
     * @param statement
     * @param rs
     */
    public void closeRes(Connection conn, Statement statement, ResultSet rs) {
        try {
            if (conn != null) {
                conn.close();
            }
            if (statement != null)
                statement.close();
            if (rs != null)
                rs.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        PhoenixKrbTest test = new PhoenixKrbTest();
        test.operTable();
    }
}

1.3 示例代码执行

在IDEA中运行编写好的代码,代码执行情况如下:

验证

kinit hbase
klist


Phoenix终端验证

登录Phoenix,查看表信息如下

phoenix-sqlline
!tables

如上所示,testjdbc表已被创建。

查看testjdbc表中数据

select * from testjdbc limit 10;

如上所示,与IDEA中查询的数据一致

HBase shell验证

登录HBase shell,查看当前已存在的表

hbase shell
list

查看表中数据

1. scan 'TESTJDBC',{LIMIT => 10}

如上所示,与IDEA以及Phoenix终端中查询数据一致。

总结

  • Kerberos环境下需要krb5.conf和keytab文件,并且需要在代码中执行principal。
  • Kerberos环境需要hbase-site.xml文件,只需将该文件放在项目工程下的resources目录下即可
  • 在访问HBase时,实际上是先访问的Zookeeper,所以代码中需要配置Zookeeper集群的url。
  • 访问Kerberos,JDK需要启用无限制强度加密,jdk1.8.0_160以上默认启用


相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4月前
|
存储 Java 关系型数据库
高效连接之道:Java连接池原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。频繁创建和关闭连接会消耗大量资源,导致性能瓶颈。为此,Java连接池技术通过复用连接,实现高效、稳定的数据库连接管理。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接池的基本操作、配置和使用方法,以及在电商应用中的具体应用示例。
118 5
|
1月前
|
消息中间件 存储 NoSQL
java连接redis和基础操作命令
通过以上内容,您可以掌握在Java中连接Redis以及进行基础操作的基本方法,进而在实际项目中灵活应用。
109 30
|
2月前
|
Java Linux 数据库
java连接kerberos用户认证
java连接kerberos用户认证
84 22
|
2月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
90 2
|
5月前
|
Java 关系型数据库 MySQL
如何用java的虚拟线程连接数据库
本文介绍了如何使用Java虚拟线程连接数据库,包括设置JDK版本、创建虚拟线程的方法和使用虚拟线程连接MySQL数据库的示例代码。
111 6
如何用java的虚拟线程连接数据库
|
4月前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
93 3
|
5月前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
464 6
|
4月前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
90 1
|
4月前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
96 1
|
5月前
|
SQL 存储 Java
Java中使用ClickHouseDriver连接和基本操作
通过上述步骤,你可以轻松地在Java应用中集成ClickHouse数据库,执行基本的CRUD操作。需要注意的是,实际开发中应当根据实际情况调整数据库连接配置(如URL中的主机、端口、数据库名等),并根据应用需求选择合适的异常处理策略,确保代码的健壮性和资源的有效管理。此外,对于复杂查询和大批量数据处理,建议充分利用ClickHouse的特性(如分布式处理、列式存储优化等),以进一步提升性能。
405 2

热门文章

最新文章