赞
踩
hive是Hadoop的客户端,启动hive前必须启动hadoop,同时hive的元数据存储在mysql中,是由于hive自带的derby数据库不支持多客户端访问。
hive-site.xml中打开metastore的连接地址。
<!-- 指定存储元数据要连接的地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop102:9083</value>
</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> <!-- jdbc连接的URL --> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false</value> </property> <!-- jdbc连接的Driver--> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <!-- jdbc连接的username--> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <!-- jdbc连接的password --> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> </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客户端连接到元数据。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定存储元数据要连接的地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop102:9083</value>
</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 进程号关闭相应的服务。



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本身既是客户端,又是服务端。
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- jdbc连接的URL --> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false</value> </property> <!-- jdbc连接的Driver--> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <!-- jdbc连接的username--> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <!-- jdbc连接的password --> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> </property> <!-- Hive默认在HDFS的工作目录 --> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <!-- 指定hiveserver2连接的端口号 --> <property> <name>hive.server2.thrift.port</name> <value>10000</value> </property> <!-- 指定hiveserver2连接的host --> <property> <name>hive.server2.thrift.bind.host</name> <value>hadoop102</value> </property> <!-- 指定存储元数据要连接的地址 --> <property> <name>hive.metastore.uris</name> <value>thrift://hadoop102:9083</value> </property> <!-- 元数据存储授权 --> <property> <name>hive.metastore.event.db.notification.api.auth</name> <value>false</value> </property> <!-- Hive元数据存储版本的验证 --> <property> <name>hive.metastore.schema.verification</name> <value>false</value> </property> <!-- hiveserver2的高可用参数,开启此参数可以提高hiveserver2的启动速度 --> <property> <name>hive.server2.active.passive.ha.enable</name> <value>true</value> </property> <!-- hive方式访问客户端:打印 当前库 和 表头 --> <property> <name>hive.cli.print.header</name> <value>true</value> <description>Whether to print the names of the columns in query output. </description> </property> <property> <name>hive.cli.print.current.db</name> <value>true</value> <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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。