本文介紹使用資料移轉工具ossimport的常見問題及解決方案。
通用說明
本文提到的所有涉及ossimport的命令均為簡寫,實際操作時,需補全命令。
Windows系統需加上console.bat進行補全,例如submit實際為console.bat submit。
Linux系統需要加上bash console.sh進行補全,例如submit實際為sudo bash console.sh submit。
如何驗證ossimport工具資料移轉是否遷移完成?
執行全量遷移任務後,您可以執行以下命令查看任務狀態。
Windows下在cmd.exe中執行console.bat stat。
Linux下在終端執行sudo bash console.sh stat。
當任務狀態為Succeed時,表示遷移成功。
如果您在Job中配置了增量模式(即isIncremental為true),ossimport會根據您配置的間隔時間定期掃描源端目錄,檢查有無新增或修改的檔案,並將增量資料同步到OSS。您可以在對應的OSS Bucket中查看增量後的檔案。
ossimport不對遷移檔案進行校正,無法保證遷移結果的正確性和一致性。在遷移任務完成後,請您務必自行做好源端和目的端資料的一致性校正。
如您在未校正源端和目的端資料一致性前,刪除來源資料,由此所引起的一切損失和後果均由您自行承擔。
遷移失敗常見問題
如果遷移檔案失敗,建議您先查看遷移失敗日誌,確認失敗的原因。您可以在解決這些問題後使用retry命令進行重試。遷移失敗日誌的路徑為master/jobs/${JobName}/failed_tasks/${TaskName}/audit.log。
使用stat命令查看任務狀態顯示失敗
執行命令如下:
sudo bash console.sh stat
返回結果中如果JobState為failed,則遷移任務失敗。
解決方案:遷移完成後使用retry命令進行重試。
部分檔案遷移失敗後反覆重試都無法成功遷移
解決方案:
查看遷移失敗檔案清單master/jobs/${JobName}/failed_tasks/${TaskName}/error.list,擷取失敗檔案的相對路徑。
確認是否有這部分檔案的許可權訪問、檔案是否被刪除、是否是軟連結檔案、檔案名稱是否存在亂碼等。
解決以上問題後,使用retry命令進行重試。
遷移失敗日誌報錯The bucket you are attempting to access must be addressed using the specified endpoint.
Exception:com.aliyun.oss.OSSException: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
<Error>
<Code>AccessDenied</Code>
<Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message>
<RequestId>56EA98DE815804**21B23EE6</RequestId>
<HostId>my-oss-bucket.oss-cn-qingdao.aliyuncs.com</HostId>
<Bucket>my-oss-bucket</Bucket>
<Endpoint>oss-cn-hangzhou.aliyuncs.com</Endpoint>
</Error>
問題原因:srcDomain或destDomain填寫錯誤。
解決方案:請參見OSS訪問網域名稱、資料中心、開放連接埠填寫正確的Endpoint。
遷移失敗日誌報錯The request signature we calculated does not match the signature you provided.
Exception:com.aliyun.oss.OSSException: The request signature we calculated does not match the signature you provided. Check your key and signing method.
[ErrorCode]: SignatureDoesNotMatch
[RequestId]: xxxxxxx
[HostId]: xxx.oss-cn-shanghai.aliyuncs.com
問題原因:destAccessKey和destSecretKey填寫錯誤。
解決方案:請填寫正確的AccessKey資訊。
遷移失敗日誌報錯The bucket name “xxx/xx” is invalid.
java.lang.IllegalArgumentException: The bucket name "xxx/xx" is invalid. A bucket name must: 1) be comprised of lower-case characters, numbers or dash(-); 2) start with lower case or numbers; 3) be between 3-63 characters long.
問題原因:destBucket填寫錯誤。
解決方案:填寫正確的Bucket名稱。關於Bucket名稱的命名規範,請參見儲存空間命名。
遷移失敗日誌報錯Connect to xxx.oss-cn-beijing-internal.aliyuncs.com:80 timed out.
Unable to execute HTTP request: Connect to xxx.oss-cn-beijing-internal.aliyuncs.com:80 timed out
[ErrorCode]: ConnectionTimeout
[RequestId]: Unknown
問題原因:這個是連線逾時的報錯,通常原因是遷移用的裝置非ECS執行個體或不是與OSS同地區的ECS執行個體,但是設定檔使用了OSS的內網網域名稱。OSS內網網域名稱僅支援同地區ECS執行個體訪問。
解決方案:
修改設定檔中網域名稱為外網Endpoint,清除任務後重新提交任務。
使用與OSS同地區的ECS執行個體運行遷移任務。
遷移失敗日誌報錯The specified bucket is not valid.
com.aliyun.oss.OSSException: The specified bucket is not valid.
[ErrorCode]: InvalidBucketName
[RequestId]: 57906B4DD0EBAB0FF553D661
[HostId]: you-bucket.you-bucketoss-cn-hangzhou-internal.aliyuncs.com
問題原因:destDomian配置錯誤。
解決方案:destDomian配置的網域名稱是Bucket所在地區的Endpoint地址,而不是帶Bucket名稱的次層網域。例如Bucket所在地區為華北2(北京),應填寫oss-cn-beijing.aliyuncs.com。詳情請參見設定檔樣本。
遷移失敗日誌報錯Unable to execute HTTP request: The Difference between … is too large.
Unable to execute HTTP request: The Difference between the request time and the current time is too large.
[ErrorCode]: RequestTimeTooSkewed
[RequestId]: xxxxxxx
問題原因
本地機器時間不對,與OSS伺服器時間相差15分鐘以上,該情況居多。
可能是並發太高,尤其是CPU佔用率很高,導致並發上傳慢。
解決方案
修改本地機器時間,與OSS伺服器一致。
如果是並發問題,可以通過降低sys.properties檔案的workerTaskThreadNum參數調整並發。
遷移失敗日誌報錯No route to host.
問題原因:可能本地防火牆或者iptables等原因導致網路不通。
解決方案:通過ping命令測試遷移伺服器到源端和目的端網路是否正常。
如果網路正常,檢查電腦防火牆和本地的防火牆裝置是否有限制,可嘗試關閉防火牆進行測試。
如果網路異常,排查網路原因進行相關處理後重試。
使用HTTP模式遷移,遷移失敗日誌報錯Unknown http list file format.
問題原因:指定的HTTP列表檔案格式錯誤或內容不符合規範。
解決方案:
如果是從其他動作系統上拷貝的檔案,Linux系統可以用mac2unix、dos2unix等相關命令轉換檔格式;Windows系統可以使用notepad等工具轉換格式。
如果是列表檔案內容的格式不正確,請修改為正確的格式。關於列表檔案內容的格式,請參見說明及配置。
遷移失敗日誌報錯The object key “/xxxxx.jpg” is invalid.
Exception:java.lang.IllegalArgumentException: The object key "/xxxxx.jpg" is invalid. An object name should be between 1 - 1023 bytes long when encoded as UTF-8 and cannot contain LF or CR os unsupported chars in XML1.0, and cannot begin with "/" or "\".
問題原因:srcPrefix或者destPrefix填寫錯誤。
解決方案
檢查srcPrefix是否為目錄。如果是目錄,請以正斜線(/)結尾。
檢查destPrefix是否以正斜線(/)或者反斜線(\)開頭。如果是,請刪除正斜線(/)或反斜線(\)。
任務運行常見問題
如果在遷移運行過程中出現問題,您可以先查看任務作業記錄。
單機部署:作業記錄的檔案路徑為logs/ossimport2.log。
分布式部署:作業記錄的檔案路徑為logs/import.log。
執行任何命令均報錯UnsupportedClassVersionError.
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/aliyun/ossimport2/OSSImport2 : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at com.simontuffs.onejar.JarClassLoader.defineClass(JarClassLoader.java:693)
at com.simontuffs.onejar.JarClassLoader.findClass(JarClassLoader.java:599)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at com.simontuffs.onejar.Boot.run(Boot.java:300)
at com.simontuffs.onejar.Boot.main(Boot.java:159)
問題原因:Java版本過低。
解決方案:將Java版本升級為1.7或1.8版本。
使用submit命令提交任務報錯InvocationTargetException.
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.simontuffs.onejar.Boot.run(Boot.java:306)
at com.simontuffs.onejar.Boot.main(Boot.java:159)
Caused by: java.lang.NullPointerException
at com.aliyun.ossimport2.config.JobConfig.load(JobConfig.java:44)
at com.aliyun.ossimport2.OSSImport2.doSubmitJob(OSSImport2.java:289)
at com.aliyun.ossimport2.OSSImport2.main(OSSImport2.java:120)
... 6 more
問題原因:系統檢查設定檔時發現設定檔不完整,例如某些配置項被刪除或已注釋。
解決方案:還原設定檔中被刪除或注釋的配置項。對於不需要配置的內容請在等號後留空刪除配置項。配置樣本請參見設定檔樣本。
任務作業記錄報錯com.aliyun.oss.ClientException: Unknown.
com.aliyun.oss.ClientException: Unknown
[ErrorCode]: NonRepeatableRequest
[RequestId]: Cannot retry request with a non-repeatable request entity. The cause lists the reason the original request failed.
問題原因:com.aliyun.oss.ClientException: Unknown.以及SocketTimeoutException錯誤通常是網路被佔滿。
解決方案:ossimport會自動進行重試,如果重試完後仍然失敗,您可以在任務完成後調用retry命令再次重試。
Linux系統作業記錄報錯too many open files.
解決方案:使用ulimit -n查看系統控制代碼。
如果值在10,000以下,先通過ulimit -n 65536增大該值,然後重啟進程。
如果值在10,000以上,先通過sudo lsof -n排查是哪些進程開啟了控制代碼。然後評估這些進程是否需要保留。如果不需要請釋放相應的控制代碼。
Windows系統啟動任務後秒退
問題原因
沒安裝Java或Java版本低於1.7。
設定檔錯誤。
解決方案
安裝1.8版本的Java。
按照樣本正確編輯設定檔。配置樣本,請參見設定檔樣本。
使用submit命令提交任務後,通過stat命令查看任務狀態一直顯示no jobs is running or finished.
sudo bash console.sh stat
[WARN] List files dir not exist : /home/<user>/ossimport/workdir/master/jobs/
no jobs is running or finished.
問題原因:任務開始運行時,未啟動服務。任務已提交且服務已啟動後,才能通過stat命令才能查看到任務的運行狀態。
解決方案
使用start命令啟動服務。
如果服務已啟動,且任務剛提交,Master需要先去掃描檔案清單,這時Task還沒有真正產生和分發,因此出現該報錯是正常現象。
如果服務已啟動,且任務已提交一段時間後仍然出現該錯誤,需查看該進程啟動後是否異常退出。如果是單機部署,請通過logs/ossimport2.log查看記錄檔。如果是分布式部署,請通過logs/ossimport.log查看記錄檔。找到異常原因並解決,然後再啟動服務進程。
使用stat命令查看任務狀態一直顯示scanFinished:false.
解決方案:觀察Task的總數是否增加。
如果Task總數增加,則表明Job的檔案清單還在List新的檔案,是正常現象。
如果Task總數沒變化,且Job配置的是增量模式,scanFinished不為true的情況下,ossimport會根據您配置的間隔時間定期掃描源端目錄,檢查有無新增或修改的檔案。
如果不是增量模式,Task數不會增多,此時應檢查作業記錄是否異常。如果是單機部署,請通過logs/ossimport2.log查看記錄檔。如果是分布式部署,請通過logs/ossimport.log查看記錄檔。找到異常原因並解決,然後再啟動服務進程。
Linux系統服務進程異常,日誌卻沒有輸出異常
問題原因:如果機器的可用記憶體少於2 GB,服務進程可能因為記憶體不足出現異常。
解決方案:請檢查dmesg日誌是否存在因記憶體不足導致進程異常的記錄。
進程異常後,重啟服務時需要執行哪些操作
解決方案:如果沒有使用clean命令清除同名任務,所有提交過的Job都會有斷點記錄。您可以直接調用start命令啟動服務即可,已經提交的Job不需要重新提交。
如何將Linux系統中檔案名稱亂碼的檔案上傳到OSS
解決方案:
確認亂碼檔案的編碼格式。
使用export LANG="<your file name encode>"命令解析編碼。
使用clean命令清除原來的Job,然後使用submit命令重新提交Job。
啟動服務時報錯java.nio.file.AccessDeniedException.
問題原因:沒有許可權訪問設定檔。
解決方案
將設定檔的使用權限設定為所有人可讀。
將作業系統帳號切換為管理員後啟動服務。
Task個數顯示為0,但JobState顯示成功
[2015-12-28 16:12:35] [INFO] JobName:dir_data
[2015-12-28 16:12:35] [INFO] Pending Task Count:0
[2015-12-28 16:12:35] [INFO] Dispatched Task Count:0
[2015-12-28 16:12:35] [INFO] Succeed Task Count:0
[2015-12-28 16:12:35] [INFO] Failed Task Count:0
[2015-12-28 16:12:35] [INFO] Is Scan Finished:true
[2015-12-28 16:12:35] [INFO] JobState:SUCCEED
問題原因
srcPrefix填寫錯誤,導致列舉不出來檔案。
srcPrefix下只有目錄,沒有檔案,因為目錄概念是OSS類比出來的,不會被真正上傳。
解決方案:填寫正確的srcPrefix參數,並確保srcPrefix中有可用檔案。
提交任務時報錯InvocationTargetException.
sudo submit job:/disk2/ossimport2/local_job.cfg
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.simontuffs.onejar.Boot.run(Boot.java:306)
at com.simontuffs.onejar.Boot.main(Boot.java:159)
Caused by: java.lang.NullPointerException
at com.aliyun.ossimport2.OSSImport2.doSubmitJob(OSSImport2.java:289)
at com.aliyun.ossimport2.OSSImport2.main(OSSImport2.java:120)
... 6 more
問題原因:設定檔錯誤或設定檔路徑錯誤。
解決方案
正確配置conf/sys.properties中的配置項workingDir。
檢查設定檔路徑是否正確。
同步過程中顯示源端的檔案不存在
問題原因:Master執行遷移任務時,會先List檔案清單,然後按照檔案清單遷移資料。如果List操作完成後,源端某些檔案被刪除,則出現源端檔案不存在的情況。此時,Master會跳過已刪除的源端檔案,並在錯誤清單裡輸出此類檔案。
Job設定檔正確,但遷移任務時,運行狀態和Job設定檔不符。
問題原因:如果之前提交過遷移任務,任務被中止後,對Job設定檔的修改不生效。
解決方案:使用clean命令清除之前的任務,待Job設定檔修改完成後重新提交任務。
檔案正常傳輸,但報錯NullPointerException.
問題原因:ossimport2.3.5版本新增檔案統計功能,該功能需要載入cpt檔案,而HTTP任務的cpt載入格式與其他源不同,導致程式不匹配出現異常。
解決方案
將ossimport回退至2.3.4版本。
忽略該報錯。該問題只是列印報錯,不影響遷移任務。
又拍雲遷移常見問題
又拍雲遷移的任務數一直顯示0
解決方案:查看任務作業記錄。
[2016-07-21 10:21:46] [INFO] [name=YoupaiList, totalRequest=1729925, avgLatency=38,
recentLatency=300000]
如果日誌中
recentLatency
小於或等於30,000,表示正常List檔案。又拍雲List過程較慢,通常會超出30秒的逾時時間。返迴文件的個數取決於30秒內List的檔案個數,請等待List操作完成。如果
recentLatency
數值較低,通常是帳號密碼填寫錯誤。又拍雲的SDK出錯只返回null,不返回錯誤結果。這種情況下,需要通過抓包的方式擷取又拍雲返回的錯誤碼進行排查。
又拍雲遷移時如何填寫srcAccessKey
和srcSecretKey
解決方案:填寫又拍雲操作員的帳號和密碼 。
又拍雲遷移時一直顯示HTTP 429錯誤
問題原因:又拍雲對SDK訪問間隔進行了限速處理。
解決方案:請聯絡又拍雲解除限速限制。
任務完成OSS控制台顯示的資料量比來源資料量小
問題現象:Job全部成功上傳完後,OSS控制台裡顯示Bucket大小無變化,但是Linux系統下使用du命令統計的大小與資料量實際大小相差較大。
問題原因
OSS控制台的Bucket資料量會延遲1~2小時更新,請在1~2小時後查看Bucket大小是否有變化。
Linux系統的du命令統計的是資料區塊大小,資料區塊大小大於資料量實際大小。建議使用 ls -lR <目錄絕對路徑> | grep "\-rw" | awk '{sum+=$5}END{print sum}'命令統計本地目錄的實際大小。
Linux系統執行時命令時出現unknown command “java”、 unknown command “nohup“等提示
問題原因:沒有安裝對應命令。
解決方案:請使用yum、apt-get或zypper命令安裝相應的命令。
設定檔中的srcPrefix
是否支援指定為檔案格式
不支援。srcPrefix
只支援目錄或者首碼層級。
ossimport是否支援設定代理
不支援。
OSS之間的遷移為什麼還會產生費用
如果配置了內網網域名稱,將不收取流量費用,但仍然收取訪問次數的費用。
開啟增量模式後,OSS是否會同步刪除本地已刪除的檔案
不刪除。本地刪除操作不會同步到OSS。
開啟增量模式後,本地新增的檔案沒有被同步到OSS
增量模式通過對比檔案最後修改時間來判斷檔案是否為增量。Linux的mv、Windows的cp、mv以及rsync帶-t
或者-a
參數等操作不會修改檔案的最後修改時間,因此通過此類操作修改的檔案不會被掃描,也不會同步遷移至OSS。
遷移檔案到OSS時是否支援同步遷移檔案許可權
不支援。您可以在遷移完成後使用命令列工具ossutil的set-meta命令修改檔案許可權。具體操作,請參見set-meta(管理檔案中繼資料)。