全部产品
MaxCompute

TunnelBufferedWriter

更新时间:2017-06-07 13:26:11   分享:   

一次完整的上传流程通常包括以下步骤:

  1. 先对数据进行划分;

  2. 为每个数据块指定 block id,即调用 openRecordWriter(id);

  3. 然后用一个或多个线程分别将这些 block 上传上去, 并在某个 block 上传失败以后,需要对整个 block 进行重传;

  4. 在所有 block 都上传以后,向服务端提供上传成功的 blockid list 进行校验,即调用 session.commit([1,2,3,…])

而由于服务端对block管理,连接超时等的一些限制,上传过程逻辑变得比较复杂,为了简化上传过程,SDK提供了更高级的一种RecordWriter——TunnelBufferWriter。

接口定义:

  1. public class TunnelBufferedWriter implements RecordWriter {
  2. public TunnelBufferedWriter(TableTunnel.UploadSession session, CompressOption option) throws IOException;
  3. public long getTotalBytes();
  4. public void setBufferSize(long bufferSize);
  5. public void setRetryStrategy(RetryStrategy strategy);
  6. public void write(Record r) throws IOException;
  7. public void close() throws IOException;
  8. }

TunnelBufferedWriter对象:

  • 生命周期:从创建RecordWriter到数据上传结束;

  • 创建TunnelBufferedWriter实例:通过调用UploadSession的openBufferedWriter接口创建;

  • 数据上传:调用write接口,数据会先写入本地缓存区,缓存区满后会批量提交到服务端,避免了连接超时,同时,如果上传失败会自动进行重试;

  • 结束上传: 调用close接口,最后再调用UploadSession的commit接口,即可完成上传;

  • 缓冲区控制: 可以通过setBufferSize这个接口修改缓冲区占内存的字节数(bytes), 建议设置64M以上的大小,避免服务端产生过多小文件,影响性能,一般无须设置,维持默认值即可;

  • 重试策略设置:用户可以选择三种重试回避策略:指数回避(EXPONENTIAL_BACKOFF)、线性时间回避(LINEAR_BACKOFF)、常数时间回避(CONSTANT_BACKOFF)。例如下面这段代码可以将,write 的重试次数调整为 6,每一次重试之前先分别回避 4s、8s、16s、32s、64s 和 128s(从 4 开始的指数递增的序列),这个也是默认的行为,一般情况不建议调整。

  1. RetryStrategy retry
  2. = new RetryStrategy(6, 4, RetryStrategy.BackoffStrategy.EXPONENTIAL_BACKOFF)
  3. writer = (TunnelBufferedWriter) uploadSession.openBufferedWriter();
  4. writer.setRetryStrategy(retry);
本文导读目录
本文导读目录
以上内容是否对您有帮助?