Hive的metastore服务和hiveserver2服务详细说明

Hive的两个服务详细说明:

1 metastore服务★

首先我们需要知道,Hive的元数据保存在MySQL中,真实数据保存在HDFS上,启动Hive需要从MySQL中加载元数据信息。Hive有两种获取元数据的方式,如下:

1.1 hive获取元数据的两种方式

  • 1 Hive直连MySQL获取元数据

    • 启动方式:只需要直接启动Hive客户端,即可连接

    hive-site.xml中需要配置:配置这个就可以直连MySQL获取元数据

            <property>
              <name>javax.jdo.option.ConnectionURL</name>
              <value>jdbc:mysql://hadoop201:3306/metastore?createDatabaseIfNotExist=true</value>
              <description>通过JDBC方式连接MySQL的URL</description>
            </property>
            <property>
              <name>javax.jdo.option.ConnectionDriverName</name>
              <value>com.mysql.jdbc.Driver</value>
              <description>JDBC的Driver驱动类</description>
            </property>
    
            <property>
              <name>javax.jdo.option.ConnectionUserName</name>
              <value>root</value>
              <description>访问MySQLyu'na's的用户名</description>
            </property>
    
            <property>
              <name>javax.jdo.option.ConnectionPassword</name>
              <value>123456</value>
              <description>访问MySQL元数据的密码</description>
            </property>
    
  • 2 Hive先连接metastore服务,再通过metastore服务连接MySQL获取元数据

    • 启动方式:① 启动metastore服务

      ​ ② 启动Hive客户端

    hive-site.xml中需要配置:指定metastore服务地址。

 <property>
     <name>hive.metastore.uris</name>
     <value>thrift://hadoop201:9083</value>
   </property>
  • 3 这两种服务可以同时配置上,不过使用metastore服务方式获取元数据,需要在指定地址上开启metastore服务。

1.2 为什么要使用metastore服务?

  • 1 因为Hive既充当客户端(HDFS的客户端,Metastore的客户端,也是Hive的客户端),又充当服务端(metastore服务端,hiveserver2服务端)

  • 2 实际生产环境中,可能有多台Hive客户端(比如有:103、104、105三台机器),MySQL的 IP地址对外不暴露,只暴露给其中一台(假如暴露给103这台机器),那么其他客户端怎么连接呢?那么就需要在暴露的那台机器上启动Metastore服务,其他Hive客户端连接这个Metastore服务,进而达到连接Mysql获取元数据的目的。

    ​ ①在103上启动Metastore服务
    ​ ②在其他客户端(比如104、105)都可以启动hive客户端

2 hiveserver2服务★

实际是Hive与Hive之间的服务端与客户端连接的方式:支持多客户端并发的请求,支持了开放API客户端的JDBC的使用

上面提到了作为客户端的机器比如104,当它作为103的客户端时,那么可以用Hiveserver2服务连接:
  ①在103上启动Hiveserver2服务(如果配置了Metastore服务依旧也要启动)
  ②在104上启动beline客户端也可以连接

hive-site.xml中的配置如下:

<!-- hiveserver2 -->
<property>
    <name>hive.server2.thrift.port</name>
    <value>10000</value>
</property>

<property>
    <name>hive.server2.thrift.bind.host</name>
    <value>hadoop201</value>
</property>

<property>
    <name>hive.metastore.event.db.notification.api.auth</name>
    <value>false</value>
  </property>
<property>
    <name>hive.server2.active.passive.ha.enable</name>
    <value>true</value>
  </property>

后台启动hiveserver2服务:

nohup hiveserver2 &

3 Hive客户端与服务端的启动

1.启动服务端
	hive --service metastore 
	hive --service hiveserver2
2.启动客户端
	hive
	beeline -u jdbc:hive2://hadoop102:10000 -n root

4 hiveserver2和metastore服务启动脚本

#!/bin/bash
HIVE_LOG_DIR=$HIVE_HOME/logs

mkdir -p $HIVE_LOG_DIR

#检查进程是否运行正常,参数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

附 Hive完整配置

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://hadoop201:3306/metastore?createDatabaseIfNotExist=true</value>
        <description>JDBC connect string for a JDBC metastore</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
        <description>Driver class name for a JDBC metastore</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
        <description>username to use against metastore database</description>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>123456</value>
        <description>password to use against metastore database</description>
    </property>
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
        <description>location of default database for the warehouse</description>
    </property>
    
    <property>
        <name>hive.cli.print.header</name>
        <value>true</value>
    </property>
    <property>
        <name>hive.cli.print.current.db</name>
        <value>true</value>
    </property>
    
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>
    <property>
        <name>datanucleus.schema.autoCreateAll</name>
        <value>true</value>
    </property>
    <!-- metastore -->
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://hadoop201:9083</value>
    </property>
    <!-- hiveserver2 -->
    <property>
        <name>hive.server2.thrift.port</name>
        <value>10000</value>
    </property>

    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>hadoop201</value>
    </property>

    <property>
        <name>hive.metastore.event.db.notification.api.auth</name>
        <value>false</value>
    </property>
    <property>
        <name>hive.server2.active.passive.ha.enable</name>
        <value>true</value>
    </property>

    <!--设置相应队列-->
    <property>
        <name>mapred.job.queue.name</name>
        <value>hive</value>
    </property>

    <property>
        <name>mapreduce.job.queuename</name>
        <value>hive</value>
    </property>

    <property>
        <name>mapred.queue.names</name>
        <value>hive</value>
    </property

猜你喜欢

转载自blog.csdn.net/qq_43523503/article/details/114324856
今日推荐