开发者社区> 问答> 正文

MaxCompute用户指南:数据上传下载:批量数据通道SDK介绍:TunnelBufferedWriter



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


  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);

展开
收起
行者武松 2017-10-23 15:32:03 2159 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
从 SDK 到编解码:视频直播架构解析 立即下载
跨平台的云服务SDK需要什么 立即下载
一个跨平台的云服务SDK需要什么 立即下载