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

TableTunnel

更新时间:2018-01-25 15:55:06

TableTunnel是访问 MaxCompute Tunnel 服务的入口类,TableTunnel.UploadSession接口表示一个向 MaxCompute 表中上传数据的会话,TableTunnel.DownloadSession表示一个向 MaxCompute 表中下载数据的会话。

接口定义如下:

  1. public class TableTunnel {
  2. public DownloadSession createDownloadSession(String projectName, String tableName);
  3. public DownloadSession createDownloadSession(String projectName, String tableName, PartitionSpec partitionSpec);
  4. public UploadSession createUploadSession(String projectName, String tableName);
  5. public UploadSession createUploadSession(String projectName, String tableName, PartitionSpec partitionSpec);
  6. public DownloadSession getDownloadSession(String projectName, String tableName, PartitionSpec partitionSpec, String id);
  7. public DownloadSession getDownloadSession(String projectName, String tableName, String id);
  8. public UploadSession getUploadSession(String projectName, String tableName, PartitionSpec partitionSpec, String id);
  9. public UploadSession getUploadSession(String projectName, String tableName, String id);
  10. }

说明

  • 生命周期:从 TableTunnel 实例被创建开始,一直到程序结束。

  • 提供创建 Upload 对象和 Download 对象的方法。

  • 对一张表或 partition 上传下载的过程,称为一个session。session 由一或多个到 Tunnel RESTful API 的 HTTP Request 组成。

  • TableTunnel 的上传 session 是 INSERT INTO 语义,即对同一张表或 partition 的多个/多次上传 session 互不影响,每个 session 上传的数据会位于不同的目录中。

  • 在上传 session 中,每个 RecordWriter 对应一个 HTTP Request,由一个 block id 标识,对应 service 端一个文件(实际上 block id 就是对应的文件名)。

  • 同一 session 中,使用同一 block id 多次打开 RecordWriter 会导致覆盖行为,最后一个调用 close() 的 RecordWriter 所上传的数据会被保留。该特性可用于 block 的上传失败重传。

TableTunnel接口实现流程:

  1. RecordWriter.write() 将数据上传到临时目录的文件。
  2. RecordWriter.close() 将相应的文件从临时目录挪移到 data 目录。
  3. session.commit() 将相应 data 目录下的所有文件挪移到相应表所在目录,并更新表 meta,即数据进表,对其他 MaxCompute 任务(如 SQL、MR)可见。

TableTunnel接口限制:

  • block id 的取值范围是 [0, 20000),单个 block 上传的数据限制为 100G。
  • session 的超时时间为 24 小时。如果,大批量数据传送导致超过 24 小时,需要自行拆分成多个 session。

  • RecordWriter 对应的 HTTP Request 超时为 120s。倘若 120s 内 HTTP 连接上没有数据流过,service 端会主动关闭连接。需要注意的是,HTTP 本身还有 8k buffer,因此并不是每次调用 RecordWriter.write() 都能保证 HTTP 连接上有数据流过。TunnelRecordWriter.flush() 可以将 buffer 内数据强制刷出。

  • 对于日志类写入 MaxCompute 的场景,因为数据到达不可预测,容易造成 RecordWriter 超时。此时:

    • 不建议 对每条数据打开一个 RecordWriter(因为每个 RecordWriter 对应一个文件,会造成小文件过多,严重影响 MaxCompute 后续使用性能)
    • 建议 用户代码 cache 至少 64M 的数据再使用一个 RecordWriter 一次性批量写入。
  • RecordReader 的超时为 300s。

本文导读目录