本文為您介紹使用Tunnel SDK過程中的常見問題。
問題類別 | 常見問題 |
Tunnel SDK Upload | |
Tunnel SDK Download | 使用Tunnel SDK下載數據時,報錯You need to specify a partitionspec along with the specified table,如何解決? |
其他問題 |
使用Tunnel SDK上傳數據時,上傳的數據可以自動分配到各個分區嗎?
Tunnel SDK上傳數據時,是無法自動分配到各個分區的。每一次上傳只支持將數據上傳到一張表或表的一個分區,有分區的表一定要指定上傳的分區,多級分區一定要指定到末級分區。
使用Tunnel SDK上傳數據時,編寫完UDF打成JAR包后上傳,對JAR包大小有要求嗎?
JAR包不能超過10 MB,如果JAR包超過10 MB,建議轉用MaxCompute Tunnel Upload命令上傳數據。
使用Tunnel SDK上傳數據時,是否有分區數量限制?
最大支持6萬個分區。分區數量過多,不方便進行統計和分析。MaxCompute會限制單個作業中Instance的數量。作業的Instance和用戶輸入的數據量及分區數量是密切相關的,因此建議先評估下業務,選擇合適的分區策略,避免分區過多帶來的影響。
使用Tunnel SDK上傳數據時,報錯StatusConflict,如何解決?
問題現象
使用Tunnel SDK上傳數據時,返回如下報錯。
RequestId=20170116xxxxxxx, ErrorCode=StatusConflict, ErrorMessage=You cannot complete the specified operation under the current upload or download status. java.io.IOException: RequestId=20170116xxxxxxx, ErrorCode=StatusConflict, ErrorMessage=You cannot complete the specified operation under the current upload or download status.at com.aliyun.odps.tunnel.io.TunnelRecordWriter.close(TunnelRecordWriter.java:93)
問題原因:該問題是在Close RecordWriter時出現的,可能原因如下。
對一個已經關閉的RecordWriter執行了關閉操作。
RecordWriter對應的Session已經關閉。
Session已經提交過。
解決措施:您可以針對上述可能出現的原因進行排查,比如打印一些日志、在提交Session前打印一些當前RecordWriter的狀態與Session的狀態。確保無上述問題后,重新嘗試上傳數據。
使用Tunnel SDK上傳數據時,報錯Blocks Not Match,如何解決?
問題現象:
使用Tunnel SDK上傳數據時,返回如下報錯。
ErrorCode=Local Error, ErrorMessage=Blocks not match, server: 0, tunnelServiceClient: 1 at com.aliyun.odps.tunnel.TableTunnel$UploadSession.commit(TableTunnel.java:814)
產生原因
服務器收到的Block個數和Commit時參數的個數不一致。
解決措施
在代碼中查看
uploadSession.openRecordWriter(i)
打開的Writer個數和Commit時的Block數組,確保相對應。代碼中寫入執行完成后,確認是否調用
recordWriter.close();
。如果直接執行Commit,可能導致服務器端的Block個數不符合預期。
一次性上傳8000萬條數據,在執行odps tunnel recordWriter.close()時報錯StatusConflict,如何解決?
問題現象
一次性上傳8000萬條數據,在執行odps tunnel recordWriter.close()時,返回如下報錯。
ErrorCode=StatusConflict, ErrorMessage=You cannot complete the specified operation under the current upload or download status.
產生原因
Session狀態錯誤,前面的操作里已經關閉或者提交了該Session。
解決措施
建議重新創建一個Session再上傳一次數據。對于不同的分區,每個分區需要單獨的一個Session。對于多次提交導致報錯,請先檢查數據是否已經上傳成功,如果失敗,請重新上傳一次,請參見多線程上傳示例。
如何使用TunnelBufferedWriter規避使用Tunnel SDK進行批量數據上傳出錯的問題?
MaxCompute Java SDK在0.21.3-public版本之后新增了BufferedWriter的SDK,簡化了數據上傳,并且提供了容錯功能。BufferedWriter從用戶角度看,就是在Session上打開一個Writer然后進行寫記錄即可。具體實現是,BufferedWriter先將記錄緩存在客戶端的緩沖區中,并在緩沖區填滿之后打開一個HTTP連接進行上傳。
BufferedWriter會盡最大可能容錯,保證數據上傳成功,使用方法請參見TunnelBufferedWriter。
使用Tunnel SDK下載數據時,報錯You need to specify a partitionspec along with the specified table,如何解決?
問題現象
使用Tunnel SDK下載分區表數據,返回如下報錯。
ErrorCode=MissingPartitionSpec, ErrorMessage=You need to specify a partitionspec along with the specified table.
產生原因
使用Tunnel SDK下載分區表數據時,需要指定分區列的列值,否則會報錯。
解決措施
如果您使用MaxCompute客戶端工具里的Tunnel命令行進行導出,客戶端支持分區表整個導出,其結果會導出到一個文件夾里。
如果您使用Tunnel SDK進行導出,可以先使用SDK獲取分區表的所有分區,命令示例如下。
odps.tables().get(tablename) t.getPartitions()
MaxCompute Tunnel目前支持哪些語言的SDK?
MaxCompute Tunnel目前支持Java版的SDK。
BlockId是否可以重復?
同一個UploadSession中的BlockId不能重復。對于同一個UploadSession,用一個BlockId打開RecordWriter,寫入一批數據后,調用Close,寫入成功后不可以再用該BlockId打開另一個RecordWriter寫入數據。Block默認最多20000個,即取值范圍為0~19999。
Block大小是否存在限制?
每次上傳至Tunnel的數據塊大小默認為100 MiB。一個Block大小上限為100 GB,強烈建議為大于64 MB的數據,每一個Block對應一個文件,小于64 MB的文件統稱為小文件,小文件過多將會影響使用性能。如果數量較大且是持續上傳模式,Block的數據量在64 MB~256 MB之間; 如果是每天傳一次的批量模式,Block可以設置為1 GB左右。
使用新版BufferedWriter可以更簡單地進行上傳且可以避免小文件等問題,詳情請參見TunnelBufferedWriter。
遇到讀寫超時或IOException時,如何解決?
上傳數據時,Writer每寫入8 KB數據會觸發一次網絡動作,如果120秒內沒有網絡動作,服務端將主動關閉連接,屆時Writer將不可用,請重新打開一個新的Writer寫入。
建議您使用TunnelBufferedWriter。
下載數據時,Reader也有類似機制,若長時間沒有網絡動作會斷開連接,建議Reader過程連續進行,中間不穿插其他系統的接口。