【发布时间】:2022-10-25 22:30:05
【问题描述】:
给定大量已知的行键。 bigtable 如何读取(不是扫描操作)这些行?它是逐行读取还是一次全部读取?如果我要读取大量不连续的行,最好是分别进行并发或并行命中以读取每个行还是将所有行都提供给 bigtable,即“批量读取”?
【问题讨论】:
标签: google-cloud-platform google-cloud-bigtable bigtable
给定大量已知的行键。 bigtable 如何读取(不是扫描操作)这些行?它是逐行读取还是一次全部读取?如果我要读取大量不连续的行,最好是分别进行并发或并行命中以读取每个行还是将所有行都提供给 bigtable,即“批量读取”?
【问题讨论】:
标签: google-cloud-platform google-cloud-bigtable bigtable
非连续批量读取有三个选项,具体取决于您的延迟和 CPU 要求。您可以并行执行所有读取作为获取请求,您可以发出读取行请求/扫描,其中包含仅包含一行的多个范围,或者您可以执行混合。
读取多个并行获取请求
如果您具有强大的处理能力或不需要读取大量行,则此选项可能很棒。这将向 Bigtable 发出多个请求,因此会对您的 CPU 利用率产生影响。一个 Bigtable 节点每秒支持大约 10K 读取,但如果您有 1000 行,则需要单独读取,这可能会影响您的容量。
此外,如果您需要在处理数据之前解决所有请求,如果一个请求很慢,您可能会遇到性能问题,它会减慢整个结果。
多行扫描
Bigtable 支持使用多个过滤器进行扫描。一个过滤器是基于行键的行范围。您可以创建一个仅包含一行的行范围过滤器,并使用过滤器对每一行进行扫描。
Bigtable 客户端库支持queries like this,因此您可以只传递行键,而无需创建所有这些行范围过滤器。但是,重要的是要知道在性能方面发生了什么。这一次查询将在 Bigtable 服务器上按顺序执行,因此它可能比多次获取花费更多的时间。
在 Java 中,要执行这种查询,只需将多个行键传递给查询构建器,如下所示:
Query query = Query.create(tableId).rowKey("phone#4c410523#20190501").rowKey("phone#4c410523#20190502");
ServerStream<Row> rows = dataClient.readRows(query);
for (Row row : rows) {
printRow(row);
}
混合方法
根据您正在使用的行的规模,获取您的一组行键,将它们划分并并行发出多个扫描可能是有意义的。由于请求是并行的,您可以获得更少请求的好处,同时仍然可能获得更好的延迟。
我建议尝试看看哪种方案最适合您的用例,或者留下评论,提供有关您的用例的更多信息,我可以看看是否有更多信息可以提供给您。
【讨论】: