在 Bigtable 中进行跨洲复制会有一定的成本,主要有两个因素:带宽和延迟。为了降低成本,可以使用异步复制和部分复制的方法。
异步复制:可以将数据先缓存到本地,再异步地进行跨洲复制,这样可以避免跨洲复制时的延迟问题。代码示例如下:
Mutation m = Mutation.newBuilder()
.setCell(columnFamily, qualifier, timestamp, value)
.build();
table.mutateRowAsync(rowKey, m).get();
部分复制:这种方法可以根据需要只复制某些特定的数据,避免复制所有数据而造成的不必要的带宽消耗。代码示例如下:
public void copyTo(SequenceFile.Writer writer, Configuration conf)
throws IOException {
// 只复制 name 列族中的数据
for (Map.Entry e : scanner) {
Result r = e.getValue();
Key k = new Key(e.getKey());
for (KeyValue kv : r.getColumn(MetadataTable.NAME_COL_FAMILY_BYTES, null)) {
writer.append(k, kv);
}
}
}