天天看点

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-0.10已经不再使用该参数: 如果

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(元数据存储)的三种方式:

  • 内嵌Derby方式
  • Local方式
  • Remote方式

[一]、内嵌Derby方式

这个是Hive默认的启动模式,一般用于单元测试,这种存储方式有一个缺点:在同一时间只能有一个进程连接使用数据库。

hive-site.xml 中jdbc URL、驱动、用户名、密码等的配置信息如下:

XHTML <property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:derby:;databaseName=metastore_db;create=true</value>

<description>JDBC connect string for a JDBC metastore</description>

</property>

<property>

<name>javax.jdo.option.ConnectionDriverName</name>

<value>org.apache.derby.jdbc.EmbeddedDriver</value>

<description>Driver class name for a JDBC metastore</description>

</property>

<property>

<name>javax.jdo.option.ConnectionUserName</name>

<value>APP</value>

<description>username to use against metastore database</description>

</property>

<property>

<name>javax.jdo.option.ConnectionPassword</name>

<value>mine</value>

<description>password to use against metastore database</description>

</property>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>file:///Users/micmiu/tmp/hive/warehouse</value>

<description>unit test data goes in here on your local filesystem</description>

</property>

<!-- micmiu.com -->

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <property>    <name> javax.jdo.option.ConnectionURL </name>    <value> jdbc:derby:;databaseName=metastore_db;create=true </value>    <description> JDBC connect string for a JDBC metastore </description> </property>   <property>    <name> javax.jdo.option.ConnectionDriverName </name>    <value> org.apache.derby.jdbc.EmbeddedDriver </value>    <description> Driver class name for a JDBC metastore </description> </property>   <property>    <name> javax.jdo.option.ConnectionUserName </name>    <value> APP </value>    <description> username to use against metastore database </description> </property>   <property>    <name> javax.jdo.option.ConnectionPassword </name>    <value> mine </value>    <description> password to use against metastore database </description> </property>   <property>    <name> hive.metastore.warehouse.dir </name>    <value> file:///Users/micmiu/tmp/hive/warehouse </value>    <description> unit test data goes in here on your local filesystem </description> </property>   <!-- micmiu.com -->

执行初始化命令:

schematool -dbType derby -initSchema

查看初始化后的信息: 

schematool -dbType derby -info

配置完成后就可在shell中以CLI的方式访问hive 进行操作验证。

[二]、Local方式

以本地Mysql数据库为例:创建好用户:hive;database:hive。

配置文件 hive-site.xml 中jdbc URL、驱动、用户名、密码等属性值配置如下:

XHTML <property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://localhost/hive?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>hive</value>

<description>username to use against metastore database</description>

</property>

<property>

<name>javax.jdo.option.ConnectionPassword</name>

<value>micmiu</value>

<description>password to use against metastore database</description>

</property>

<property>

<name>hive.metastore.warehouse.dir</name>

<!-- base hdfs path -->

<value>/user/hive/warehouse</value>

<description>location of default database for the warehouse</description>

</property>

<!-- micmiu.com -->

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <property>    <name> javax.jdo.option.ConnectionURL </name>    <value> jdbc:mysql://localhost/hive?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> hive </value>    <description> username to use against metastore database </description> </property>   <property>    <name> javax.jdo.option.ConnectionPassword </name>    <value> micmiu </value>    <description> password to use against metastore database </description> </property>   <property>    <name> hive.metastore.warehouse.dir </name>    <!-- base hdfs path -->    <value> /user/hive/warehouse </value>    <description> location of default database for the warehouse </description> </property> <!-- micmiu.com -->

ps:需要把mysql的驱动包copy到目录 <HIVE_HOME>/lib 中

如果是第一次需要执行初始化命令:

schematool -dbType mysql -initSchema

micmiu-mbp:mysql micmiu$ schematool -dbType mysql -initSchema

14/02/17 14:46:08 INFO Configuration.deprecation: mapred.input.dir.recursive is deprecated. Instead, use mapreduce.input.fileinputformat.input.dir.recursive

14/02/17 14:46:08 INFO Configuration.deprecation: mapred.max.split.size is deprecated. Instead, use mapreduce.input.fileinputformat.split.maxsize

14/02/17 14:46:08 INFO Configuration.deprecation: mapred.min.split.size is deprecated. Instead, use mapreduce.input.fileinputformat.split.minsize

14/02/17 14:46:08 INFO Configuration.deprecation: mapred.min.split.size.per.rack is deprecated. Instead, use mapreduce.input.fileinputformat.split.minsize.per.rack

14/02/17 14:46:08 INFO Configuration.deprecation: mapred.min.split.size.per.node is deprecated. Instead, use mapreduce.input.fileinputformat.split.minsize.per.node

14/02/17 14:46:08 INFO Configuration.deprecation: mapred.reduce.tasks is deprecated. Instead, use mapreduce.job.reduces

14/02/17 14:46:08 INFO Configuration.deprecation: mapred.reduce.tasks.speculative.execution is deprecated. Instead, use mapreduce.reduce.speculative

Metastore connection URL: jdbc:mysql://localhost/hive?createDatabaseIfNotExist=true

Metastore Connection Driver : com.mysql.jdbc.Driver

Metastore connection User: hive

Starting metastore schema initialization to 0.12.0

Initialization script hive-schema-0.12.0.mysql.sql

Initialization script completed

schemaTool completeted

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 micmiu - mbp : mysql micmiu $ schematool - dbType mysql - initSchema 14 / 02 / 17 14 : 46 : 08 INFO Configuration . deprecation : mapred . input . dir . recursive is deprecated . Instead , use mapreduce . input . fileinputformat . input . dir . recursive 14 / 02 / 17 14 : 46 : 08 INFO Configuration . deprecation : mapred . max . split . size is deprecated . Instead , use mapreduce . input . fileinputformat . split . maxsize 14 / 02 / 17 14 : 46 : 08 INFO Configuration . deprecation : mapred . min . split . size is deprecated . Instead , use mapreduce . input . fileinputformat . split . minsize 14 / 02 / 17 14 : 46 : 08 INFO Configuration . deprecation : mapred . min . split . size . per . rack is deprecated . Instead , use mapreduce . input . fileinputformat . split . minsize . per . rack 14 / 02 / 17 14 : 46 : 08 INFO Configuration . deprecation : mapred . min . split . size . per . node is deprecated . Instead , use mapreduce . input . fileinputformat . split . minsize . per . node 14 / 02 / 17 14 : 46 : 08 INFO Configuration . deprecation : mapred . reduce . tasks is deprecated . Instead , use mapreduce . job . reduces 14 / 02 / 17 14 : 46 : 08 INFO Configuration . deprecation : mapred . reduce . tasks . speculative . execution is deprecated . Instead , use mapreduce . reduce . speculative Metastore connection URL : jdbc : mysql : //localhost/hive?createDatabaseIfNotExist=true Metastore Connection Driver : com . mysql . jdbc . Driver Metastore connection User : hive Starting metastore schema initialization to 0.12.0 Initialization script hive - schema - 0.12.0.mysql.sql Initialization script completed schemaTool completeted

查看初始化后信息 

schematool -dbType mysql -info

初始化后查看mysql中表情况:

show tables;

mysql&gt; show tables;

+---------------------------+

| Tables_in_hive |

+---------------------------+

| BUCKETING_COLS |

| CDS |

| COLUMNS_V2 |

| DATABASE_PARAMS |

| DBS |

| DB_PRIVS |

| DELEGATION_TOKENS |

| GLOBAL_PRIVS |

| IDXS |

| INDEX_PARAMS |

| MASTER_KEYS |

| NUCLEUS_TABLES |

| PARTITIONS |

| PARTITION_EVENTS |

| PARTITION_KEYS |

| PARTITION_KEY_VALS |

| PARTITION_PARAMS |

| PART_COL_PRIVS |

| PART_COL_STATS |

| PART_PRIVS |

| ROLES |

| ROLE_MAP |

| SDS |

| SD_PARAMS |

| SEQUENCE_TABLE |

| SERDES |

| SERDE_PARAMS |

| SKEWED_COL_NAMES |

| SKEWED_COL_VALUE_LOC_MAP |

| SKEWED_STRING_LIST |

| SKEWED_STRING_LIST_VALUES |

| SKEWED_VALUES |

| SORT_COLS |

| TABLE_PARAMS |

| TAB_COL_STATS |

| TBLS |

| TBL_COL_PRIVS |

| TBL_PRIVS |

| TYPES |

| TYPE_FIELDS |

| VERSION |

+---------------------------+

41 rows in set (0.00 sec)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 mysql & gt ; show tables ; + -- -- -- -- -- -- -- -- -- -- -- -- -- - + | Tables_in_hive              | + -- -- -- -- -- -- -- -- -- -- -- -- -- - + | BUCKETING_COLS              | | CDS                        | | COLUMNS_V2                  | | DATABASE_PARAMS            | | DBS                        | | DB_PRIVS                    | | DELEGATION_TOKENS          | | GLOBAL_PRIVS                | | IDXS                        | | INDEX_PARAMS                | | MASTER_KEYS                | | NUCLEUS_TABLES              | | PARTITIONS                  | | PARTITION_EVENTS            | | PARTITION_KEYS              | | PARTITION_KEY_VALS          | | PARTITION_PARAMS            | | PART_COL_PRIVS              | | PART_COL_STATS              | | PART_PRIVS                  | | ROLES                      | | ROLE_MAP                    | | SDS                        | | SD_PARAMS                  | | SEQUENCE_TABLE              | | SERDES                      | | SERDE_PARAMS                | | SKEWED_COL_NAMES            | | SKEWED_COL_VALUE_LOC_MAP    | | SKEWED_STRING_LIST          | | SKEWED_STRING_LIST_VALUES | | SKEWED_VALUES              | | SORT_COLS                  | | TABLE_PARAMS                | | TAB_COL_STATS              | | TBLS                        | | TBL_COL_PRIVS              | | TBL_PRIVS                  | | TYPES                      | | TYPE_FIELDS                | | VERSION                    | + -- -- -- -- -- -- -- -- -- -- -- -- -- - + 41 rows in set ( 0.00 sec )

配置完成后就可在shell中以CLI的方式访问hive 进行操作验证。

[三]、Remote方式

以Mysql数据库(192.168.6.77)为例:创建好用户:hive;database:hive_meta。Remote方式需要分别配置服务端和客户端的配置文件:

服务端的 hive-site.xml 中jdbc URL、驱动、用户名、密码等属性值配置如下:

XHTML <property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://192.168.6.77/hive_meta?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>hive</value>

<description>username to use against metastore database</description>

</property>

<property>

<name>javax.jdo.option.ConnectionPassword</name>

<value>micmiu</value>

<description>password to use against metastore database</description>

</property>

<property>

<name>hive.metastore.warehouse.dir</name>

<!-- base hdfs path -->

<value>/user/hive/warehouse</value>

<description>base hdfs path :location of default database for the warehouse</description>

</property>

<!-- micmiu.com -->

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <property>    <name> javax.jdo.option.ConnectionURL </name>    <value> jdbc:mysql://192.168.6.77/hive_meta?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> hive </value>    <description> username to use against metastore database </description> </property>   <property>    <name> javax.jdo.option.ConnectionPassword </name>    <value> micmiu </value>    <description> password to use against metastore database </description> </property>   <property>    <name> hive.metastore.warehouse.dir </name>    <!-- base hdfs path -->    <value> /user/hive/warehouse </value>    <description> base hdfs path :location of default database for the warehouse </description> </property> <!-- micmiu.com -->

ps:需要把mysql的驱动包copy到目录 <HIVE_HOME>/lib 中

如果是第一次需要执行初始化命令:

schematool -dbType mysql -initSchema

客户端中配置内容修改如下:

XHTML <!-- thrift://<host_name>:<port> 默认端口是9083 -->

<property>

<name>hive.metastore.uris</name>

<value>thrift://192.168.6.77:9083</value>

<description>Thrift uri for the remote metastore. Used by metastore client to connect to remote metastore.</description>

</property>

<!-- hive表的默认存储路径 -->

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

<description>location of default database for the warehouse</description>

</property>

1 2 3 4 5 6 7 8 9 10 11 12 13 <!-- thrift://<host_name>:<port> 默认端口是9083 --> <property>    <name> hive.metastore.uris </name>    <value> thrift://192.168.6.77:9083 </value>    <description> Thrift uri for the remote metastore. Used by metastore client to connect to remote metastore. </description> </property>   <!--  hive表的默认存储路径 --> <property>    <name> hive.metastore.warehouse.dir </name>    <value> /user/hive/warehouse </value>    <description> location of default database for the warehouse </description> </property>

hive metastore 服务端启动命令:

hive --service metastore -p <port_num>

如果不加端口默认启动:

hive --service metastore

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

HIVE配置mysql metastore

    hive中除了保存真正的数据以外还要额外保存用来描述库、表、数据的数据,称为hive的元数据。这些元数据又存放在何处呢?

    如果不修改配置hive默认使用内置的derby数据库存储元数据。

    derby是apache开发的基于java的文件型数据库。

    可以检查之前执行命令的目录,会发现其中产生了一个metastore.db的文件,这就是derby产生的用来保存元数据的数据库文件。

    derby数据库仅仅用来进行测试,真正使用时会有很多限制。

    最明显的问题是不能支持并发。

    经测试可以发现,在同一目录下使用无法同时开启hive,不同目录下可以同时开启hive但是会各自产生metastore.db文件造成数据无法共同访问。

    所以真正生产环境中我们是不会使用默认的derby数据库保存hive的元数据的。

    hive目前支持derby和mysql来存储元数据。

    配置hive使用mysql保存元数据信息:

        删除hdfs中的/user/hive

            hadoop fs -rmr /user/hive    

        复制hive/conf/hive-default.xml.template为hive-site.xml

            cp hive-default.xml.template hive-site.xml

        在<configuration>中进行配置

            <property>

              <name>javax.jdo.option.ConnectionURL</name>

              <value>jdbc:mysql://hadoop01:3306/hive?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>root</value>

              <description>password to use against metastore database</description>

            </property>

        !!手动创建hive元数据库,注意此库必须是latin1,否则会出现奇怪问题!所以推荐手动创建!并且创建库之前不能有任意的hive操作,否则自动创建出来的库表将使用mysql默认的字符集,仍然报错!

        !!另一种方法是修改mysql的配置文件,让mysql默认编码集就是latin1,这样hive自动创建的元数据库就是latin1的了,但是这已修改将会影响整个mysql数据库,如果mysql中有其他库,这种方式并不好。

            create database hive character set latin1;

        将mysql的连接jar包拷贝到$HIVE_HOME/lib目录下

        如果出现没有权限的问题,在mysql授权(在安装mysql的机器上执行)

            mysql -uroot -p

            #(执行下面的语句  *.*:所有库下的所有表   %:任何IP地址或主机都可以连接)

            GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

            FLUSH PRIVILEGES;

        再进入hive命令行,试着创建库表发现没有问题。

        测试发现开启多个连接没有问题。

        连接mysql,发现多了一个hive库。其中保存有hive的元数据。DBS-数据库的元数据信息,TBLS-表信息。COLUMNS_V2表中字段信息,SDS-表对应hdfs目录

继续阅读