【问题标题】:sqoop fails to store incremental state to the metastoresqoop 无法将增量状态存储到元存储
【发布时间】:2016-09-11 14:09:39
【问题描述】:

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

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 参数中指定的默认 HSQL db url 是什么?

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

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

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

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

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

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

【问题讨论】:

    标签: sqoop oozie


    【解决方案1】:

    今天在使用 MySQL 时遇到了同样的问题并找出了原因。

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

    我所做的只是在元存储中重新创建 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;
    

    【讨论】:

    • 我已经在互联网上搜索了 2 周来寻找这个!谢谢!
    【解决方案2】:

    看起来你的错误是在 mySQL 端。 引起:java.sql.SQLException: Lock wait timeout exceeded;尝试重启事务

    你能发送你用来运行它的完整命令吗?

    在 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;

    【讨论】:

      【解决方案3】:

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

      => Running Hsqldb (1.8) as a System Daemon

      然后您必须定期备份数据 => 连接 JDBC 客户端,运行 CHECKPOINT,备份包含重建数据库快照所需的所有 SQL 的“脚本”文件。

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

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

      【讨论】:

        猜你喜欢
        • 2018-12-11
        • 1970-01-01
        • 2014-07-27
        • 1970-01-01
        • 1970-01-01
        • 2018-07-14
        • 2019-02-20
        • 2014-06-12
        • 2022-08-18
        相关资源
        最近更新 更多