本文为您介绍UploadSession接口,此接口用于上传数据到表中。
UploadSession接口定义
UploadSession接口定义如下。
public class UploadSession {
UploadSession(Configuration conf, String projectName, String tableName,
String partitionSpec) throws TunnelException;
UploadSession(Configuration conf, String projectName, String tableName,
String partitionSpec, String uploadId) throws TunnelException;
public void commit(Long[] blocks);
public Long[] getBlockList();
public String getId();
public TableSchema getSchema();
public UploadSession.Status getStatus();
public Record newRecord();
public RecordWriter openRecordWriter(long blockId);
public RecordWriter openRecordWriter(long blockId, boolean compress);
public RecordWriter openBufferedWriter();
public RecordWriter openBufferedWriter(boolean compress);
}
UploadSession接口说明
- 生命周期:从创建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失败可以进行重试。
- 六种状态说明:
- UNKNOWN:Server端刚创建一个Session时设置的初始值。
- NORMAL:创建Upload对象成功。
- CLOSING:当调用complete方法(结束上传)时,服务端会先把状态置为CLOSING。
- CLOSED:完成结束上传(即把数据移动到结果表所在目录)后。
- EXPIRED:上传超时。
- CRITICAL:服务出错。
说明
- 同一个Upload中Session的blockId不能重复。对于同一个UploadSession,用一个blockId打开RecordWriter,写入一批数据后,调用close、Commit完成后,不可以再用该blockId打开另一个RecordWriter写入数据。
- 一个Block大小上限100GB,建议大于64M的数据。
- 每个Session在服务端的生命周期为24小时。
- 上传数据时,Writer每写入8KB数据,便会触发一次网络动作,如果120秒内没有网络动作,服务端将主动关闭连接,此时Writer将不可用,请重新打开一个新的Writer写入。
- 建议使用openBufferedWriter接口上传数据,该接口对您屏蔽了blockId的细节,并且内部带有数据缓存区,会自动进行失败重试,详情请参见BufferedWriter上传示例。