
Hive 部署
本文最后更新于 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默认使用的元数据库为derby。derby数据库的特点是同一时间只允许一个客户端访问。如果多个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&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>
#进入到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已经配置成功,有多种启动方法及连接方法。
直接输入hive则进入到hive客户端,启动完毕后可以使用sql命令
[cloverdo@hdp1 hive]$ hive
使用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连接
或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