#Embedded Metastore#
嵌入式metastore主要用于单元测试。同一时刻只有一个进程可以连接到metastore,所以它不是一个事实上的解决方案,但是可以很好的用于单元测试。
Derby是嵌入式metastore默认的数据库。
<table border="1"> <thead> <tr> <td>Config Param</td> <td>Config Value</td> <td>Comment</td> </tr> </thead> <tbody> <tr> <td>javax.jdo.option.ConnectionURL</td> <td>jdbc:derby:;databaseName=../build/test/junit_metastore_db;create=true</td> <td>Derby数据库位置在hive/trunk/build...</td> </tr> <tr> <td>javax.jdo.option.ConnectionDriverName</td> <td>org.apache.derby.jdbc.EmbeddedDriver</td> <td>Derby嵌入式JDBC驱动类</td> </tr> <tr> <td>hive.metastore.uris</td> <td>本地metastore不需要设置</td> <td>< </td> </tr> <tr> <td>hive.metastore.local</td> <td>true</td> <td>嵌入式是本地的</td> </tr> <tr> <td>hive.metastore.warehouse.dir</td> <td>file://${user.dir}/../build/ql/test/data/warehouse</td> <td>单元测试数据在你本地磁盘上的这个位置</td> </tr> </tbody> </table>
If you want to run Derby as a network server so the metastore can be accessed from multiple nodes, see Hive Using Derby in Server Mode.
#Local Metastore#
在本地metastore设置中,每一个Hive客户端将会打开一个到datastore的连接并且在其上执行SQL查询。下面的配置将在一个MySQL服务器建立一个metastore。Make sure that the server is accessible from the machines where Hive queries are executed since this is a local store,并且确保JDBC客户端包在Hive客户端的classpath下。
<table border="1"> <thead> <tr> <td>Config Param</td> <td>Config Value</td> <td>Comment</td> </tr> </thead> <tbody> <tr> <td>javax.jdo.option.ConnectionURL</td> <td>jdbc:mysql://< host name>/< database name>?createDatabaseIfNotExist=true</td> <td>metastore存储在MySQL服务器</td> </tr> <tr> <td>javax.jdo.option.ConnectionDriverName</td> <td>com.mysql.jdbc.Driver</td> <td>MySQL JDBC驱动类</td> </tr> <tr> <td>javax.jdo.option.ConnectionUserName</td> <td>user name</td> <td>连接MySQL服务器的用户名</td> </tr> <tr> <td>javax.jdo.option.ConnectionPassword</td> <td>< password< </td> <td>连接到MySQL服务器的密码</td> </tr> <tr> <td>hive.metastore.uris</td> <td>本地metastore不需要设置</td> <td>< </td> </tr> <tr> <td>hive.metastore.local</td> <td>true</td> <td>这里是本地存储</td> </tr> <tr> <td>hive.metastore.warehouse.dir</td> <td>< base hdfs path>< </td> <td>Hive表的默认位置</td> </tr> </tbody> </table>
#Remote Metastore#
在远程metastore设置中,所有Hive客户端将创建一个到metastore服务器的连接,他们轮流查询datastore(例子中是MySQL)得到metastore。Metastore服务器和客户端通过Thrift协议通信。从Hive0.5.0开始,你可以通过执行下面的命令启动一个Thrift服务:
<pre> hive --service metastore </pre>
在Hive 0.5.0之前的版本中,反而需要通过直接执行Java来运行一个Thrift服务。
<pre> $JAVA_HOME/bin/java -Xmx1024m -Dlog4j.configuration=file://$HIVE_HOME/conf/hms-log4j.properties -Djava.library.path=$HADOOP_HOME/lib/native/Linux-amd64-64/ -cp $CLASSPATH org.apache.hadoop.hive.metastore.HiveMetaStore </pre>
如果你直接执行Java ,JAVA_HOME,HIVE_HOME,HADOOP_HOME 必须设置正确,CLASSPATH必须包括Hadoop,Hive(lib and auxlib)和Java jars。
##服务端配置参数##
<table border="1"> <thead> <tr> <td>Config Param</td> <td>Config Value</td> <td>Comment</td> </tr> </thead> <tbody> <tr> <td>javax.jdo.option.ConnectionURL</td> <td>jdbc:mysql://< host name>/< database name>?createDatabaseIfNotExist=true</td> <td>metastore存储在MySQL服务器</td> </tr> <tr> <td>javax.jdo.option.ConnectionDriverName</td> <td>com.mysql.jdbc.Driver</td> <td>MySQL JDBC驱动类</td> </tr> <tr> <td>javax.jdo.option.ConnectionUserName</td> <td>user name</td> <td>连接MySQL服务器的用户名</td> </tr> <tr> <td>javax.jdo.option.ConnectionPassword</td> <td>< password< </td> <td>连接到MySQL服务器的密码</td> </tr> <tr> <td>hive.metastore.warehouse.dir</td> <td>< base hdfs path>< </td> <td>Hive表的默认位置</td> </tr> </tbody> </table>
##客户端配置参数##
<table border="1"> <thead> <tr> <td>Config Param</td> <td>Config Value</td> <td>Comment</td> </tr> </thead> <tbody> <tr> <td>hive.metastore.uris</td> <td>thrift://<hostname>:<port></td> <td>Thrift metastore 服务的host和port </td> </tr> <tr> <td>hive.metastore.local</td> <td>false</td> <td>This is local store. Note: This is no longer needed as of Hive 0.10. Setting hive.metastore.uris is sufficient.</td> </tr> <tr> <td>hive.metastore.warehouse.dir</td> <td>< base hdfs path>< </td> <td>Hive表的默认位置</td> </tr> </tbody> </table>
如果你使用MySQL作为metadata的datastore,在启动Hive 客户端或者HiveMetaStore服务之前将MySQL client 包将在HIVE_HOME/lib下。
要改变metastore的端口,使用下面的hive命令:
<pre> hive --service metastore -p < port_num> </pre>