2015-08-21 65 views
0

我設立一個自動的過程從Oracle表sqoop與此命令的HDFS目錄:Sqoop從Oracle:「快照太舊」

sqoop-import --connect jdbc:oracle:thin:@redacted.company.com:1234/db --username redacted --password secret123 --num-mappers 1 --table table --target-dir /data/destination/directory/ --as-avrodatafile --compress --compression-codec org.apache.hadoop.io.compress.BZip2Codec 

不幸的是,我收到以下錯誤消息:

Error:java.io.IOException: SQLException in nextKeyValue 
    ... 
Caused by: java.sql.SQLException: ORA-01555: snapshot too old: rollback segment number 336 with name "_SYSSMU336_879580159$" too small 
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447) 
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) 
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951) 
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513) 
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227) 
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) 
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:208) 

我試圖實現的業務需求是將整個表導入到hdfs中。由於我們不擁有或管理此數據庫,因此我無法控制UNDO表空間和相關參數。這項工作計劃在凌晨1點運行,這不是一個高峯時間,但由於自動化流程觸及它,我不能鼓勵人們在工作中停止使用它。

我該如何修改我的sqoop-import語句以避免此錯誤?

回答

0

--num-mappers=10(即提高並行)的用法是足以克服在這種情況下,問題不影響源太多了。

此外,添加--direct參數將導致Sqoop使用Oracle特定的連接器,這將進一步加快速度,只要我說服該數據庫上的DBA以便打開必要的權限,就會將其添加到我的解決方案中。 Direct還支持選項-Doraoop.import.consistent.read={true|false},該選項似乎反映了Oracle導出實用程序的CONSISTENT參數功能(注意,默認爲false),這是因爲撤消表空間不會用於保持一致性,不需要競爭導入在撤消表空間完全填滿之前。

0

這不是一個Sqoop問題。您將直接在Oracle上執行相同的語句時出現相同的錯誤。這是一個撤消表空間問題。您必須加快查詢速度,或者必須增加Oracle撤消表空間大小。

可能的修補程序的列表:

  • 計劃時,有少數據庫活動的任務(甚至 要求人們停止工作了一段時間)。
  • 優化因此錯誤而失敗的查詢以讀取較少的數據 並縮短佔用時間增加UNDO表空間的大小。
  • 增加UNDO_RETENTION參數的大小。
  • 將UNDO表空間設置爲GUARANTEE模式。
  • 如果您要導出表格,請考慮使用 導出CONSISTENT = no參數。
  • 不要遊標循環中提交

問候 Giova

+0

儘管技術上合理,但我無法進行這些修復:作業已計劃在非高峯時段,並且我沒有擁有該數據庫,也沒有任何管理權限來混淆UNDO表空間和相關參數。我需要聯繫數據庫所有者,看看他們是否可以自己提供出口,或者至少讓我們使用oracle自己的導出工具來獲取數據。 –