Hive metastore三种配置方式




Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储。远端存储比较适合生产环境。Hive官方wiki详细介绍了这三种方式,链接为:Hive Metastore

 

一、本地derby

这种方式是最简单的存储方式,只需要在hive-site.xml做如下配置便可






1. <?xml version="1.0"?>  
2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
3.   
4. <configuration>  
5.   
6. <property>  
7. <name>javax.jdo.option.ConnectionURL</name>  
8. <value>jdbc:derby:;databaseName=metastore_db;create=true</value>  
9. </property>  
10.    
11. <property>  
12. <name>javax.jdo.option.ConnectionDriverName</name>  
13. <value>org.apache.derby.jdbc.EmbeddedDriver</value>  
14. </property>  
15.    
16. <property>  
17. <name>hive.metastore.local</name>  
18. <value>true</value>  
19. </property>  
20.    
21. <property>  
22. <name>hive.metastore.warehouse.dir</name>  
23. <value>/user/hive/warehouse</value>  
24. </property>  
25.    
26. <property>  
27. <name>hive.metastore.warehouse.dir</name>  
28. <value>/user/hive/warehouse</value>  
29. </property>  
30.   
31. </configuration>



注:使用derby存储方式时,运行hive会在当前目录生成

一个 derby 文件 和 一个 metastore_db 目录 。这种存储方式的 弊端 是在同一个目录下同时只能有一个hive客户端能使用数据库,否则会提示如下错误






    1. hive> show tables;  
    2. FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database 'metastore_db', see the next exception for details.  
    3. NestedThrowables:  
    4. java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details.  
    5. FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask



    二、本地mysql


    这种存储方式需要在本地运行一个mysql服务器,并作如下配置(下面两种使用mysql的方式,需要将mysql的jar包拷贝到$HIVE_HOME/lib目录下)。







    1. <?xml version="1.0"?>  
    2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
    3.   
    4. <configuration>  
    5. <property>  
    6. <name>hive.metastore.warehouse.dir</name>  
    7. <value>/user/hive_remote/warehouse</value>  
    8. </property>  
    9.    
    10. <property>  
    11. <name>hive.metastore.local</name>  
    12. <value>true</value>  
    13. </property>  
    14.    
    15. <property>  
    16. <name>javax.jdo.option.ConnectionURL</name>  
    17. <value>jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</value>  
    18. </property>  
    19.    
    20. <property>  
    21. <name>javax.jdo.option.ConnectionDriverName</name>  
    22. <value>com.mysql.jdbc.Driver</value>  
    23. </property>  
    24.    
    25. <property>  
    26. <name>javax.jdo.option.ConnectionUserName</name>  
    27. <value>hive</value>  
    28. </property>  
    29.    
    30. <property>  
    31. <name>javax.jdo.option.ConnectionPassword</name>  
    32. <value>password</value>  
    33. </property>  
    34. </configuration>


    三、远端mysql

    这种存储方式需要在远端服务器运行一个mysql服务器,并且需要在Hive服务器启动meta服务。

    这里用mysql的测试服务器,ip位192.168.1.214,新建hive_remote数据库,字符集位latine1







    1. <?xml version="1.0"?>  
    2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
    3.    
    4. <configuration>  
    5.   
    6. <property>  
    7. <name>hive.metastore.warehouse.dir</name>  
    8. <value>/user/hive/warehouse</value>  
    9. </property>  
    10.    
    11. <property>  
    12. <name>javax.jdo.option.ConnectionURL</name>  
    13. <value>jdbc:mysql://192.168.1.214:3306/hive_remote?createDatabaseIfNotExist=true</value>  
    14. </property>  
    15.    
    16. <property>  
    17. <name>javax.jdo.option.ConnectionDriverName</name>  
    18. <value>com.mysql.jdbc.Driver</value>  
    19. </property>  
    20.    
    21. <property>  
    22. <name>javax.jdo.option.ConnectionUserName</name>  
    23. <value>hive</value>  
    24. </property>  
    25.    
    26. <property>  
    27. <name>javax.jdo.option.ConnectionPassword</name>  
    28. <value>password</value>  
    29. </property>  
    30.   
    31. <property>  
    32. <name>hive.metastore.local</name>  
    33. <value>false</value>  
    34. </property>  
    35.   
    36. <property>  
    37. <name>hive.metastore.uris</name>  
    38. <value>thrift://192.168.1.188:9083</value>  
    39. </property>  
    40.   
    41. </configuration>


    注:这里把hive的服务端和客户端都放在同一台服务器上了。服务端和客户端可以拆开,将hive-site.xml配置文件拆为如下两部分

             1)、服务端配置文件







    1. <?xml version="1.0"?>  
    2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
    3.    
    4. <configuration>  
    5.   
    6. <property>  
    7. <name>hive.metastore.warehouse.dir</name>  
    8. <value>/user/hive/warehouse</value>  
    9. </property>  
    10.    
    11. <property>  
    12. <name>javax.jdo.option.ConnectionURL</name>  
    13. <value>jdbc:mysql://192.168.1.214:3306/hive_remote?createDatabaseIfNotExist=true</value>  
    14. </property>  
    15.    
    16. <property>  
    17. <name>javax.jdo.option.ConnectionDriverName</name>  
    18. <value>com.mysql.jdbc.Driver</value>  
    19. </property>  
    20.    
    21. <property>  
    22. <name>javax.jdo.option.ConnectionUserName</name>  
    23. <value>root</value>  
    24. </property>  
    25.    
    26. <property>  
    27. <name>javax.jdo.option.ConnectionPassword</name>  
    28. <value>test1234</value>  
    29. </property>  
    30. </configuration>


             2)、客户端配置文件







    1. <?xml version="1.0"?>  
    2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
    3.    
    4. <configuration>  
    5.   
    6. <property>  
    7. <name>hive.metastore.warehouse.dir</name>  
    8. <value>/user/hive/warehouse</value>  
    9. </property>  
    10.    
    11. <property>  
    12. <name>hive.metastore.local</name>  
    13. <value>false</value>  
    14. </property>  
    15.   
    16. <property>  
    17. <name>hive.metastore.uris</name>  
    18. <value>thrift://192.168.1.188:9083</value>  
    19. </property>  
    20.   
    21. </configuration>


    启动hive服务端程序







    1. $ hive --service metastore



    客户端直接使用hive命令即可






    1. root@my188:~$ hive   
    2. Hive history file=/tmp/root/hive_job_log_root_201301301416_955801255.txt  
    3. hive> show tables;  
    4. OK  
    5. test_hive  
    6. Time taken: 0.736 seconds  
    7. hive>




    Hive学习之Metastore及其配置管理

    在学习Hive的配置管理参数时,曾将参数分为四类:Hive管理参数、Hive元存储(Metastore)管理参数、与Hadoop交互的管理参数、用于传递运行时信息的参数,当时并没有对Metastore参数进行深入的学习,现在就开始学习这部分的内容。

           Hive中表和分区的所有元数据都存储在Hive的元存储(Metastore)中。元数据使用JPOX(Java Persistent Objects)对象关系映射解决方案进行持久化,所以任何被JPOX支持的存储都可以被Hive使用。大多数商业关系型数据库和许多开源的数据存储都被支持,所以就可以被Hive使用存储元数据。Hive支持三种不同的元存储服务器,分别为:内嵌式元存储、本地元存储、远程元存储,每种存储方式使用不同的配置参数,相关的配置参数如下表所示:


    配置参数

    描述

    javax.jdo.option.ConnectionURL

    包含元数据的数据存储的JDBC连接字符串。默认值为jdbc:derby:;databaseName=metastore_db;create=true。

    javax.jdo.option.ConnectionDriverName

    包含元数据的数据存储的JDBC驱动类名称。默认值为org.apache.derby.jdbc.EmbeddedDriver。

    hive.metastore.uris

    Hive连接到该URI请求远程元存储的元数据。默认值为空。

    hive.metastore.local

    hive.metastore.uris为空值则为本地模式,否则为远程模式)。

    hive.metastore.warehouse.dir

    本地表的默认位置,默认值为/user/hive/warehouse。

    hive.metastore.metadb.dir

     

    hive.metastore.rawstore.impl

    实现org.apache.hadoop.hive.metastore.rawstore接口的类,该类用于存储和检索行元数据对象,如表、数据库。

    hive.metastore.ds.connection.url.hook

    提取JDO连接URL的钩子名称,若为空,则使用javax.jdo.option.ConnectionURL中的值。

    hive.metastore.server.min.threads

    Thrift服务器池中工作线程的最小数量,默认值为200。

    hive.metastore.server.max.threads

    Thrift 服务器池中工作线程的最大数量,默认值为10000。

    hive.hmshandler.retry.attempts

    在JDO数据存储出现错误后尝试连接的次数默认值为1。

    hive.hmshandler.retry.interval

    尝试间隔的毫秒数,默认值为1000。


           前面提到Hive支持三种元存储方式,默认方式为内嵌式元存储。下面分别对三种存储方式如何配置进行学习。

    内嵌式元存储

           内嵌式元存储主要用于单元测试,在该模式下每次只有一个进程可以连接到元存储,Derby是内嵌式元存储的默认数据库。内嵌式元存储的配置如下:

    配置参数

    描述

    javax.jdo.option.ConnectionURL

    jdbc:derby:;databaseName=metastore_db;create=true

    包含元数据的数据存储的JDBC连接字符串。

    javax.jdo.option.ConnectionDriverName

    org.apache.derby.jdbc.EmbeddedDriver

    JDBC驱动类。

    hive.metastore.warehouse.dir

    /user/hive/warehouse

    本地表的默认位置。

    hive.metastore.uris

    空值

    内嵌式也是本地模式,所以为空值。

     

    本地元存储

           在本地模式下,每个Hive客户端都会打开到数据存储的连接并在该连接上请求SQL查询。下表展示了如何在MySQL数据库服务器中建立元存储,确保在Hive查询被执行的机器上是可以访问该数据库服务器的,同时确保JDBC类库在Hive客户端的类路径中。

    配置参数

    描述

    javax.jdo.option.ConnectionURL

    jdbc:mysql://<host name>/<database name>?createDatabaseIfNotExist=true

    元数据存储在MySQL数据库中。

    javax.jdo.option.ConnectionDriverName

    com.mysql.jdbc.Driver

    MySQL JDBC驱动类。

    javax.jdo.option.ConnectionUserName

    <user name>

    连接MySQL的用户名。

    javax.jdo.option.ConnectionPassword

    <password>

    连接MySQL的密码。

    hive.metastore.uris

    空值

    本地模式下为空值。

    hive.metastore.warehouse.dir

    /user/hive/warehouse

    Hive表的默认位置。

     

    远程元存储

           在远程模式下,所有的Hive客户端都将打开一个到元数据服务器的连接,该服务器依次查询元数据。元数据服务器和客户端之间使用Thrift协议通信,从Hive-0.5.0开始,可以执行下面的命令启动Thrift服务器:

           hive--service metastore

           下面以MySQL为例,分别学习服务器端和客户端的配置,服务器端的配置如下表所示:

    配置参数

    描述

    javax.jdo.option.ConnectionURL

    jdbc:mysql://<host name>/<database name>?createDatabaseIfNotExist=true

    元数据存储在MySQL数据库中。

    javax.jdo.option.ConnectionDriverName

    com.mysql.jdbc.Driver

    MySQL JDBC驱动类。

    javax.jdo.option.ConnectionUserName

    <user name>

    连接MySQL的用户名。

    javax.jdo.option.ConnectionPassword

    <password>

    连接MySQL的密码。

    hive.metastore.warehouse.dir

    /user/hive/warehouse

    Hive表的默认位置。

           客户端的配置为:

    配置参数

    描述

    hive.metastore.uris

    thrift://<host_name>:<port>

    Thrift元存储服务器的主机和端口号。

    hive.metastore.warehouse.dir

    /user/hive/warehouse

    Hive表的默认位置。

           在启动客户端和元存储服务器之前需要将JDBC驱动类库放到$HIVE_HOME/lib目录下。







    hive配置远程metastore




      hive配置远程metastore的方法:

        1)首先配置hive使用本地mysql存储metastore(服务器A 111.121.21.23)(也可以使用远程mysql存储)

        2)配置完成后,在服务器A启动服务:bin/hive --service metastore  (默认监听端口是:9083)

        3)配置hive客户端,修改hive-site.xml:(服务器B-需要有hadoop环境)

    <property>
               <name>hive.metastore.local</name>
               <value>false</value>
               <description>controls whether to connect to remove metastore server or open a new metastore server in Hive Client JVM</description>
             </property>
             
             <property>
               <name>hive.metastore.uris</name>
               <value>thrift://111.121.21.23:9083</value>
               <description></description>
             </property>

         4)运行:bin/hive ,执行测试hql

         5)hive客户端连接成功后,hive服务器端输出以下日志