public interface OTSWriter
addRowChange(com.aliyun.openservices.ots.model.RowChange)
接口向OTSWriter写入一行返回后,并不代表该行已经写入OTS,该行会保存在OTSWriter的本地缓冲中,等待flush,flush成功后该行才会被写入OTS。
- 向OTSWriter写入的行的顺序与最终写入OTS的行的顺序不保证一致。
- 所有通过OTSWriter的写入操作,需要使用者保证是幂等的,因为OTSWriter内部默认会启用重试,某一行可能会多次写入。
- OTSWriter对缓冲区的flush时机由两个因素来控制:一个是WriterConfig.maxBatchSize
,根据缓冲区的数据量来决定是否需要flush。
- OTSWriter在写入数据时,会自动对导入失败的行进行重试,但是并不保证所有行重试后最终一定能够被写入成功(例如:某一行在OTS中已经超过了256KB限制,则无法再向该行写入新的列)。
此时经过若干次重试后若还有数据无法被写入成功,则这些行会被认为是脏数据,脏数据会通过flush()
或close()
,将还存在缓冲区中的数据进行flush,否则会造成这部分数据丢失。
OTSWriter对批量导入数据的处理流程:
1. addRowChange接口是线程安全的,支持用户线程并发的写入
2. 通过addRowChange接口写入的数据会暂存到缓冲区
3. 每个OTSWriter会启动一个后台导入线程,缓冲区的数据会由该后台线程进行flush。为提升导入效率,该线程会异步并发发送多个RPC,并发数可以配置。
4. 发送成功或者失败的行都会通过callback反馈给使用者,callback的调用会在另外一个ExecutorService(用户可定制)内执行。
用户如何使用OTSWriter:
1. 初始化OTSWriter,可配置RestrictionConfig、缓冲区Queue、Callback ExecutorService等等
2. 调用addRowChange(com.aliyun.openservices.ots.model.RowChange)
并发的向OTSWriter中写入数据
3. 若写入完毕,调用flush()
对缓冲区内的数据进行flush
4. 调用close()
关闭OTSWriter,释放资源限定符和类型 | 方法和说明 |
---|---|
void |
addRowChange(List<RowChange> rowChanges,
List<RowChange> dirtyRows)
向本地缓冲区批量写入行。
|
void |
addRowChange(RowChange rowChange)
向本地缓冲区增加一行数据。
|
void |
close()
关闭OTSWriter,在关闭之前,会先flush掉缓冲区内的所有数据。
|
void |
flush()
主动flush缓冲区中的数据,该函数会等待缓冲区中的所有数据被flush完毕。
|
com.aliyun.openservices.ots.internal.OTSCallback<RowChange,ConsumedCapacity> |
getCallback()
获取设置的Callback。
|
com.aliyun.openservices.ots.internal.writer.WriterConfig |
getWriterConfig()
获取限制项配置。
|
void |
setCallback(com.aliyun.openservices.ots.internal.OTSCallback<RowChange,ConsumedCapacity> callback)
设置Callback,数据写入成功或者失败均会通过Callback来反馈。
|
void addRowChange(RowChange rowChange) throws ClientException
WriterConfig.maxPKColumnSize
和WriterConfig.maxAttrColumnSize
。
- 该行的属性列的个数是否超过WriterConfig.maxColumnsCount
。
- 该行的大小是否超过WriterConfig.maxBatchSize
。
- 属性列中是否有列名与主键列相同。
若在写入缓冲区之前被判定为脏数据,该部分数据不会触发CallBack的调用。ClientException
。rowChange
- 要写入的行ClientException
- 若该行被判定为脏数据void addRowChange(List<RowChange> rowChanges, List<RowChange> dirtyRows) throws ClientException
addRowChange(RowChange)
一样的检查,若批量写入的行中存在脏数据,则该函数会抛ClientException
,
且所有的脏数据会写入。rowChanges
- 批量写入的行dirtyRows
- 用于传出脏数据的列表ClientException
- 若存在脏数据void setCallback(com.aliyun.openservices.ots.internal.OTSCallback<RowChange,ConsumedCapacity> callback)
OTSAsync
中每个接口的Callback不同,其callback会与每个请求一一对应,且可以是独立的。
但是这里的Callback是与RowChange对应,且所有RowChange都共享该callback。callback
- com.aliyun.openservices.ots.internal.OTSCallback<RowChange,ConsumedCapacity> getCallback()
com.aliyun.openservices.ots.internal.writer.WriterConfig getWriterConfig()
void flush() throws ClientException
ClientException
void close()
addRowChange(com.aliyun.openservices.ots.model.RowChange)
向缓冲区写入数据,则该部分数据不保证会写入OTS。Copyright © 2016. All Rights Reserved.