暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数仓(十)hive的Metastore机制

畅谈Fintech 2021-08-10
7239


这节我们来讲解hive元数据管理metastore的概念、配置方式、以及hiveserver2服务。



一、metastore基本概念


1、基本概念
metadata :元数据,即hive定义的表名,字段名,类型,分区,用户这些数据。一般存储在derby、mysql中;
metastore 客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。主要提供将DDL,DML等语句转换为MapReduce,提交到hdfs中。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。
hiveserver2:hive服务端,提供hive服务。客户端可以通过beeline,jdbc等多种方式链接到hive。
beeline:hive客户端链接到hive的一个工具。可以理解成mysql的客户端。如:navite cat 等这样的工具。Hive客户端工具后续将使用Beeline 替代HiveCLI ,并且后续版本也会废弃掉HiveCLI 客户端工具。Beeline是Hive新的命令行客户端工具。

Beeline是从 Hive 0.11版本引入的。

注意:
  • hive既可以做客户端也可以做服务器端;

  • hive做客户端有两种工具:hive客户端和beeline客户端;

  • hive作为服务器端,提供两种服务一个是Metastore,另外一个是hiveserver2;其中metastore需要hive客户端链接,hiveserver2需要beeline客户端链接。

由于元数据会不断地修改、更新,所以Hive元数据不适合存储在HDFS中,一般存在RDBMS中。metastore有三种配置方式:
2、内嵌模式(Embedded)(默认模式)
由于元数据会不断地修改、更新,所以Hive元数据不适合存储在HDFS中,一般存在RDBMS中。


  1. hive服务和metastore服务运行在同一个进程中,derby服务也运行在该进程中。

  2. 内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。

  3. 默认是这个模式,并且一次只能一个客户端连接。

  4. 适用于用来实验,不适用于生产环境。


3、本地模式(Local)


  1. hive服务和metastore服务运行在同一个进程中,mysql是单独的进程,可以同一台机器,也可以在远程机器上。
  2. 是一个多用户的模式,运行多个用户client连接到一个数据库中。
  3. 一般作为公司内部多个客户端同时使用Hive。每一个用户必须要有对MySQL的访问权利,每一个客户端使用者需要知道MySQL的用户名和密码才行。
这种安装方式和嵌入式的区别在于:不再使用内嵌的Derby作为元数据的存储介质,而是使用其他数据库比如MySQL来存储元数据。

4、远程模式(Remote)

这里我们大致看一下CDH官网图


  1. Hive服务和metastore服务在不同的进程内,可能是不同的机器;

  2. 该模式需要以下几个配置说明:

    1. 将hive.metastore.local设置为false,

    2. 将hive.metastore.uris设置为metastore服务器URL;如果有多个metastore服务器,URL之间用逗号分隔;

    3. URL的格式为thrift://127.0.0.1:9083。

  3. 远程元存储需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。

  4. 各种客户端通过beeline来连接,连接之前无需知道数据库的密码。

注意:连接远程的mysql并不能称之为“远程模式”,是否远程判断标准指的是metastore和hive服务是否在同一进程内。在同一个进程是本地local模式,不在同一个进程是Remote模式。



二、Metastore配置方式


1、内嵌模式(默认模式)配置

默认模式就是内嵌模式,什么配置文件都不需要修改,derby数据库也不需要替换,生产上不用。

2、本地模式local配置

hive直接连接mysql

  • 配置hive.metastore.local为true;

  • 并且安装mysql,前面章节已经安装和配置;

  • 配置连接mysql的driver、URL、用户和密码。

    <configuration>
    <property>
    <name>hive.metastore.local</name>
    <value>true</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</value>
    </property>
    也可以这样写jdbc:mysql://ip:3306/hive?characterEncoding=UTF-8
    <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionUserName</name>
      <value>XXXX</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionPassword</name>
      <value>XXXX</value>
    </property>
    </configuration>
    复制
    不同客户端直接访问,mysql和hive是一台node01节点机器;
    3、远程模式Remote配置
    Hive先连接Metastore服务,再通过 Metastore服务连mysql获取元数据。
    场景:可能有多台Hive客户端(比如有:node01、node02node03三台机器),MySQL的 IP地址对外不暴露,只暴露给其中一台(假如暴露给node01这台机器),那么其他客户端怎么连接呢?
    那么就需要在暴露的那台机器上启动Metastore服务,其他Hive客户端连接这个Metastore服务,进而达到连接Mysql获取元数据。
    服务器端配置:比如node01
    • 需要配置hive.metastore.local为false;
    • 配置连接mysql的driver、URL、用户和密码。
      <configuration>
      <property>
      <name>hive.metastore.local</name>
        <value>false</value>
      </property>
      <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <value>jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</value>
      </property>
      也可以这样写jdbc:mysql://ip:3306/hive?characterEncoding=UTF-8
      <property>
      <name>javax.jdo.option.ConnectionDriverName</name>
      <value>com.mysql.jdbc.Driver</value>
      </property>
      <property>
      <name>javax.jdo.option.ConnectionUserName</name>
      <value>XXXX</value>
      </property>
      <property>
      <name>javax.jdo.option.ConnectionPassword</name>
      <value>XXXX</value>
      </property>
      </configuration>
      复制

      客户端配置:比如node02和node03

      • 配置hive.metastore.uris地址。

        格式为:thrift://IP地址:9083,端口是9083;

        <property>
        <name>hive.metastore.uris</name>
        <value>thrift://node01:9083</value>
        </property>
        复制

        服务器端node01启动metastore服务

          hive --service metastore -p <port_num>
          复制

          如果不加端口默认启动:hive --service metastore,默认监听端口是:9083 。

          注意客户端中的端口配置需要和启动监听的端口一致。服务端启动正常后,客户端就可以执行hive操作了。

          客户端端node02、03启动hive客户端

            bin/hive
            复制




            三、hiverServer2服务


            1、hiveserver2服务

            前面我们介绍了hive的metastore服务,客户端使用的是hive;这里介绍一下hive的另外一个Hiveserver2服务。hive是hadoop的客户端,同时hive本身也有客户端,Hiveserver2的beeline连接方式实际是Hive与Hive之间的服务端与客户端连接的方式。beeline客户端是通过hiveserver2服务以JDBC的方式连接hive客户端。
            2、hiveserver2启动服务原理

            hiveserver2 会启动一个hive服务端默认端口为:10000,通过beeline,jdbc,odbc的方式链接到hive。

            hiveserver2启动的时候会先检查有没有配置hive.metastore.uris,如果有配置hive.metastore.uris会连接到远程的metastore服务;如果没有配置,会先启动一个metastore服务,然后在启动hiveserver2。

            3、hiveserver2服务端启动命令

              bin/hive --service hiveserver2bin/hive --service hiveserver2 -p 10002#其中-p参数用来指定监听端口的bin/hiveserver2 
              复制

              注意:

              • hiveserver2脚本其实也是通过bin/hive --service hiveserver2方式启动hiveserver2服务。
              • hiveserver2服务属于前台启动会占用窗口。
                使用&后台启动
                bin/hive –service hiveserver2 &
                #也是在后台启动,nohup表示启动后不挂起
                nohup bin/hive --service hiveserver2 2>&1 &
                复制
                4、beeline客户端启动
                  bin/beeline -u jdbc:hive2://IP地址:10000 -n username(即用户名)
                  !connect jdbc:hive2://IP地址:10000/default root password
                  复制
                  注意:这里的密码不是mysql的用户和密码而是hive的。
                  5、Metastore server和hiveserver2的区别
                  相对而言,如果Hive中存在一张表。访问这张表的信息通过Metastore Server,访问表的具体内容则通过 HiveServer2。
                  • 数据访问上
                    Metastore Server 
                    负责对元数据的访问,即表结构,库信息等。
                    比如:SHOW DATABASES;  
                    HiveServer2
                    负责对Hive 表中具体数据的访问。
                  • 访问服务上
                    Metastore Server
                    Hive元数据的访问入口,使用Thrift协议,提供对hive元数据的跨语言访问。
                    HiveServer2
                    Hive库中数据的访问入口,同样适用thrift 协议,提供对Hive中数据的跨语言访问,比如常见的python, java 等对hive数据的远程访问,beeline客户端也是通过HiveServer2方式访问数据的。

                   



                  文章转载自畅谈Fintech,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论