2016-02-12 91 views
0

我正在對由計算量大的自定義查詢生成的大型記錄集進行原型遷移。這個查詢大約需要1-2個小時在SQL Developer中一個結果集返回Sqoop-2使用sqoop shell自定義查詢導致大量導入單節點失敗

我試圖此查詢傳遞給一個簡單的Sqoop工作與鏈接JDBCHDFS

我在日誌中遇到了以下錯誤:

2016年2月12日10:15:50690 ERROR mr.SqoopOutputFormatLoadExecutor [org.apache.sqoop.job.mr.SqoopOutputFormatLoadExecutor $ ConsumerThread.run(SqoopOutputFormatLoadExecutor.java:257)]錯誤而裝載數據出MR工作。 org.apache.sqoop.common.SqoopException:GENERIC_HDFS_CONNECTOR_0005:裝載機運行 在org.apache.sqoop.connector.hdfs.HdfsLoader.load(HdfsLoader.java:110) 在org.apache.sqoop.connector期間發生錯誤。 hdfs.HdfsLoader.load(HdfsLoader.java:41) at org.apache.sqoop.job.mr.SqoopOutputFormatLoadExecutor $ ConsumerThread.run(SqoopOutputFormatLoadExecutor.java:250) at java.util.concurrent.Executors $ RunnableAdapter.call( Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent。 ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) 原因:org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException):/user/username/schema/recordset/.72dee005-3f75-4a95-bbc0- 30c6b565d193/f5aeeecc-097e-49ab-99cc-b5032ae18a84.txt(inode 16415):文件不存在。 [租。持有人:DFSClient_NONMAPREDUCE_-1820866823_31,pendingcreates:1]

當我嘗試查一下我的hdfs產生的.txt文件,它們是空的。

有沒有人遇到過並解決過這個問題?另外,我注意到Sqoop shell的額外bugginess。例如,我無法檢查作業狀態,因爲它始終返回UNKNOWN。

我使用sqoop-1.99.6-bin-hadoop200Hadoop 2.7.2 (Homebrew install)。我正在查詢Generic JDBC Connector的遠程Oracle 11數據庫。

我已經在create job

進行使用schema/table參數較小的進口工作,我很想通過表遷移整個架構表,那麼就使用蜂巢生成和存儲記錄集我想要的。這是更好還是更簡單的解決方案?

+1

對於大多數人來說,「Sqoop」意味着最初的,經過測試的實用工具,又名「Sqoop 1」(當前版本爲1.4.6) - 我不確定有多少人會相信他們的生產系統是「Sqoop 2「aka」有一天我們將填補功能缺陷並修復問題,實際上達到2.0標記,然後棄用V1,再給我們幾年時間。「 –

+0

@SamsonScharfrichter感謝您的建議。我改變了這個問題以反映它的Sqoop2。我應該回到1.4.6嗎?它會與我的Hadoop安裝一起工作嗎? –

+0

其實我不確定這會有什麼不同,這是1小時的延遲會導致你死亡。 –

回答

1

org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException

這個查詢大約需要1-2個小時,以返回SQL 開發一個結果集

我敢打賭, Sqoop 1.99創建一個空的HDFS文件(即NameNode獲取請求,創建文件但尚未實現其他客戶端,爲Sqoop授予獨佔寫入租約,併爲將塊#1寫入隨機DataNode負責)然後等待JDBC ResultSet生成一些數據......在此期間不做任何保存活動。

但很可惜,60分鐘後,NameNode會剛剛看到的租約而不Sqoop客戶活着的跡象已到期,因此關閉該文件 - 或者更確切地說,使得彷彿這是從來沒有創建(沒有沖洗曾經發生過)。

任何機會,你可以減少與甲骨文/*+ FIRST_ROWS */暗示的時間流逝?

+0

如果您開放以Oracle爲中心的解決方案,您可以嘗試賄賂Oracle DBA以設置可使用「EXEC」觸發的DataPump文件導出,以及從Oracle盒到HDFS的某種文件傳輸* (例如使用WebHDFS REST接口)*。整體而言,可以更高效和可靠。但它涉及開發和運營中的Oracle人員。 –

+0

警告 - AFAIK WebHDFS不做任何形式的完整性檢查,所以你最好只在壓縮文件中使用它(CRC32 =窮人的完整性檢查)。 –

+0

不幸的是,我幾乎無法控制Oracle服務器。但是,當控制整個堆棧時,這似乎是一個有效的解決方案。 –