Bigtable 性能影响列族

kre*_*lst 5 bigdata google-cloud-platform google-cloud-bigtable

我们目前正在调查使用多个列族对我们的 bigtable 查询性能的影响。我们发现将列拆分为多个列族并不会提高性能。有没有人有过类似的经历?

关于我们的基准设置的更多细节。此时,我们生产表中的每一行都包含大约 5 列,每列包含 0.1 到 1 KB 的数据。所有列都存储在一个列族中。执行行键范围过滤器(平均返回 340 行)并应用列正则表达式拟合器(每行仅返回 1 列)时,查询平均需要 23.3 毫秒。我们创建了一些测试表,其中每行的列/数据量增加了 5 倍。在测试表 1 中,我们将所有内容都保留在一个列族中。正如预期的那样,这将同一查询的查询时间增加到 40.6 毫秒。在测试表 2 中,我们将原始数据保留在一个列族中,但将额外的数据放入另一个列族中。当查询包含原始数据的列族(因此包含与原始表相同的数据量)时,查询时间平均为 44.3ms。所以当使用更多的列族时,性能甚至会下降。

这与我们预期的完全相反。例如,这在 bigtable 文档中提到(https://cloud.google.com/bigtable/docs/schema-design#column_families

将数据分组到列族允许您从单个族或多个族中检索数据,而不是检索每一行中的所有数据。尽可能紧密地对数据进行分组,以便在最频繁的 API 调用中仅获取您需要的信息,但仅此而已。

有人对我们的发现有解释吗?

基准结果


(编辑:添加了更多细节)

单行内容:

表一

  • CF1

    • 第 1 列
    • 列2
    • ...
    • col25

表二

  • CF1
    • 第 1 列
    • 列2
    • ..
    • 第 5 列
  • CF2
    • 第 6 列
    • col7
    • ..
    • col25

我们正在执行的基准测试是使用 go 客户端。调用API的代码基本如下:

filter = bigtable.ChainFilters(bigtable.FamilyFilter(request.ColumnFamily),
            bigtable.ColumnFilter(colPattern), bigtable.LatestNFilter(1))
tbl := bf.Client.Open(table)
rr := bigtable.NewRange(request.RowKeyStart, request.RowKeyEnd)
err = tbl.ReadRows(c, rr, func(row bigtable.Row) bool {return true}, bigtable.RowFilter(filter))
Run Code Online (Sandbox Code Playgroud)

kre*_*lst 0

将数据拆分到多个列族时性能没有提升的原因是它们存储在同一个“位置组”(即文件)中。在内部,Google 确实提供了将不同列族拆分到不同位置组的可能性,但这并没有在其托管的 Cloud Bigtable 服务中公开。请参阅对此答案的评论。