目录

一、Hive的远程模式

1、创建临时目录

2、前期准备工作

3、开始配置远程服务(两个)

1)配置hiveserver2服务

2) metastore 服务

4、使用客户端连接工具连接hive

二、一个启动命令


一、Hive的远程模式

比如:你想通过DataGrip操作hive,这个时候必须开启远程模式。

1、创建临时目录

[root@bigdata01 ~]# cd /opt/installs/hive/
[root@bigdata01 hive]# mkdir iotmp
[root@bigdata01 hive]# chmod 777 iotmp

2、前期准备工作

<!--Hive工作的本地临时存储空间-->
<property>
    <name>hive.exec.local.scratchdir</name>
    <value>/opt/installs/hive/iotmp/root</value>
</property>
<!--如果启用了日志功能,则存储操作日志的顶级目录-->
<property>
    <name>hive.server2.logging.operation.log.location</name>
    <value>/opt/installs/hive/iotmp/root/operation_logs</value>
</property>
<!--Hive运行时结构化日志文件的位置-->
<property>
    <name>hive.querylog.location</name>
    <value>/opt/installs/hive/iotmp/root</value>
</property>
<!--用于在远程文件系统中添加资源的临时本地目录-->
<property>
    <name>hive.downloaded.resources.dir</name>
    <value>/opt/installs/hive/iotmp/${hive.session.id}_resources</value>
</property>

hive.downloaded.resources.dir:

在 hdfs 上下载的一些资源会被存放在这个目录下,hive 一定要小写,否则报:

cause: java.net.URISyntaxException: Illegal character in path at index 26: /opt/installs/hive/iotmp/${Hive.session.id}_resources/json-serde-1.3.8-jar-with-dependencies.jar

修改 core-site.xml【hadoop】的

<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.http.staticuser.user</name>
    <value>root</value>
</property>
<!-- 不开启权限检查 -->
<property>
   <name>dfs.permissions.enabled</name>
   <value>false</value>
</property>

修改集群的三个core-site.xml,记得修改一个,同步一下,并且重启hdfs

xsync.sh core-site.xml
stop-dfs.sh
start-dfs.sh

3、开始配置远程服务(两个)

1)配置hiveserver2服务

修改hive-site.xml

<property>
    <name>hive.server2.thrift.bind.host</name>
    <value>bigdata01</value>
    <description>Bind host on which to run the HiveServer2 Thrift service.</description>
  </property>
  <property>
    <name>hive.server2.thrift.port</name>
    <value>10000</value>
    <description>Port number of HiveServer2 Thrift interface when hive.server2.transport.mode is 'binary'.</description>
  </property>

可以启动:

1. 该服务端口号默认是10000
2. 可以单独启动此服务进程,供远程客户端连接;此服务内置metastore服务。
3. 启动方式:
   方法1:
       直接调用hiveserver2。会进入监听状态不退出。
   方法2:
       hive --service hiveserver2 &    # 进入后台启动
   方法3:
      nohup hive --service hiveserver2 >/dev/null 2>&1 & #信息送入黑洞。

演示第一种启动方式:hiveserver2

可以使用beeline进行测试:

连接方式:
方式1:
   	step1. beeline 回车
   	step2. !connect jdbc:hive2://bigdata01:10000 回车
   	step3. 输入用户名 回车 数据库用户名
   	step4. 输入密码 回车  此处的密码是数据库密码
方法2(直连):
	beeline -u jdbc:hive2://bigdata01:10000 -n 用户名
解析: 
	hive2,是Hive的协议名称
	ip:  Hiveserver2服务所在的主机IP。
	10000,是Hiveserver2的端口号
退出:
    Ctrl+ C 可以退出客户端
2) metastore 服务

metastore服务意义:为别人连接mysql元数据提供服务的。

警告:

假如 hive 直接进入的,操作了数据库,其实底层已经帮助创建了一个metastore服务器,可能叫ms01

通过hiveserver2 运行的命令,默认底层帮你创建了一个metastore服务器,可能叫ms02,假如有很多人连接我的mysql,就会有很多个metastore,非常的占用资源。

解决方案就是:配置一个专门的metastore,只有它可以代理mysql服务,别人必须经过它跟mysql进行交互。这样解决内存。

警告:只要配置了metastore以后,必须启动,否则报错!

修改hive-site.xml

   修改hive-site.xml的配置
   注意:想要连接metastore服务的客户端必须配置如下属性和属性值
    <property>
        <name>hive.metastore.uris</name> 
        <value>thrift://bigdata01:9083</value>
    </property>

    解析:thrift:是协议名称
         ip为metastore服务所在的主机ip地址
         9083是默认端口号

启动方式:

方法1:
		hive --service metastore &
方法2:
    	nohup hive --service metastore 2>&1 >/dev/null &  #信息送入黑洞。
         解析:2>&1 >/dev/null   意思就是把错误输出2重定向到标准输出1,也就是屏幕,标准输出进了“黑洞”,也就是标准输出进了黑洞,错误输出打印到屏幕。
              Linux系统预留可三个文件描述符:0、1和2,他们的意义如下所示:
                0——标准输入(stdin)-- System.in
                1——标准输出(stdout)--System.out
                2——标准错误(stderr) --System.err

测试:

没有启动metastore 服务器之前,hive进入报错!
hive> show databases;
FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

启动之后,直接测试,发现可以使用。
hive> show databases;
OK
default
Time taken: 1.211 seconds, Fetched: 1 row(s)

4、使用客户端连接工具连接hive

常见的Hive连接工具有:IDEA、DBeaver、DataGrap

推荐大家使用DataGrap

下载驱动包:

二、一个启动命令

经常启动metastore 以及hiveserver2这两个服务,命令有点长,为了长期使用,可以编写一个命令:

#!/bin/bash

# hive 服务控制脚本,可以控制 Hive 的 metastore 和 hiveserver2 服务的启停
# 使用方式: hive-server-manager.sh [start|stop|status] [metastore|hiveserver2]
#   - start  : 一键开启metastore和hiveserver2服务,也可以指定服务开启
#   - stop   : 一键停止metastore和hiveserver2服务,也可以指定服务停止
#   - status : 一键查看metastore和hiveserver2服务,也可以指定服务查看

help_info() {
    echo "+---------------------------------------------------------------------------------+"
    echo "|             本脚本可以一键控制 Hive 的 metastore 和 hiveserver2 服务            |"
    echo "| 使用方式: hive-server-manager.sh [start|stop|status] [metastore|hiveserver2]    |"
    echo "+---------------------------------------------------------------------------------+"
    echo "| 第一个参数用来指定操作命令,可以选择 开始(start)、停止(stop)、状态查看(status)  |"
    echo "| 第二个参数用来指定操作的服务,可以选择 metastore、hiveserver2,默认为全部       |"
    echo "+---------------------------------------------------------------------------------+"
    echo "|     - start  : 一键开启metastore和hiveserver2服务,也可以指定服务开启           |"
    echo "|     - stop   : 一键停止metastore和hiveserver2服务,也可以指定服务停止           |"
    echo "|     - status : 一键查看metastore和hiveserver2服务,也可以指定服务查看           |"
    echo "+---------------------------------------------------------------------------------+"
    exit -1
}


# 获取操作命令
op=$1
# 获取操作的服务
server=$2


# 检查参数是否正确
if [ ! $op ]; then
    help_info
elif [ $op != "start" -a $op != "stop" -a $op != "status" ]; then
    help_info
fi

# 检查进程状态
metastore_pid=`ps aux | grep org.apache.hadoop.hive.metastore.HiveMetaStore | grep -v grep | awk '{print $2}'`
hiveserver2_pid=`ps aux | grep proc_hiveserver2 | grep -v grep | awk '{print $2}'`

# 检查日志文件夹的存在情况,如果不存在则创建这个文件夹
log_dir=/var/log/my_hive_log
if [ ! -e $log_dir ]; then
    mkdir -p $log_dir
fi
# 开启服务
start_metastore() {
    # 检查是否开启,如果未开启,则开启 metastore 服务
    if [ $metastore_pid ]; then
        echo "metastore   服务已经开启,进程号: $metastore_pid,已跳过"
    else
        nohup hive --service metastore >> $log_dir/metastore.log 2>&1 &
        echo "metastore   服务已经开启,日志输出在 $log_dir/metastore.log"
    fi
}
start_hiveserver2() {
    # 检查是否开启,如果未开启,则开启 hiveserver2 服务
    if [ $hiveserver2_pid ]; then
        echo "hiveserver2 服务已经开启,进程号: $hiveserver2_pid,已跳过"
    else
        nohup hive --service hiveserver2 >> $log_dir/hiveserver2.log 2>&1 &
        echo "hiveserver2 服务已经开启,日志输出在 $log_dir/hiveserver2.log"
    fi 
}

# 停止服务
stop_metastore() {
    if [ $metastore_pid ]; then
        kill -9 $metastore_pid
    fi
    echo "metastore   服务已停止" 
}
stop_hiveserver2() {
    if [ $hiveserver2_pid ]; then 
        kill -9 $hiveserver2_pid
    fi
    echo "hiveserver2 服务已停止"
}

# 查询服务
status_metastore() {
    if [ $metastore_pid ]; then
        echo "metastore   服务已开启,进程号: $metastore_pid"
    else
        echo "metastore   服务未开启"
    fi
}
status_hiveserver2() {
    if [ $hiveserver2_pid ]; then
        echo "hiveserver2 服务已开启,进程号: $hiveserver2_pid"
    else
        echo "hiveserver2 服务未开启"
    fi
}

# 控制操作
if [ ! $server ]; then
    ${op}_metastore
    ${op}_hiveserver2
elif [ $server == "metastore" ]; then
    ${op}_metastore
elif [ $server == "hiveserver2" ]; then
    ${op}_hiveserver2
else
    echo "服务选择错误"
    help_info
fi

上传,赋予权限:

[root@bigdata01 ~]# cd /usr/local/bin
[root@bigdata01 bin]# chmod u+x hive-server-manager.sh

[root@bigdata01 bin]# hive-server-manager.sh status metastore
metastore   服务已开启,进程号: 119769
[root@bigdata01 bin]# hive-server-manager.sh status
metastore   服务已开启,进程号: 119769
hiveserver2 服务未开启
Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐