实现声明的 Cloud Bigtable 写入 QPS
Achieving declared Cloud Bigtable writes QPS
我们已经设置了 5 个节点的 Bigtable 集群,GCP 控制台声明它应该支持 50K QPS @ 6ms 的读写。
我们正在尝试加载一个大型数据集(约 8 亿条记录),其中约 50 个字段主要包含数字数据和一些短字符串。密钥是 11 位数字字符串。
当通过 HBase API 从 GCE 中的单个客户端 VM 加载此数据集时,我们在将每个字段放入单独的列时观察到高达 4K QPS。我们使用单个 HBase 连接和多个线程 (5-30) 批量放置 10K 条记录。
将所有字段合并到一个列中时(Avro 编码,每条记录约 250 字节),批量放置的写入性能提高到 10K QPS。并发线程数似乎不影响 QPS。当每个线程使用单独的 HBase 连接时,5 个线程的写入性能提高到 20K QPS。
客户端VM与Bigtable集群在同一个可用区,在加载过程中几乎处于空闲状态,因此瓶颈似乎不在客户端。
问题:
- 从我们的测试来看,写入 QPS 似乎随着插入的列数而降低。这是预期的吗?如何量化这种关系? (顺便说一句,如果在 Bigtable performance documentation 中提到这一点就好了)。
- 为了达到声明的写入QPS,我们可能缺少什么?我的理解是每个集群节点都应该支持 10K 写入 QPS,但是看起来我们要针对具有单个 HBase 连接的单个节点,并且仅针对具有多个 HBase 连接的 2 个节点。
回答第二个问题:我们通过从批处理 HBase Puts 切换到 mutators 设法达到了超过 50K QPS。我们还在用多HBase连接,单连接好像只限于单节点吞吐量。
BufferedMutator
在 0.2.3-SNAPSHOT 中使用 OpenSSL 和 Java8 为 4 CPU 机器上的小 (1KB) 突变提供 22-23K QPS,在 32 机器上高达 90K CPU 机器。 0.2.2 给出了 10K-12K QPS。打开单个 HBase 连接以获得最佳性能。
注意 - 删除了关于 OpenSSL 的注释,因为它现在是默认设置
有关其他信息,请参阅 https://github.com/GoogleCloudPlatform/cloud-bigtable-client。
我们已经设置了 5 个节点的 Bigtable 集群,GCP 控制台声明它应该支持 50K QPS @ 6ms 的读写。
我们正在尝试加载一个大型数据集(约 8 亿条记录),其中约 50 个字段主要包含数字数据和一些短字符串。密钥是 11 位数字字符串。
当通过 HBase API 从 GCE 中的单个客户端 VM 加载此数据集时,我们在将每个字段放入单独的列时观察到高达 4K QPS。我们使用单个 HBase 连接和多个线程 (5-30) 批量放置 10K 条记录。
将所有字段合并到一个列中时(Avro 编码,每条记录约 250 字节),批量放置的写入性能提高到 10K QPS。并发线程数似乎不影响 QPS。当每个线程使用单独的 HBase 连接时,5 个线程的写入性能提高到 20K QPS。
客户端VM与Bigtable集群在同一个可用区,在加载过程中几乎处于空闲状态,因此瓶颈似乎不在客户端。
问题:
- 从我们的测试来看,写入 QPS 似乎随着插入的列数而降低。这是预期的吗?如何量化这种关系? (顺便说一句,如果在 Bigtable performance documentation 中提到这一点就好了)。
- 为了达到声明的写入QPS,我们可能缺少什么?我的理解是每个集群节点都应该支持 10K 写入 QPS,但是看起来我们要针对具有单个 HBase 连接的单个节点,并且仅针对具有多个 HBase 连接的 2 个节点。
回答第二个问题:我们通过从批处理 HBase Puts 切换到 mutators 设法达到了超过 50K QPS。我们还在用多HBase连接,单连接好像只限于单节点吞吐量。
BufferedMutator
在 0.2.3-SNAPSHOT 中使用 OpenSSL 和 Java8 为 4 CPU 机器上的小 (1KB) 突变提供 22-23K QPS,在 32 机器上高达 90K CPU 机器。 0.2.2 给出了 10K-12K QPS。打开单个 HBase 连接以获得最佳性能。
注意 - 删除了关于 OpenSSL 的注释,因为它现在是默认设置
有关其他信息,请参阅 https://github.com/GoogleCloudPlatform/cloud-bigtable-client。