全部產品
Search
文件中心

MaxCompute:Tunnel SDK常見問題

更新時間:Aug 15, 2024

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