全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
MaxCompute

TunnelBufferedWriter

更新时间:2017-09-27 23:05:02

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

  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);
本文导读目录