On this page
Hive 在服务器模式下使用 Derby
嵌入式模式下的 Hive 一次只能有一个活跃用户。您可能想将Derby作为 Web Service 器运行,这样多个用户可以同时从不同系统访问它。
有关更多信息,请参见Metadata Store和Embedded Metastore。
Download Derby
建议您下载 Hive 附带的 Derby 版本。如果您已经以嵌入式模式运行 Hive,则derby.log
的第一行包含该版本。
我的结构如下所示:
/opt/hadoop/hadoop-0.17.2.1
/opt/hadoop/db-derby-10.4.1.3-bin
/opt/hadoop/hive
cd /opt/hadoop
<download>
tar -xzf db-derby-10.4.1.3-bin.tar.gz
mkdir db-derby-10.4.1.3-bin/data
Set Environment
这些年来设置的变量已经改变。 DERBY_HOME 现在是专有名称。我设置了这个和旧名称。
/etc/profile.d/derby.sh
DERBY_INSTALL=/opt/hadoop/db-derby-10.4.1.3-bin
DERBY_HOME=/opt/hadoop/db-derby-10.4.1.3-bin
export DERBY_INSTALL
export DERBY_HOME
Hive 还喜欢知道 Hadoop 的安装位置:
/etc/profile.d/hive.sh
HADOOP=/opt/hadoop/hadoop-0.17.2.1/bin/hadoop
export HADOOP
Starting Derby
Hadoop 启动时,您可能想运行 Derby。除了lsb-init-script
之外,可能还有一个有趣的地方,例如start-dfs
。默认情况下,Derby 将在其启动目录中创建数据库。
cd /opt/hadoop/db-derby-10.4.1.3-bin/data
# If you are using JDK 1.7u51+, you'll need to either specify an ephemeral port (typically between 49152 and 65535)
# or add a grant to your JDK version's java.policy file.
# See http://stackoverflow.com/questions/21154400/unable-to-start-derby-database-from-netbeans-7-4 for details.
nohup /opt/hadoop/db-derby-10.4.1.3-bin/startNetworkServer -h 0.0.0.0 &
配置 Hive 以使用网络 Derby
如下编辑/opt/hadoop/hive/conf/hive-site.xml
。请注意,“ hadoop1”应替换为可以找到 DerbyWeb Service 器的主机名或 IP 地址。
/opt/hadoop/hive/conf/hive-site.xml
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby://hadoop1:1527/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.ClientDriver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
/opt/hadoop/hive/conf/jpox.properties
版本: 在 Hive 5.0 或更高版本中,不使用 JPOX 属性。
JPOX 属性可以在hive-site.xml
中指定。通常,不需要jpox.properties
更改。
javax.jdo.PersistenceManagerFactoryClass=org.jpox.PersistenceManagerFactoryImpl
org.jpox.autoCreateSchema=false
org.jpox.validateTables=false
org.jpox.validateColumns=false
org.jpox.validateConstraints=false
org.jpox.storeManagerType=rdbms
org.jpox.autoCreateSchema=true
org.jpox.autoStartMechanismMode=checked
org.jpox.transactionIsolation=read_committed
javax.jdo.option.DetachAllOnCommit=true
javax.jdo.option.NontransactionalRead=true
javax.jdo.option.ConnectionDriverName=org.apache.derby.jdbc.ClientDriver
javax.jdo.option.ConnectionURL=jdbc:derby://hadoop1:1527/metastore_db;create=true
javax.jdo.option.ConnectionUserName=APP
javax.jdo.option.ConnectionPassword=mine
复制 Derby Jar 文件
现在,由于有一个新 Client 端,您必须确保 Hive 在lib
目录或 Classpath 中具有这些jar
文件。如果您使用 MySQL 或其他数据库,也是如此。
cp /opt/hadoop/db-derby-10.4.1.3-bin/lib/derbyclient.jar /opt/hadoop/hive/lib
cp /opt/hadoop/db-derby-10.4.1.3-bin/lib/derbytools.jar /opt/hadoop/hive/lib
如果收到错误“ javax.jdo.JDOFatalInternalException: Error creating transactional connection factory
”,其中堆栈跟踪起源于“ org.datanucleus.exceptions.ClassNotResolvedException: Class 'org.apache.derby.jdbc.ClientDriver' was not found in the CLASSPATH. Please check your specification and your CLASSPATH
”,则可以将 Derby jar
文件直接放在 Hadoop lib
目录中,这可能会有所帮助:
cp /opt/hadoop/db-derby-10.4.1.3-bin/lib/derbyclient.jar /opt/hadoop/hadoop-0.17.2.1/lib
cp /opt/hadoop/db-derby-10.4.1.3-bin/lib/derbytools.jar /opt/hadoop/hadoop-0.17.2.1/lib
启动 Hive
在第一个查询命中它之前,不会创建该元存储。
cd /opt/hadoop/hive
bin/hive
hive> show tables;
应该创建一个目录:/opt/hadoop/db-derby-10.4.1.3-bin/data/metastore_db
。
The Result
现在,您可以同时远程运行多个处理相同数据的 Hive 实例。