开发者社区 问答 正文

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



接口定义如下:

  1.     public class UploadSession {
  2.         UploadSession(Configuration conf, String projectName, String tableName,
  3.             String partitionSpec) throws TunnelException;
  4.         UploadSession(Configuration conf, String projectName, String tableName,
  5.             String partitionSpec, String uploadId) throws TunnelException;
  6.         public void commit(Long[] blocks);
  7.         public Long[] getBlockList();
  8.         public String getId();
  9.         public TableSchema getSchema();
  10.         public UploadSession.Status getStatus();
  11.         public Record newRecord();
  12.         public RecordWriter openRecordWriter(long blockId);
  13.         public RecordWriter openRecordWriter(long blockId, boolean compress);
  14.         public RecordWriter openBufferedWriter();
  15.         public RecordWriter openBufferedWriter(boolean compress);
  16.     }

Upload 对象:

  • 生命周期:从创建 Upload 实例到结束上传。

  • 创建 Upload 实例:您可以通过 调用构造方法TableTunnel 两种方式进行创建。
    请求方式:同步。

  • Server 端会为该 Upload 创建一个 session, 生成唯一 UploadId 标识该 Upload,客户端可以通过 getId 获取。

上传数据:

  • 请求方式:同步。

  • 调用 openRecordWriter 方法,生成 RecordWriter 实例,其中参数 blockId 用于标识此次上传的数据,也描述了数据在整个表中的位置,取值范围为:[0,20000],当数据上传失败,可以根据 blockId 重新上传。

查看上传:

  • 请求方式:同步。

  • 调用 getStatus 可以获取当前 Upload 状态。

  • 调用 getBlockList 可以获取成功上传的 blockid list,可以和上传的 blockid list 对比,对失败的 blockId 重新上传。

结束上传:

  • 请求方式:同步。

  • 调用 commit(Long[] blocks)方法,参数 blocks 列表表示已经成功上传的 block 列表,Server 端会对该列表进行验证。

  • 该功能是加强对数据正确性的校验,如果提供的 block 列表与 Server 端存在的 block 列表不一致抛出异常。

  • Commit 失败可以进行重试。

7 种状态说明如下:

  • UNKNOWN:Server 端刚创建一个 Session 时设置的初始值。

  • NORMAL:创建 Upload 对象成功。

  • CLOSING:当调用 complete 方法(结束上传)时,服务端会先把状态置为 CLOSING。

  • CLOSED:完成结束上传(即把数据移动到结果表所在目录)后。

  • EXPIRED:上传超时。

  • CRITICAL:服务出错。  

注意:  

  • 同一个 UploadSession 里的 blockId 不能重复。也就是说,对于同一个 UploadSession,用一个blockId 打开 RecordWriter,写入一批数据后,调用 close,然后再 commit 完成后,不可以重新再用该 blockId打开另一个 RecordWriter 写入数据。

  • 一个 block 大小上限 100GB,建议 大于 64M 的数据。

  • 每个 Session 在服务端的生命周期为 24 小时。

  • 上传数据时,Writer 每写入 8KB 数据,便会触发一次网络动作,如果 120 秒内没有网络动作,服务端将主动关闭连接,届时 Writer 将不可用,请重新打开一个新的 Writer 写入。

  • 建议使用 openBufferedWriter 接口上传数据,该接口对您屏蔽了 blockId 的细节,并且内部带有数据缓存区,会自动进行失败重试,详情请参见 TunnelBufferedWriter 的介绍和示例。

展开
收起
行者武松 2017-10-23 15:31:00 2163 分享 版权
0 条回答
写回答
取消 提交回答