本文最后更新于 2024-02-29,文章内容可能已经过时。

Hive部署

1.1 安装Hive

1)把apache-hive-3.1.3-bin.tar.gz上传到Linux的/opt/software目录下

2)解压apache-hive-3.1.3-bin.tar.gz到/opt/module/目录下面

[cloverdo@hdp1 software]$ tar -zxvf /opt/software/apache-hive-3.1.3-bin.tar.gz -C /opt/module/

3)修改apache-hive-3.1.3-bin.tar.gz的名称为hive

[cloverdo@hdp1 software]$ mv /opt/module/apache-hive-3.1.3-bin/ /opt/module/hive-3.1.3

4)修改/etc/profile.d/my_env.sh,添加环境变量

[cloverdo@hdp1 software]$ sudo vim /etc/profile

(1)添加内容

#HIVE_HOME
export HIVE_HOME=/opt/module/hive-3.1.3
export PATH=$PATH:$HIVE_HOME/bin

(2)source一下

[cloverdo@hdp1 hive]$ source /etc/profile

5)初始化元数据库(默认是derby数据库)

[cloverdo@hdp1 hive]$ bin/schematool -dbType derby -initSchema

1.2 使用Hive默认数据库启动(derby)已弃用

1)启动Hive

[cloverdo@hdp1 hive]$ bin/hive

2)使用Hive

hive> show databases;
hive> show tables;
hive> create table stu(id int, name string);
hive> insert into stu values(1,"ss");
hive> select * from stu;

观察HDFS的路径/user/hive/warehouse/stu,体会Hive与Hadoop之间的关系。

Hive中的表在Hadoop中是目录;Hive中的数据在Hadoop中是文件。

3)在Xshell窗口中开启另一个窗口开启Hive,在/tmp/cloverdo目录下监控hive.log文件

[cloverdo@hdp1 cloverdo]$ tail -f hive.log
Caused by: ERROR XSDB6: Another instance of Derby may have already booted the database /opt/module/hive/metastore_db.
        at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
        at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
        at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.privGetJBMSLockOnDB(Unknown Source)
        at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.run(Unknown Source)

原因在于Hive默认使用的元数据库为derbyderby数据库的特点是同一时间只允许一个客户端访问。如果多个Hive客户端同时访问,就会报错。由于在企业开发中,都是多人协作开发,需要多客户端同时访问Hive,怎么解决呢?我们可以将Hive的元数据改为用MySQL存储,MySQL支持多客户端同时访问。

4)首先退出hive客户端。然后在Hive的安装目录下将derby.log和metastore_db删除,顺便将HDFS上目录删除

hive> quit;
[cloverdo@hdp1 hive]$ rm -rf derby.log metastore_db
[cloverdo@hdp1 hive]$ hadoop fs -rm -r /user

5)删除HDFS中/user/hive/warehouse/stu中数据

1.3 使用MySQL数据库启动

1)登录MySQL新建Hive元数据库

[cloverdo@hdp1 software]$ mysql -uroot -p111111

2)将MySQL的JDBC驱动拷贝到Hive的lib目录下。

[cloverdo@hdp1 software]$ cp /opt/software/mysql-connector-java-8.0.31.jar $HIVE_HOME/lib

3)在$HIVE_HOME/conf目录下新建hive-site.xml文件

[cloverdo@hdp1 software]$ vim $HIVE_HOME/conf/hive-site.xml

添加如下内容:

<configuration>
    <!-- 记录hive中的元数据信息  记录在mysql中 -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://hdoe111:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <!-- mysql的用户名和密码 -->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>111111</value>
    </property>
    <!-- hive在HDFS上的工作目录 -->
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
    </property>
    <property>
        <name>hive.exec.scratchdir</name>
        <value>/user/hive/tmp</value>
    </property>
    <property>
        <name>hive.querylog.location</name>
        <value>/user/hive/log</value>
    </property>
    <!-- 客户端远程连接的端口 -->
    <property>
        <name>hive.server2.thrift.port</name>
        <value>10000</value>
    </property>
    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>hdoe111</value>
    </property>
    <!-- hive服务的页面的端口 -->
    <property>
        <name>hive.server2.webui.port</name>
        <value>10002</value>
    </property>
    <property>
        <name>hive.server2.long.polling.timeout</name>
        <value>5000</value>
    </property>
    <property>
        <name>hive.server2.enable.doAs</name>
        <value>true</value>
    </property>
    <property>
        <name>datanucleus.autoCreateSchema</name>
        <value>false</value>
    </property>
    <property>
        <name>datanucleus.fixedDatastore</name>
        <value>true</value>
    </property>
    <property>
        <name>hive.execution.engine</name>
        <value>mr</value>
    </property>
    <!--关闭元数据授权-->
    <property>
        <name>hive.metastore.event.db.notification.api.auth</name>
        <value>false</value>
    </property>
    <!--关闭元数据存储版本的验证-->
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>
    <!-- 添加元数据服务配置 -->
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://hdoe111:9083</value>
    </property>
</configuration>

4) 修改Hive环境变量文件hive-env.sh

#进入到hive下的conf文件夹
cd /opt/apps/hive-3.1.3/conf
#将hive环境变量文件模版 改为可用文件
mv  hive-env.sh.template  hive-env.sh
#在最后添加Hadoop_Home
export HADOOP_HOME=/opt/apps/hadoop-3.2.3
export HIVE_CONF_DIR=/opt/apps/hive-3.1.3/conf
export HIVE_AUX_JARS_PATH=/opt/apps/hive-3.1.3/lib

shift: set nu  将第40行注释打开
export HADOOP_HEAPSIZE=1024

5) 修改Hadoop环境变量文件core-site.xml

使用hiveserver2需要配置
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>

<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>

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

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

6)初始化Hive元数据库(修改为采用MySQL存储元数据)

将hive的原数据信息初始化到mysql中 用的是hive下bin中的schematool命令,我们配置了环境变量可以直接使用. 出现completed初始化成功,可在MySQL数据库查看到74张表。

[cloverdo@hdp1 hive]$ schematool -initSchema -dbType mysql

7)此时HIVE已经配置成功,有多种启动方法及连接方法。

  1. 直接输入hive则进入到hive客户端,启动完毕后可以使用sql命令

[cloverdo@hdp1 hive]$ hive
  1. 使用beeline连接,需要使用以下命令:

nohup hive --service metastore & //启动元数据服务器
nohup hive --service hiveserver2 &//启动hiveserver2

netstat -nltp | grep 9083来检测metastore是否启动成功
netstat -nltp | grep 10000来检测hiveserver2是否启动成功

!connect jdbc:hive2://hdoe111:10000//使用beeline连接
  1. 或metastore和hiveserver2启动成功后,直接使用DataGrip或DBevear连接

metastore启停脚本:

#!/bin/bash
if [ $# -lt 1 ]
then
    echo "No Args Input..."
    exit ;
fi
case $1 in
"start")
    rst=$(netstat -apn|grep 9083|awk '{print $7}'|cut -d/ -f1);
    # 如果结果不为空,则说明Metastore已经启动
    if [ -n "$rst" ]; then
        echo ""
        echo "Metastore 已启动,脚本已退出."
        break
    else
echo "正在启动Metastore"
hive --service metastore >/opt/logs/hive.log 2>&1 &
# 设置最大循环次数
max_attempts=60
attempt_count=0
# 循环检测Metastore是否启动
while [ $attempt_count -lt $max_attempts ]
do
    # 检测Metastore是否在监听端口10000
    result=$(netstat -apn|grep 9083|awk '{print $7}'|cut -d/ -f1);
    # 如果结果不为空,则说明Metastore已经启动
    if [ -n "$result" ]; then
        echo ""
        echo "Metastore 启动成功."
        break
    else
        echo -n "."
    fi
    # 增加尝试次数
    attempt_count=$((attempt_count+1))
    # 等待1秒
    sleep 1
done
# 判断是否达到最大尝试次数
if [ $attempt_count -eq $max_attempts ]; then
    echo ""
    echo "Metastore 启动失败."
fi
fi
;;
"stop")
# 获取正在运行的 Metastore 进程号
metastore_pid=$(netstat -nltp|grep 9083|awk '{print $7}'|cut -d/ -f1);

if [ -z "$metastore_pid" ]; then
    echo "Metastore 没有运行."
    exit 1
else
    echo "Metastore 已获取到PID: $metastore_pid"
    # 杀死 Metastore 进程
    kill -9 "$metastore_pid"
fi
# 等待一段时间确保进程被杀死
sleep 5
# 检查是否还有进程在监听端口 9083
if [ -n "$(netstat -tuln | grep 9083)" ]; then
    echo "Metastore 关闭失败,请手动处理."
else
    echo "PID:$metastore_pid已杀死 | Metastore已关闭."
fi
;;
*)
    echo "Input Args Error..."
;;
esac

hiveserver2启停脚本:

#!/bin/bash
if [ $# -lt 1 ]
then
    echo "No Args Input..."
    exit ;
fi
case $1 in
"start")
    rst=$(netstat -apn|grep 10000|awk '{print $7}'|cut -d/ -f1);
    # 如果结果不为空,则说明Hiveserver2已经启动
    if [ -n "$rst" ]; then
        echo "Hiveserver2 已启动."
        exit 1
    else
echo "正在启动Hiveserver2"
hive --service hiveserver2 >/opt/logs/hive.log 2>&1 &
sleep 15s
# 设置最大循环次数
max_attempts=60
attempt_count=0
# 循环检测Hiveserver2是否启动
while [ $attempt_count -lt $max_attempts ]
do
    # 检测Hiveserver2是否在监听端口10000
    result=$(netstat -apn|grep 10000|awk '{print $7}'|cut -d/ -f1);
    # 如果结果不为空,则说明Hiveserver2已经启动
    if [ -n "$result" ]; then
        echo ""
        echo "Hiveserver2 启动成功."
        break
    else
        echo -n "."
    fi
    # 增加尝试次数
    attempt_count=$((attempt_count+1))
    # 等待1秒
    sleep 2
done
# 判断是否达到最大尝试次数
if [ $attempt_count -eq $max_attempts ]; then
    echo ""
    echo "Hiveserver2 启动失败."
fi
fi
;;
"stop")
# 获取正在运行的 Hiveserver2 进程号
hiveserver_pid=$(netstat -nltp|grep 10000|awk '{print $7}'|cut -d/ -f1);
if [ -z "$hiveserver_pid" ]; then
    echo "Hiveserver2 没有运行."
    exit 1
else
    echo "Hiveserver2 已获取到PID: $hiveserver_pid"
    # 杀死 Hiveserver2 进程
    kill -9 "$hiveserver_pid"
fi
# 等待一段时间确保进程被杀死
sleep 5

# 检查是否还有进程在监听端口 10000
if [ -n "$(netstat -tuln | grep 10000)" ]; then
    echo "Hiveserver2 关闭失败,请手动处理."
else
    echo "PID:$hiveserver_pid已杀死 | Hiveserver2已关闭."
fi
;;
*)
    echo "Input Args Error..."
;;
esac