Hive 在服务器模式下使用 Derby

嵌入式模式下的 Hive 一次只能有一个活跃用户。您可能想将Derby作为 Web Service 器运行,这样多个用户可以同时从不同系统访问它。

有关更多信息,请参见Metadata StoreEmbedded 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 实例。