我正在使用Google Cloud Bigtable的开发实例和Python客户端google-cloud-happybase软件包。
出于开发目的: - 我的表有56.5k行,18列。
- 我的表有1个列族
- 每个行元素的平均大小内容为9.5个字节。
-Row键平均为~35个字节
- 行键是平衡的。
当我在我的桌子上使用scan()函数时,我得到一个生成器,可用于获取每个行键的内容。每当我从生成器中读取内容时,我都没有时序一致性,例如:
samp = table.scan(columns = ['sample_family:ContactId'])
for i in range(56547):
start_time = timeit.default_timer()
samp.next()
elapsed = timeit.default_timer() - start_time
append_list.append(elapsed)
- 调用next()的中位时间是4.05e-06秒
- 调用next()的最长时间为.404秒,多次调用至少需要0.1秒。
- 由于异常值,在生成器中的所有元素上调用next()的总时间是2.173秒,并且理想情况下需要(4.05e-06)* 56,547~ .229秒,因为时间的分布是正常分发。
显然有几个异常值会使性能下降。
我的问题是为什么我会看到这种类型的效果,因为它与此处找到的指标不一致: https://cloud.google.com/bigtable/docs/performance
我的想法是,因为工作量明显低于< 300 GB,与较大的集合相比,Bigtable可能无法平衡优化较小数据集性能的数据。
即使我的开发实例使用17.1MB的1个节点,我觉得这应该不是问题。
- 我想知道是否有人能够对我遇到的问题/问题给出见解,以及采取哪些可能措施来纠正这种情况。
答案 0 :(得分:1)
Cloud Bigtable的Read API是一个流API。流中的每个响应都是一组行。有时,您需要等待下一个响应,但大多数情况下您会获得已经在内存中的行。以下是一些需要考虑的其他事项
第一个响应总是很慢,因为服务器端批处理响应。
API按顺序读取行。您可以通过并行化请求来获得性能增强。在Java中,我会让区域确定应该将哪些开始/停止键用于扫描集。不幸的是,Table.region()目前在Python中不可用,所以我raised a bug来修复它。
仅供参考,我是Cloud Bigtable Java客户端的作者。我添加了一些性能优化来预取其他响应。我们需要将python客户端的速度与Java客户端的速度进行比较。如果您对Java感到满意,请考虑与该客户端进行相同的测试以比较性能。
我希望这会有所帮助。