hive是Hadoop的客户端,启动hive前必须启动hadoop,同时hive的元数据存储在mysql中,是由于hive自带的derby数据库不支持多客户端访问。
hive-site.xml中打开metastore的连接地址。
<property>
<name>hive.metastore.urisname>
<value>thrift://hadoop102:9083value>
property>
1)直接连接:直接去mysql中连接metastore库;
2)通过服务连:hive有2种服务分别是metastore和hiveserver2,hive通过metastore服务去连接mysql中的元数据。
如果hive-site.xml中有hive.metastore.uris这个参数,就需要通过metastore服务去连接元数据。否则直接使用bin/hive 启动hive客户端,使用show databases 就会报异常 FAILED: HiveException java.lang.RuntimeException:Unable to instantiate org.apache.hadoop.hive.ql.metadata SessionHiveMetaStoreClient。
如果hive-site.xml中没有配置hive.metastore.uris这个参数,但是配置了JDBC连接方式,就可以通过直接连接的方式连接元数据。 通过bin/hive命令就可以连接到metastore库中的元数据。
<configuration>
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://hadoop102:3306/metastore?useSSL=falsevalue>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>rootvalue>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>123456value>
property>
<configuration>
1)通过命令bin/hive --service metastore 。
启动metastore服务后,再使用bin/hive 启动hive客户端,使用show databases就不会报错。即hive客户端能够通过metastore服务找到元数据。
2)如果不想启动metastore服务才能启动hive客户端,只能将hive.metastore.uris参数注释掉。
3)通过bin/hive --service metastore命令启动metastore服务会占用窗口,可以通过如下命令推向后台。
nohup hive --service metastore>log.txt 2>&1 &
4)命令解读:前台启动的方式导致需要打开多个shell窗口,可以使用如下方式后台方式启动
nohup: 放在命令开头,表示不挂起,也就是关闭终端进程也继续保持运行状态
2>&1 : 表示将错误重定向到标准输出上
&: 放在命令结尾,表示后台运行
一般会组合使用: nohup [xxx命令操作]> file 2>&1 & , 表示将xxx命令运行的
结果输出到file中,并保持命令启动的进程在后台运行。
对于分布式的hadoop集群,只需要在一个节点上安装hive即可。是因为hive既是客户端又是服务端,作为服务端的原因是有2个后台服务metastore服务和hiveserver2服务。这样对于集群的意义就是,可能会有多个节点安装hive,但是只有一个节点A是主服务端,其余节点BCD是客户端,而存放元数据的mysql节点E只对主服务端A暴露连接地址,其余节点BCD网络隔离根本访问不到mysql。这样节点BCD上hive要连接mysql,必须节点A先开启metastore服务,节点BCD先连接metastore服务再连接mysql。
只需要指定存储元数据要连接的地址即可,但是服务节点hadoop102要提前开启metastore服务,这样客户端节点才能通过bin/hive 命令启动hive客户端连接到元数据。
<configuration>
<property>
<name>hive.metastore.urisname>
<value>thrift://hadoop102:9083value>
property>
configuration>
1)hive的客户端连接hive的需要开启hiveserver2服务,是先连hive,进而可以连元数据。
2)hive是hadoop的客户端,同时hive也有自己的客户端。
3)hive有2种客户端,hive客户端和beeline客户端。
4)启动beeline客户端,必须先启动hiveserver2服务。再通过命令bin/beeline -u jdbc:hive2://hadoop102:10000 -n atguigu(即用户名)
1)hive命令:bin/hive --service hiveserver2
2)hiveserver2命令:bin/hiveserver2 ,hiveserver2脚本其实也是通过bin/hive --service hiveserver2方式启动hiveserver2服务。
3)hiveserver2服务属于前台启动会占用窗口。
通过jps -m 命令查看jps进程,通过kill -9 进程号关闭相应的服务。
![通过jps命令查看jps进程,发现metastore服务和hiveserver2服务都是RunJar,想关闭很麻烦](https://img-blog.csdnimg.cn/20201010202044526.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjcxNjIzNw==,size_16,color_FFFFFF,t_70#pic_center)
![jps -l 命令只能查看进程的全类名,也无法分辨2个服务](https://img-blog.csdnimg.cn/20201010202210764.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjcxNjIzNw==,size_16,color_FFFFFF,t_70#pic_center)
![jps -m 可以更加详细的查看进程信息](https://img-blog.csdnimg.cn/20201010202302740.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjcxNjIzNw==,size_16,color_FFFFFF,t_70#pic_center)
1)hive有2种客户端:hive客户端和beeline客户端,beeline客户端是通过hiveserver2服务以JDBC的方式连接hive客户端。
2)hive作为服务端有2个后台服务:metastore服务,hiveserver2服务。
3)hive连接元数据有2种方式:直接连接和metastore服务连接。
4)如果配置了hive.metastore.uris参数,必须启动metastore服务才能连接元数据;如果没有配置可以直接连接元数据。
5)hive本身既是客户端,又是服务端。
<configuration>
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://hadoop102:3306/metastore?useSSL=falsevalue>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>rootvalue>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>123456value>
property>
<property>
<name>hive.metastore.warehouse.dirname>
<value>/user/hive/warehousevalue>
property>
<property>
<name>hive.server2.thrift.portname>
<value>10000value>
property>
<property>
<name>hive.server2.thrift.bind.hostname>
<value>hadoop102value>
property>
<property>
<name>hive.metastore.urisname>
<value>thrift://hadoop102:9083value>
property>
<property>
<name>hive.metastore.event.db.notification.api.authname>
<value>falsevalue>
property>
<property>
<name>hive.metastore.schema.verificationname>
<value>falsevalue>
property>
<property>
<name>hive.server2.active.passive.ha.enablename>
<value>truevalue>
property>
<property>
<name>hive.cli.print.headername>
<value>truevalue>
<description>Whether to print the names of the columns in query output. description>
property>
<property>
<name>hive.cli.print.current.dbname>
<value>truevalue>
<description>Whether to include the current database in the Hive prompt. description>
property>
configuration>
vim $HIVE_HOME/bin/hiveservices.sh
#!/bin/bash
HIVE_LOG_DIR=$HIVE_HOME/logs
if [ ! -d $HIVE_LOG_DIR ]
then
mkdir -p $HIVE_LOG_DIR
fi
#检查进程是否运行正常,参数1为进程名,参数2为进程端口
function check_process()
{
pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
echo $pid
[[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
}
function hive_start()
{
metapid=$(check_process HiveMetastore 9083)
cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
cmd=$cmd" sleep 4; hdfs dfsadmin -safemode wait >/dev/null 2>&1"
[ -z "$metapid" ] && eval $cmd || echo "Metastroe服务已启动"
server2pid=$(check_process HiveServer2 10000)
cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"
[ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服务已启动"
}
function hive_stop()
{
metapid=$(check_process HiveMetastore 9083)
[ "$metapid" ] && kill $metapid || echo "Metastore服务未启动"
server2pid=$(check_process HiveServer2 10000)
[ "$server2pid" ] && kill $server2pid || echo "HiveServer2服务未启动"
}
case $1 in
"start")
hive_start
;;
"stop")
hive_stop
;;
"restart")
hive_stop
sleep 2
hive_start
;;
"status")
check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常"
check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服务运行正常" || echo "HiveServer2服务运行异常"
;;
*)
echo Invalid Args!
echo 'Usage: '$(basename $0)' start|stop|restart|status'
;;
esac
\14. 查看各节点jps进程脚本,支持传入参数如 jps -m ; jps -l
vim 家目录/bin/jpsall
#!/bin/bash
for i in hadoop102 hadoop103 hadoop104
do
echo =========== $i ============
ssh $i "jps $@ | grep -v Jps"
done