TableTunnel是訪問MaxCompute Tunnel服務的入口類,僅支持表數據(非視圖)的上傳和下載。

TableTunnel接口定義及說明

TableTunnel接口定義如下,詳情請參見Java-sdk-doc
public class TableTunnel {
 public DownloadSession createDownloadSession(String projectName, String tableName);
 public DownloadSession createDownloadSession(String projectName, String tableName, PartitionSpec partitionSpec);
 public UploadSession createUploadSession(String projectName, String tableName,boolean overwrite);
 public UploadSession createUploadSession(String projectName, String tableName, PartitionSpec partitionSpec,boolean overwrite);
 public DownloadSession getDownloadSession(String projectName, String tableName, PartitionSpec partitionSpec, String id);
 public DownloadSession getDownloadSession(String projectName, String tableName, String id);
 public UploadSession getUploadSession(String projectName, String tableName, PartitionSpec partitionSpec, String id);
 public UploadSession getUploadSession(String projectName, String tableName, String id);
}
接口說明如下:
  • 生命周期:從TableTunnel實例被創建開始,一直到程序結束。
  • TableTunnel提供創建UploadSession對象和DownloadSession對象的方法。數據的上傳和下載分別由TableTunnel.UploadSessionTableTunnel.DownloadSession這兩個Session實現。
  • 對一張表或分區上傳下載的過程,稱為一個Session。Session由一或多個訪問Tunnel RESTful API的HTTP Request組成。
  • 在UploadSession中,每個RecordWriter對應一個HTTP Request,由一個Block ID標識,對應服務端一個文件(Block ID即對應的文件名)。
  • 同一Session中,使用同一Block ID多次打開RecordWriter的行為會導致數據覆蓋,最后一個調用close()的RecordWriter上傳的數據會被保留。該特性可用于Block的上傳失敗重傳。
  • TableTunnel的UploadSession中:
    • 如果沒有指定boolean overwrite參數,則默認是INSERT INTO語義。
    • 如果指定了boolean overwrite參數,且傳入的參數值為True,則默認是INSERT OVERWRITE語義。
    • 如果指定了boolean overwrite參數,且傳入的參數值為False,則默認是INSERT INTO語義。
    兩種語義的說明如下:
    • INSERT INTO,即對同一張表或分區的多個、多次上傳Session互不影響,每個Session上傳的數據會位于不同的目錄中。
    • INSERT OVERWRITE,即當次上傳會覆蓋對應表或分區里的所有數據。如果使用該模式請不要對同一表或分區執行并發操作。

TableTunnel接口實現流程

  1. RecordWriter.write()將數據上傳到臨時目錄的文件。
  2. RecordWriter.close()將相應的文件從臨時目錄移到數據目錄。
  3. session.commit()將相應數據目錄下的所有文件移到相應表所在目錄,并更新表Meta,即數據進表。使數據對其它MaxCompute任務(例如SQL、MapReduce)可見。

TableTunnel接口限制

  • Block ID的取值范圍是[0, 20000),單個Block上傳的數據限制為100GB。
  • Session用Session ID來標識。Session的超時時間為24小時。如果大批量數據傳送導致超過24小時,需要自行拆分成多個Session。
  • RecordWriter對應的HTTP Request超時時間為120s。如果120s內HTTP連接上沒有數據流過,服務端會主動關閉連接。
    說明 HTTP本身還有8KB的緩存,因此并不是每次調用RecordWriter.write()都能保證HTTP連接上有數據流過。TunnelRecordWriter.flush()可以將Buffer內數據強制刷出。
  • 對于日志類寫入MaxCompute的場景,無法預測數據的到達時間會造成RecordWriter超時。因此:
    • 不建議對每條數據打開一個RecordWriter。因為每個RecordWriter對應一個文件,此操作會造成小文件過多,嚴重影響MaxCompute后續使用性能。
    • 建議用戶代碼Cache至少64MB的數據后,再使用一個RecordWriter進行一次性批量寫入。
  • RecordReader的超時時間為300s。
  • 如果用戶訪問的Endpoint是公網對應的地址,具體公網Endpoint地址請參見Endpoint,會產生下載費用,具體費用請參見下載費用
  • 用戶使用公網Endpoint下載數據,如果已經開啟下載權限檢查,需要有Download數據對應的權限。具體授權明細請參見Download權限控制