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

sqoop fails to store incremental state to the metastore

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

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 上没有 运行ning。sqoop-metastore 命令当然可以启动它,但在那种情况下它不是 运行ning 作为服务。

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

看起来你的错误是在 mySQL 方面。 Caused by: java.sql.SQLException: Lock wait timeout exceeded;尝试重启交易

你能把你用来运行的完整命令发送给这个吗?

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

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

显示变量 'innodb_lock_wait_timeout';

你可以在 /etc/my.cnf 中使用此行将其永久设置为更高的值

innodb_lock_wait_timeout=120 并重新启动 mysql。

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

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

设置innodb_lock_wait_timeout=120;

在某处将 HSQLDB 实例作为 Linux 服务启动并不非常困难。即使您坚持使用与 Sqoop1 一起打包的过时的 V1.8。

=> Running Hsqldb (1.8) as a System Daemon

然后你必须定期备份数据=>连接JDBC客户端,运行一个CHECKPOINT,备份包含所有[=32]的"script"文件=] 重建数据库快照所必需的。

可能比尝试将 MySQL JDBC 连接到需要 HSQLDB 的 that source code 中要容易得多。

啊,无需额外费用,您会发现 here 一些关于如何在默认 conf 文件中使用 Java 属性而不是命令行参数的解释。

运行 今天遇到了与 MySQL 相同的问题,并找到了原因。

我猜 Sqoop 将自己锁在了同一进程中使用不同的 jdbc 连接。默认情况下,MariaDB (MySQL) 使用 INNODB 引擎创建 table 引入事务……我想没有人用 INNODB 测试过 Sqoop。

我所做的只是在 Metastore 中重新创建 SQOOP_SESSIONS table 并使用 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;

当然,如果你有工作,你肯定不想失去你创造的工作。在删除 table:

之前复制它们
insert into SQOOP_SESSIONS_n select * from SQOOP_SESSIONS;