MaxCompute用户指南:数据上传下载:批量数据通道SDK介绍:TunnelBufferedWriter
一次完整的上传流程通常包括以下步骤:
先对数据进行划分。
为每个数据块指定 block Id,即调用 openRecordWriter(id)。
用一个或多个线程分别将这些 block 上传上去,并在某个 block 上传失败以后,需要对整个 block 进行重传。
在所有 block 都上传以后,向服务端提供上传成功的 blockid list 进行校验,即调用 session.commit([1,2,3,…])。
由于服务端对 block 管理,连接超时等的一些限制,上传过程逻辑变得比较复杂,为了简化上传过程,SDK 提供了更高级的一种 RecordWriter——TunnelBufferWriter。
接口定义如下:
- 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),建议设置 64M 以上的大小,避免服务端产生过多小文件,影响性能,一般无须设置,维持默认值即可。
重试策略设置:您可以选择三种重试回避策略:指数回避(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);
收起
行者武松
2017-10-23 15:32:03
2159
0
0
条回答
写回答
取消
提交回答