Java 配置单元事务正在崩溃

Java 配置单元事务正在崩溃,java,maven,hadoop,transactions,hive,Java,Maven,Hadoop,Transactions,Hive,好吧,我已经处理这个问题好几天了,它快把我逼疯了。我需要使用配置单元数据库和事务来执行“更新”和“删除”操作 我已经在我的机器上以伪分布式模式安装了Hadoop和Hive。我在安装过程中遵循了这一点。我正在使用Java1.8.0\u31、Hadoop2.6.0、Hive1.0.0,我还更改了一些细节,但这些都不相关 现在,要启动我的环境(例如,在重新启动后),我运行以下命令: start-dfs.sh start-yarn.sh java -jar /usr/local/derby/lib/de

好吧,我已经处理这个问题好几天了,它快把我逼疯了。我需要使用配置单元数据库和事务来执行“更新”和“删除”操作

我已经在我的机器上以伪分布式模式安装了Hadoop和Hive。我在安装过程中遵循了这一点。我正在使用Java1.8.0\u31、Hadoop2.6.0、Hive1.0.0,我还更改了一些细节,但这些都不相关

现在,要启动我的环境(例如,在重新启动后),我运行以下命令:

start-dfs.sh
start-yarn.sh
java -jar /usr/local/derby/lib/derbyrun.jar server start &
hive
一切似乎都很好。尽管本教程没有提到启动derby,但如果我不启动它,metastore将不可用(这似乎合乎逻辑),hive也不会启动

从这里,我可以创建表、显示表、连接JDBC客户机等等,一切都很好。现在,我需要启用事务。接下来,我将执行以下命令:

hive --hiveconf hive.root.logger=info,console 
    --hiveconf hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager 
    --hiveconf hive.compactor.initiator.on=true 
    --hiveconf hive.compactor.worker.threads=1 
    --hiveconf hive.txn.driver=jdbc:derby://localhost:1527/metastore_db;create=true
旁注:我之所以更改命令而不是hive-site.xml,只是因为在尝试什么有效什么无效时更容易在命令之间进行更改,而不是重复更改xml文件

我还尝试将驱动程序url更改为
jdbc:derby://localhost:1527/metastore_db;create=true;用户=应用程序;password=mine
以防万一,但没有更改。当我发出命令(如
show tables
)时,我得到一个错误:

15/03/04 23:26:17 [main]: ERROR metastore.RetryingHMSHandler: 
    MetaException(message:Unable to select from transaction database, 
    java.sql.SQLSyntaxErrorException: Table/View 'TXNS' does not exist.
根据和其中一个,似乎
hive.in.test
属性必须设置为
true
。因此,我的启动命令变成:

hive --hiveconf hive.root.logger=info,console 
    --hiveconf hive.in.test=true 
    --hiveconf hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager 
    --hiveconf hive.compactor.initiator.on=true 
    --hiveconf hive.compactor.worker.threads=1 
    --hiveconf hive.txn.driver=jdbc:derby://localhost:1527/metastore_db;create=true;
使用此命令,我得到一个新错误:

ERROR metastore.RetryingHMSHandler: java.lang.NullPointerException
    at org.apache.hadoop.hive.metastore.txn.TxnHandler.checkQFileTestHack(TxnHandler.java:1146)
这个错误在任何地方都不存在,我觉得我是互联网上唯一一个有这个错误的人。无论如何,因为我找不到任何解决方案,我深入研究了源代码:

private void checkQFileTestHack() {
  boolean hackOn = HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_IN_TEST) ||
    HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_IN_TEZ_TEST);

  LOG.info("Before if");
  if (hackOn) {
      LOG.info("Hacking in canned values for transaction manager");
      // Set up the transaction/locking db in the derby metastore
      TxnDbUtil.setConfValues(conf);
      try {
          TxnDbUtil.prepDb();
      } catch (Exception e) {
          // We may have already created the tables and thus don't need to redo it.
          if (!e.getMessage().contains("already exists")) {
              throw new RuntimeException("Unable to set up transaction database for" +
                " testing: " + e.getMessage());
          }
      }
  }
}
第1146行是
if(!e.getMessage().contains(“已存在”)
行,这似乎没有什么意义,除非“e”是null,这很奇怪。无论如何,我想我可以通过添加更多的日志消息、构建项目并替换我修改过的原始metastore jar(这个TxnHandler类就在这里)来进一步调试它。为此,我下载了源代码并按照它进行了构建。我尝试了maven2,但没有成功,因为一些插件只与maven3一起工作,所以我从中获得了maven3并构建了该项目

如果我使用
mvn clean install-Phadoop-2,dist
命令构建它,它不仅会花费很长时间,而且会在测试阶段失败。因为它在元存储上不会失败(在元存储上,它跳过了1个测试,我不确定这是否会发生),所以我想我可以不用测试就构建它。因此,我们要做的是:

mvn clean install -DskipTests -Phadoop-2,dist
rm /usr/local/hive/lib/hive-metastore-1.0.0.jar
cp packaging/target/apache-hive-1.0.0-bin/apache-hive-1.0.0-bin/lib/hive-metastore-1.0.0.jar /usr/local/hive/lib/
旁注:为了时间的利益,我也尝试了
-pl metastore-am
参数,但是虽然maven说metastore已经构建,但是lib文件夹中的jar没有改变,所以我猜我做错了什么

无论如何,这应该构建我修改过的jar,替换蜂巢中的那个,当我再次启动蜂巢时,它应该加载我的。但是,即使我更改了代码,错误仍然显示相同,我的新日志信息没有注册,甚至错误行也保持不变。就像我的新罐子里什么都没换一样

奇怪的是,我知道maven正在编译我的代码,因为它可以识别编译错误,并且我可以在jar属性上看到它是一个新文件,所以为什么我的其余更改没有显示出来呢?当我删除原始jar时,Hive可以识别,但当我用修改过的版本替换它时,就好像我什么都没做

不管怎么说,正如你所看到的,我遇到了很多麻烦,我试着去解决它们中的大部分。但是现在我陷入了这个困境,无法使用该死的“删除”命令,因为我无法启用事务。谁能给我指出正确的方向吗?太好了

。。。很抱歉发了这么长的帖子。

我跟着斯里尼瓦斯的帖子,错误消失了。我不再需要将“hive.in.test”属性设置为“true”,一切正常

我仍然不知道为什么更改源代码不会影响配置单元程序的其余部分,但我有事务在工作

编辑:如果链接断开,这里有一个报价:

提取配置单元版本后,必须创建配置单元元存储

sudo apt-get install mysql-server
sudo service mysql start
sudo apt-get install libmysql-java
ln -s /usr/share/java/libmysql-java.jar /usr/lib/hive/lib/libmysql-java.jar
sudo chkconfig mysql on

mysql -u root -p
Enter password:
mysql> CREATE DATABASE metastore;
mysql> USE metastore;
mysql> SOURCE /usr/lib/hive/scripts/metastore/upgrade/mysql/hive-schema-0.12.0.mysql.sql;

mysql> CREATE USER 'hive'@'metastorehost' IDENTIFIED BY 'mypassword';
...
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'hive'@'metastorehost';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,LOCK TABLES,EXECUTE ON metastore.* TO 'hive'@'metastorehost';
mysql> FLUSH PRIVILEGES;
mysql> quit;
然后在hive-site.xml中,需要设置新参数,如

javax.jdo.option.ConnectionURL - jdbc:mysql://myhost/metastore
javax.jdo.option.ConnectionDriverName - com.mysql.jdbc.Driver
javax.jdo.option.ConnectionUserName - hive
javax.jdo.option.ConnectionPassword - mypassword
datanucleus.autoCreateSchema - false
datanucleus.fixedDatastore - true
datanucleus.autoStartMechanism - SchemaTable
hive.metastore.uris - thrift://<n.n.n.n>:9083

hive.support.concurrency – true  
hive.enforce.bucketing – true 
hive.exec.dynamic.partition.mode – nonstrict  
hive.txn.manager – org.apache.hadoop.hive.ql.lockmgr.DbTxnManager 
hive.compactor.initiator.on – true  
hive.compactor.worker.threads – 1
javax.jdo.option.ConnectionURL-jdbc:mysql://myhost/metastore
javax.jdo.option.ConnectionDriverName-com.mysql.jdbc.Driver
javax.jdo.option.ConnectionUserName-配置单元
javax.jdo.option.ConnectionPassword-mypassword
datanucleus.autoCreateSchema-错误
datanucleus.fixedDatastore-true
datanucleus.AutoStart机制-可模式化
hive.metastore.uris-节俭://:9083
hive.support.concurrency–true
蜂巢。强制执行。扣球–正确
hive.exec.dynamic.partition.mode–非严格
hive.txn.manager–org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
hive.compactor.initiator.on–true
hive.compactor.worker.threads–1
然后重新启动配置单元服务器和元存储。现在创建一个普通表 以及一个具有orc格式的外部表,并从正常加载到orc 桌子现在您可以更新和删除记录


你能告诉我你到底做了什么吗?我收到锁异常:与metastore通信时出错。请按照我设置的链接()进行操作。它显示了如何创建配置单元元存储和配置配置单元。