sqoop无法将增量状态存储到Metastore

时间:2016-05-15 19:38:12

标签: sqoop oozie

我在保存增量导入状态时得到了这个

16/05/15 21:43:05 INFO tool.ImportTool: Saving incremental import state to the metastore
16/05/15 21:43:56 ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: Error communicating with database
at org.apache.sqoop.metastore.hsqldb.HsqldbJobStorage.createInternal(HsqldbJobStorage.java:426)
at org.apache.sqoop.metastore.hsqldb.HsqldbJobStorage.update(HsqldbJobStorage.java:445)
at org.apache.sqoop.tool.ImportTool.saveIncrementalState(ImportTool.java:164)
at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:518)
at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:605)
at org.apache.sqoop.tool.JobTool.execJob(JobTool.java:228)
at org.apache.sqoop.tool.JobTool.run(JobTool.java:283)
at org.apache.sqoop.Sqoop.run(Sqoop.java:148)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:184)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:226)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:235)
at org.apache.sqoop.Sqoop.main(Sqoop.java:244)
Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3597)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3529)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2625)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2415)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2333)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2318)
at org.apache.sqoop.metastore.hsqldb.HsqldbJobStorage.setV0Property(HsqldbJobStorage.java:707)
at org.apache.sqoop.metastore.hsqldb.HsqldbJobStorage.createInternal(HsqldbJobStorage.java:391)
... 12 more 

我已将默认的Metastore更改为MySQL。其他一切都很好。我知道有些消息来源说sqoop不支持它。在这种情况下,我还需要知道在--metaconnect参数中需要指定的默认HSQL数据库URL是什么?

在sqoop site.xml中,我看到它是:

jdbc:hsqldb:file:/tmp/sqoop-meta/meta.db;shutdown=true

但是我在--meta-connect中指定了什么?我确信这不是在那里指定的。

我需要明确指定元连接,因为我正在通过oozie运行作业,因此需要指定元连接。

我已检查并重新检查但是没有任何东西在端口16000上运行.sqoop-metastore命令可以启动它,但在那种情况下它不作为服务运行。

所以我要问的是将sqoop Metastore作为服务运行的方法,或者需要知道为什么在为mysql配置时无法将该状态存储在Metastore中。

3 个答案:

答案 0 :(得分:2)

今天遇到与MySQL相同的问题并找出原因。

Sqoop通过在同一进程中使用不同的jdbc连接来锁定自己。默认情况下,MariaDB(MySQL)使用创建事务的INNODB引擎创建表...我猜没有人用INNODB测试Sqoop。

我所做的就是在Metastore中重新创建SQOOP_SESSIONS表并使用MyISAM引擎。

CREATE TABLE `SQOOP_SESSIONS_n` (
  `job_name` varchar(64) NOT NULL,
  `propname` varchar(128) NOT NULL,
  `propval` varchar(1024) DEFAULT NULL,
  `propclass` varchar(32) NOT NULL,
  UNIQUE KEY `SQOOP_SESSIONS_n_unq` (`job_name`,`propname`,`propclass`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

drop table SQOOP_SESSIONS;

rename table SQOOP_SESSIONS_n to SQOOP_SESSIONS;

当然,如果你有任何工作,你不会想要失去创造的工作。只需在删除表之前复制它们:

insert into SQOOP_SESSIONS_n select * from SQOOP_SESSIONS;

答案 1 :(得分:1)

看起来你的错误是在mySQL方面。 引起:java.sql.SQLException:超出锁定等待超时;尝试重新启动交易

您是否可以发送用于运行此命令的完整命令。

检查MySQL中的以下内容: - 显示引擎innodb状态\ G

您应该考虑通过设置innodb_lock_wait_timeout来增加InnoDB的锁定等待超时值,默认为50秒

显示变量,例如" innodb_lock_wait_timeout';

您可以使用此行

永久地在/etc/my.cnf中将其设置为更高的值

innodb_lock_wait_timeout = 120 并重启mysql。

如果此时无法重启mysql,请运行:

SET GLOBAL innodb_lock_wait_timeout = 120; 您也可以在会话期间设置它

SET innodb_lock_wait_timeout = 120;

答案 2 :(得分:0)

It is not very difficult to start a HSQLDB instance as a Linux service somewhere. Even if you stick to the obsolete V1.8 that is packaged with Sqoop1.

=> Running Hsqldb (1.8) as a System Daemon

Then you have to backup the data periodically => connect with JDBC client, run a CHECKPOINT, backup the "script" file that contains all SQL necessary to rebuild the DB snapshot.

Might be much easier than trying to hack a MySQL JDBC connection into that source code that expects HSQLDB.

Ah, and for no additional cost, you will find here some explanations about how to use Java properties in the default conf files instead of command-line arguments.