本文向您介紹TunnelBufferedWriter介面,此介面用於上傳資料。
一次完整的上傳流程通常包括以下步驟:
- 先對資料進行劃分。
- 為每個資料區塊指定block Id,即調用openRecordWriter(id)。
- 用一個或多個線程分別將這些block上傳上去,並在某個block上傳失敗以後,需要對整個block進行重傳。
- 在所有block都上傳以後,向服務端提供上傳成功的blockid list進行校正,即調用session.commit([1,2,3,…])。
由於服務端對block管理、連線逾時等一些限制,上傳過程邏輯變得比較複雜,為了簡化上傳過程,SDK提供了更進階的一種RecordWriter—TunnelBufferedWriter。
TunnelBufferedWriter介面定義
public class TunnelBufferedWriter implements RecordWriter {
public TunnelBufferedWriter(TableTunnel.UploadSession session, CompressOption option) throws IOException;
public long getTotalBytes();
public void setBufferSize(long bufferSize);
public void setRetryStrategy(RetryStrategy strategy);
public void write(Record r) throws IOException;
public void close() throws IOException;
}
TunnelBufferedWriter介面說明
- 生命週期:從建立RecordWriter到資料上傳結束。
- 建立TunnelBufferedWriter執行個體:通過調用UploadSession的openBufferedWriter介面建立。
- 資料上傳:調用Write介面,資料會先寫入本機快取區,緩衝區滿後會批量提交到服務端,這樣可以避免連線逾時。此外,如果資料上傳失敗,則會自動進行重試。
- 結束上傳:調用close介面,最後再調用UploadSession的commit介面,即可完成上傳。
- 緩衝區控制:可以通過setBufferSize介面修改緩衝區占記憶體的位元組數(bytes),建議設定大於等於64MB,避免服務端產生過多小檔案,影響效能。最小可設定為1MB,最大1000MB,通常無需設定,維持預設值64MB即可。
- 重試原則設定:您可以選擇三種重試迴避策略,指數迴避(EXPONENTIAL_BACKOFF)、線性時間迴避(LINEAR_BACKOFF)、常數時間迴避(CONSTANT_BACKOFF)。例如,下面這段代碼可以將Write的重試次數調整為6,每一次重試之前先分別迴避4s、8s、16s、32s、64s和128s(預設設定為從4開始的指數遞增的序列),通常不建議調整此迴避設定。
RetryStrategy retry = new RetryStrategy(6, 4, RetryStrategy.BackoffStrategy.EXPONENTIAL_BACKOFF) writer = (TunnelBufferedWriter) uploadSession.openBufferedWriter(); writer.setRetryStrategy(retry);