DataGrip 配置 HiveServer2 远程连接访问(含账号密码验证)

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 该文档介绍了如何为HiveServer2配置账号密码鉴权。提供了一个名为`CustomPasswdAuthenticator`的Java类实现`PasswdAuthenticationProvider`接口,用于验证HiveServer2的用户名和密码。此外,还给出了相关依赖的Maven配置,并说明了如何将编译后的Jar包放入Hive的库中。在Hive的`hive-site.xml`和Hadoop的`core-site.xml`中需配置相应的参数以启用自定义认证。文档还列举了可能遇到的问题及解决方法,包括权限问题、数据插入错误和JVM内存溢出。

@[toc]

编译 HiveServer2 账号密码鉴权类

如果 你不想 通过账号密码的方式使用 HiveServer2 服务,那么你可以直接跳过这一步骤。

账号密码鉴权类

在使用 HiveServer2 连接服务时,对设置的 HiveServer2 账号密码,进行鉴权操作。

package org.apache.hadoop.hive.contrib.auth;

/**
 * @author Moon_coder
 * @version 1.0
 * @date 2023/8/20 17:40
 */

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hive.service.auth.PasswdAuthenticationProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.security.sasl.AuthenticationException;

public class CustomPasswdAuthenticator implements PasswdAuthenticationProvider {
   
   

    private Logger LOG = LoggerFactory.getLogger(CustomPasswdAuthenticator.class);

    private static final String HIVE_JDBC_PASSWD_AUTH_PREFIX = "hive.jdbc_passwd.auth.%s";

    private Configuration conf = null;

    public CustomPasswdAuthenticator() {
   
   }

    @Override
    public void Authenticate(String userName, String passwd) throws AuthenticationException {
   
   
        LOG.info("user: " + userName + " try login.");
        String passwdConf = this.getConf().get(String.format("hive.jdbc_passwd.auth.%s", userName));
        String message;

        if (passwdConf == null) {
   
   
            message = "user's ACL configration is not found. user:" + userName;
            LOG.info(message);
            throw new AuthenticationException(message);} else if (!passwd.equals(passwdConf)) {
   
   
            message = "user name and password is mismatch. user:" + userName;throw new AuthenticationException(message);
        }
    }

    public Configuration getConf() {
   
   
        if (this.conf == null) {
   
   
            this.conf = new Configuration(new HiveConf());
        }
        return this.conf;
    }

    public void setConf(Configuration conf) {
   
   
        this.conf = conf;
    }

}

对应依赖

相关版本自行修改。

<dependencies>
        <!-- Hadoop Common -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.1.3</version>
        </dependency>

        <!-- Hive JDBC -->
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>3.1.2</version>
        </dependency>

        <!-- SLF4J API -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.32</version>
        </dependency>

        <!-- SLF4J Simple Binding (for logging) -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.32</version>
            <scope>runtime</scope>
        </dependency>
</dependencies>

编译成 Jar 包

在 IDEA 中编译成 Jar 包,将其上传到 $HIVE_HOME/lib/ 目录下,包名无所谓。

这里我将编译好的包进行了上传,不想编译的可以直接下载:

hiveserver2_verify.jar

集群配置 HiveServer2 服务

1.在 Hive 的配置文件 hive-site.xml 中添加如下参数:

如果你未设置账号密码验证,不想使用账号密码,仅用作测试,则不要添加下文中的最后三项配置!!!会导致无法启动 HiveServer2,因为它无法找到对应解析类。
        <!-- 指定 HiveServer2 运行端口,默认为:10000 -->
        <property>
                <name>hive.server2.thrift.port</name>
              <value>10000</value>
        </property>

        <!-- 设置连接主机,注意更换成你自己连接的主机地址。 -->
        <property>
               <name>hive.server2.thrift.bind.host</name>
               <value>master</value>
         </property>

        <!-- 设置权限用户 -->
        <property>
                <name>hive.users.in.admin.role</name>
                <value>root</value>
        </property>    

        <!--自定义远程连接用户名和密码 默认为none,修改成CUSTOM-->
        <property>
            <name>hive.server2.authentication</name>
            <value>CUSTOM</value>
        </property>

        <!--指定解析jar包-->
        <property>
            <name>hive.server2.custom.authentication.class</name>
            <value>org.apache.hadoop.hive.contrib.auth.CustomPasswdAuthenticator</value>
        </property>

        <!--设置用户名和密码-->
        <property>
             <name>hive.jdbc_passwd.auth.root</name><!--用户名为最后一个:root-->
             <value>000000</value><!--密码-->
        </property>

2.在 Hadoop 的核心配置文件 core-site.xml 中添加如下两项参数:

指定集群可以连接的用户,我这里设置为 root 用户。

假如我想指定用户名为 master,则配置项中的 root 必须改为 master,如:hadoop.proxyuser.master.hosts

    <!-- 设置集群的连接用户 -->
    <property>
        <name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
    </property>

    <property>
           <name>hadoop.proxyuser.root.groups</name>
        <value>*</value>
    </property>

添加完成后注意分发该文件到其它机器,然后重启 Hadoop。

Hadoop 重启完成后,启动 hive 元数据服务与 hiveserver2 服务:

nohup hive --service metastore &

nohup hive --service hiveserver2 &

连接测试:

连接你绑定的地址并根据提示输入 Hive 的配置文件 hive-site.xml 中指定的用户与其密码。

beeline

!connect jdbc:hive2://master:10000

根据提示输入账号密码(默认都为空,直接按回车跳过即可)

image.png

下列是本人遇到的相关问题以及解决方法。

问题一

连接时出现错误:User: xxx is not allowed to impersonate anonymous (state=08S01,code=0),显示该用户不被允许连接,这是因为在 Hadoop 的核心配置文件 core-site.xml 中没有指定该用户(上方有添加用户模板)或者指定后 Hadoop 集群没有重启,导致配置没有生效。

问题二

如果你在通过 hiveserver2 服务远程插入数据时出现如下错误:FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.StatsTask

解决方法:
在插入的目标库中设置属性 set hive.stats.autogather=false;,关闭配置自动统计列的统计信息。


问题三

使用 HiveServer2 服务时异常停止,JVM 内存溢出:

FAILED: Execution Error, return code -101 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. Java heap space Exception in thread "HiveServer2-Handler-Pool: Thread-652" java.lang.OutOfMemoryError: GC overhead limit exceeded

解决方法:
修改 Hive 中 conf 目录下的 hive-env.sh 文件,将 export HADOOP_HEAPSIZE=1024 进行调整,可以修改为 4096,视情况而定;

image.png

保存退出,重新启动服务就可以啦。

DataGrip 配置 HiveServer2 访问 Hive

1. 调出控制面板,创建连接:

image.png

选择 Hive 数据源。

image.png

2.配置相关连接信息

账号密码如果没有设置则都为空,密码输入框为隐式显示。

image.png

点击 Test Connection 测试连接是否成功,然后下载集群 HiveServer2 远程连接 JDBC 对应驱动版本。

image.png

驱动下载完成后,弹出对应提示:

image.png

此时点击 OK 配置完成,可以发现驱动版本与集群是一致的。

image.png

3.使用

不做过多的赘述了,使用起来还是特别简单便捷的,没有啥难度可言。

image.png

相关文章
|
4月前
|
关系型数据库 MySQL 数据安全/隐私保护
windows mysql8 安装后 提示密码不对,修改下密码认证方式就可以了
windows mysql8 安装后 提示密码不对,修改下密码认证方式就可以了
1099 3
|
4月前
|
数据安全/隐私保护
Navicate如何查看密码
Navicate如何查看密码
|
6月前
|
关系型数据库 网络安全 数据库
通过SSH登录OceanBase数据库需要修改用户密码,然后使用SSH客户端进行远程登录
通过SSH登录OceanBase数据库需要修改用户密码,然后使用SSH客户端进行远程登录
272 6
|
监控 关系型数据库 MySQL
|
数据库 数据安全/隐私保护
阿里云虚拟主机:怎么查看FTP帐号、密码、IP?怎么查看数据库账号、地址和密码等?
本文介绍阿里云虚拟主机:怎么查看FTP帐号、密码、IP?怎么查看数据库账号、地址和密码等?购买前请先:领取阿里云幸运券,有很多优惠,下文中有领取链接。 购买建议多买几年,年数越多优惠越多。
11559 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 20 章 客户端认证_20.2. 用户名映射
20.2. 用户名映射 当使用像 Ident 或者 GSSAPI 之类的外部认证系统时,发起连接的操作系统用户名可能不同于要使用的数据库用户(角色)。在这种情况下,一个用户名映射可被用来把操作系统用户名映射到数据库用户。
1537 0
|
安全 关系型数据库 MySQL
开启MySQL远程访问权限 允许远程连接
开启MySQL远程访问权限 允许远程连接 问题:在本机上的linux系统布个小服务,无法连接我Windows系统的mysql数据库 查看百度才知道MySql-Server 出于安全方面考虑默认只允许本机(localhost, 127.0.0.1)来连接访问. 所以开启远程访问权限。
8147 0
|
分布式计算 Linux 网络安全
Hadoop集群最迅速的配置免密码登陆方法
1:多台机器互相免密登陆的思路(默认你的linux操作系统已经安装好ssh): 第一步:在各自的机器上面生成密钥:   在第1台机器上生产一对钥匙: ssh-keygen -t rsa   在第2台机器上生产一对钥匙: ssh-keygen -t rsa   在第3台机器上生产一对钥匙: ssh-keygen -t rsa   .
1258 0
|
SQL 应用服务中间件 数据库