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

ecr0jaav  于 2021-06-04  发布在  Sqoop
关注(0)|答案(3)|浏览(453)

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

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

我已将默认元存储更改为mysql。其他一切都很顺利。我知道有些消息来源说sqoop不支持它。在这种情况下,我还需要知道需要在--metaconnect参数中指定的默认hsqldburl是什么?
在sqoop site.xml中,我看到它是:

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

但我在--元连接中指定了什么?我相信这是没有具体说明在那里。
我需要显式指定meta-connect,因为我正在通过oozie运行作业,因此需要指定meta-connect。
我检查了又检查,但16000端口上没有运行任何东西。sqoop metastore命令当然可以启动它,但在这种情况下,它并不是作为服务运行的。
因此,我要问的是一种将sqoop metastore作为服务运行的方法,或者需要知道为什么在为mysql配置metastore时,它无法在metastore中存储状态。

ibrsph3r

ibrsph3r1#

看起来你的错误在mysql这边。原因:java.sql.sqlexception:超过锁等待超时;尝试重新启动事务
你能发送你用来运行这个的完整命令吗。
在中检查以下内容mysql:- show 引擎innodb状态\g
您应该考虑通过设置innodb\u lock\u wait\u timeout来增加innodb的锁等待超时值,默认值是50秒
显示“innodb\u lock\u wait\u timeout”等变量;
您可以使用此行在/etc/my.cnf中将其永久设置为更高的值
innodb\u lock\u wait\u timeout=120,重启mysql。
如果此时无法重新启动mysql,请运行以下命令:
设置全局innodb\u lock\u wait\u timeout=120;您也可以在会话期间设置它
设置innodb\u lock\u wait\u timeout=120;

9bfwbjaz

9bfwbjaz2#

今天mysql遇到了同样的问题,并找出了原因。
我猜sqoop通过在同一进程中使用不同的jdbc连接将自己锁定在外。默认情况下,mariadb(mysql)使用innodb引擎创建表,该引擎引入事务。。。我猜没人用innodb测试过sqoop。
我所做的只是在metastore中重新创建sqoop\u 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;
sgtfey8w

sgtfey8w3#

在某个地方启动一个hsqldb示例作为linux服务并不困难。即使您坚持使用sqoop1打包的过时的v1.8。
=>作为系统守护进程运行hsqldb(1.8)
然后您必须定期备份数据=>连接jdbc客户机,运行检查点,备份包含重建db快照所需的所有sql的“脚本”文件。
可能比尝试将mysql-jdbc连接破解到需要hsqldb的源代码要容易得多。
在这里,您将看到一些关于如何在默认conf文件中使用java属性而不是命令行参数的解释,而无需额外付费。

相关问题