本文為您介紹使用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過程連續進行,中間不穿插其他系統的介面。