2016-05-15 91 views
2

我得到這個對儲蓄增量導入狀態sqoop未能增量狀態存儲到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-連接?我相信這不是在那裏指定的。

我需要明確指定元連接,因爲我通過oozie運行作業,因此需要指定元連接。

我已檢查並重新檢查,但沒有任何內容在端口16000上運行。sqoop-metastore命令可以當場啓動它,但在那種情況下它不作爲服務運行。

所以我問的是要麼運行sqoop metastore作爲一種服務的方式,要麼知道爲什麼當它配置爲mysql時無法將狀態存儲在Metastore中。

回答

0

這不是很難啓動一個HSQLDB實例作爲Linux服務的某個地方。即使您堅持使用與Sqoop1打包的過時V1.8。

=>Running Hsqldb (1.8) as a System Daemon

然後,你必須將數據備份週期=>使用JDBC客戶端連接,運行CHECKPOINT,備份的「腳本」文件,該文件包含所有必要的SQL重建DB的瞬間。

可能比試圖將MySQL JDBC連接轉換爲預期HSQLDB的that source code容易得多。

啊,沒有額外的費用,你會發現here有關如何在默認conf文件中使用Java屬性而不是命令行參數的一些解釋。

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,運行此:

設置全局innodb_lock_wait_timeout = 120; 您也可以在會話期間設置它

SET innodb_lock_wait_timeout = 120;

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; 
+0

我一直在搜尋兩週的interwebs尋找這個!謝謝! – drizzie