本文介紹JindoSDK訪問OSS出現NoSuchUpload問題的原因和解決方案。
問題詳情
[RequestId]: 638xxxxxx [HostId]: oss-xxxx-internal.aliyuncs.com [ErrorMessage]: [E1010]HTTP/1.1 404 Not Found: <?xml version="1.0" encoding="UTF-8"?><Error> <Code>NoSuchUpload</Code> <Message>The specified upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed.</Message>
問題原因
當在EMR集群中遇到NoSuchUpload異常時,通常是因為多個并發作業在相同目錄上進行操作,或者在某個Executor上無法訪問由JindoSDK使用的臨時目錄所導致。
解決方案
SmartData 2.5.x以下和SmartData 3.6.x以下版本的JobCommitter存在問題,可能會導致部分作業出現此類報錯,可嘗試關閉JobCommitter。
檢查作業層面是否有并發操作了相同目錄的情況,并嘗試解決。
如需并發操作,可以升級JindoSDK到4.6.4或以上版本,并設置
fs.jdo.committer.allow.concurrent=true
和fs.jdo.committer.magic.abort.pending.uploads=false
。重要設置
fs.jdo.committer.magic.abort.pending.uploads=false
后,需要在OSS控制臺設置好碎片過期策略,否則會產生不必要的費用。如果使用的JindoSDK是4.6.4及以下版本,需檢查臨時目錄是否在集群所有節點上可寫。
如果運行Spark作業時遇到該問題,則以Spark客戶端的設置為準??缮塉indoSDK到4.6.5及以上版本,或確保JindoSDK的臨時目錄在集群所有節點上可寫,或選擇使用默認的FileOutputCommitter。
如果您之前使用的是Amazon EMR,且使用了Parquet格式,可以修改Spark配置。
在EMR控制臺,修改Spark服務中spark-defaults.conf頁簽下的參數spark.sql.parquet.output.committer.class,將該參數值修改為com.aliyun.jindodata.commit.JindoDirectCommitter。
說明使用Direct Committer可能會引入數據一致性和完整性的問題。