hive中metastore服务、hiveserver2服务、hive客户端、beeline客户端连接元数据的方式

1.前言

hive是Hadoop的客户端,启动hive前必须启动hadoop,同时hive的元数据存储在mysql中,是由于hive自带的derby数据库不支持多客户端访问。

2.开启metastore服务的参数

hive-site.xml中打开metastore的连接地址。


    <property>
        <name>hive.metastore.urisname>
        <value>thrift://hadoop102:9083value>
    property>
3.hive连接mysql中的元数据有2种方式
1)直接连接:直接去mysql中连接metastore库;
2)通过服务连:hive有2种服务分别是metastore和hiveserver2,hive通过metastore服务去连接mysql中的元数据。
4.如何控制hive连接元数据的方式?
1)通过服务连:

如果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。

2)直接连接:

如果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>
5.如何启动metastore服务?
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中,并保持命令启动的进程在后台运行。
6.hive.metastore.uris参数的意义?

对于分布式的hadoop集群,只需要在一个节点上安装hive即可。是因为hive既是客户端又是服务端,作为服务端的原因是有2个后台服务metastore服务和hiveserver2服务。这样对于集群的意义就是,可能会有多个节点安装hive,但是只有一个节点A是主服务端,其余节点BCD是客户端,而存放元数据的mysql节点E只对主服务端A暴露连接地址,其余节点BCD网络隔离根本访问不到mysql。这样节点BCD上hive要连接mysql,必须节点A先开启metastore服务,节点BCD先连接metastore服务再连接mysql。

7.多节点hive客户端如何配置?配置文件hive-site.xml如何写?
只需要指定存储元数据要连接的地址即可,但是服务节点hadoop102要提前开启metastore服务,这样客户端节点才能通过bin/hive 命令启动hive客户端连接到元数据。
    
    
    <configuration>
        
        <property>
            <name>hive.metastore.urisname>
            <value>thrift://hadoop102:9083value>
        property>
    configuration>
8.hiveserver2服务是什么?

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(即用户名)

9.Hiveserver2服务的两种启动方式?
1)hive命令:bin/hive --service hiveserver2
2)hiveserver2命令:bin/hiveserver2 ,hiveserver2脚本其实也是通过bin/hive --service hiveserver2方式启动hiveserver2服务。
3)hiveserver2服务属于前台启动会占用窗口。
10.如何关闭hiveserver2服务和metastore服务?
通过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)
11.总结
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本身既是客户端,又是服务端。
12.hive-site.xml配置参数
 
        
        <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>
13.开启metastore服务和hiveserver2服务脚本
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
  1. 哔哩哔哩视频链接:
    https://www.bilibili.com/video/BV1gt4y1i7EJ

你可能感兴趣的:(hive)