BigTable:使用Python客户端提高BigTable查询的性能

jos*_*azo 5 python google-cloud-platform google-cloud-bigtable

查询BigTable时,我们遇到了一些性能问题。

查询约1400行时,监控仪表板中将获得约500行/秒的速度,而在与BigTable实例位于同一区域的计算机中运行下一个代码片段时,则需要约1.6秒:

partial_rows = instance.table(table_name).read_rows(filter_=row_filter, row_set=row_set)

ids = {}
for row in partial_rows:
    key = row.row_key.decode()
    category = key[0:5]
    id_, year_month = key[5:].split('_')
    dates = ids.get(id_, {})

    for k, v in row.cells[column_family].items():
        sub_key = k.decode()
        day = sub_key[0:2]
        measurement = f'{category}_{sub_key[3:]}'

        date = datetime.date(int(year_month[0:4]), int(year_month[4:6]), int(day))
        value = struct.unpack('>i', v[0].value)[0]

        measurements = dates.get(date, {})
        measurements[measurement] = value
        dates[date] = measurements

    ids[id_] = dates
Run Code Online (Sandbox Code Playgroud)

我们使用的表模式是:

  • 行键: {category}{id}_{year}{month}
  • 柱: {day}{measurement_name}

在我们的案例中,此架构完全遵循BigTable的准则。

该代码段非常简单,我们使用键和列名执行一些操作以创建如下所示的ids字典:

{
  "4326": {
    "2019-01-01": {
      "value_a": 49
    },
    "2019-01-02": {
      "value_a": 53
    },
    ...
  },
  "3857": {
    "2019-01-01": {
      "value_a": 56
    },
    "2019-01-02": {
      "value_a": 59
    },
    ...
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)

您是否知道为什么我们的读取吞吐量如此之低?

有没有办法立即获取所有数据而不使用read_rows流生成器?甚至其他具有相同Python客户端或另一个客户端的解决方案,例如异步的解决方案。