使用 bigtable 和 python,像 google.api_core.exceptions.Aborted: 409 Error while reading table 这样的异常的原因是啥?

Posted

技术标签:

【中文标题】使用 bigtable 和 python,像 google.api_core.exceptions.Aborted: 409 Error while reading table 这样的异常的原因是啥?【英文标题】:With bigtable and python, what are the causes of an exception like google.api_core.exceptions.Aborted: 409 Error while reading table?使用 bigtable 和 python,像 google.api_core.exceptions.Aborted: 409 Error while reading table 这样的异常的原因是什么? 【发布时间】:2021-10-29 12:50:58 【问题描述】:

在表上使用 read_rows 时出现此异常。该表有文档特征行,每个文档有 300 到 800 个特征,大约有 200 万个文档。 row_key 是特征,列是具有该特征的文档 ID。有数十亿行。

我在 GCP 上的 16 CPU VM 上运行它,平均负载在 6 到 10 之间。我使用的是 python bigtable SDK 和 python 3.6.8 和 google-cloud-bigtable 2.3.3。

我在使用 table.read_rows(start_key=foo#xy, end_key=foo#xz) 读取行时遇到这种异常。 foo#xy 和 foo#xy 来自 table.sample_row_keys()。我从 sample_row_keys 获得了 200 个前缀,并且在收到此错误之前成功处理了前 5 个左右。我正在线程池中运行 table.read_rows() 调用。

如果您遇到这样的异常并进行调查,是什么原因造成的,您采取了哪些措施来防止它?

Traceback (most recent call last):
  File "/home/bdc34/docsim/venv/lib64/python3.6/site-packages/google/api_core/grpc_helpers.py", line 106, in __next__
    return next(self._wrapped)
  File "/home/bdc34/docsim/venv/lib64/python3.6/site-packages/grpc/_channel.py", line 426, in __next__
    return self._next()
  File "/home/bdc34/docsim/venv/lib64/python3.6/site-packages/grpc/_channel.py", line 809, in _next
    raise self
grpc._channel._MultiThreadedRendezvous: <_MultiThreadedRendezvous of RPC that terminated with:
        status = StatusCode.ABORTED
        details = "Error while reading table 'projects/arxiv-production/instances/docsim/tables/docsim' : Response was not consumed in time; terminating connection.(Possible causes: slow client data read or network problems)"
        debug_error_string = ""created":"@1635477504.521060666","description":"Error received from peer ipv4:172.217.0.42:443","file":"src/core/lib/surface/call.cc","file_line":1069,"grpc_message":"Error while reading table 'projects/arxiv-production/instances/docsim/tables/docsim' : Response was not consumed in time; terminating connection.(Possible causes: slow client data read or network problems)","grpc_status":10"
>

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib64/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib64/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/bdc34/docsim/docsim/loading/all_common_hashes.py", line 53, in <module>
    for hash, n, c, dt in pool.imap_unordered( do_prefix, jobs ):
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 735, in next
    raise value
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 119, in worker
    result = (True, func(*args, **kwds))
  File "/home/bdc34/docsim/docsim/loading/all_common_hashes.py", line 33, in do_prefix
    for hash, common, papers in by_prefix(db, start, end):
  File "/home/bdc34/docsim/docsim/loading/all_common_hashes.py", line 15, in by_prefix
    for row in db.table.read_rows(start_key=start, end_key=end):
  File "/home/bdc34/docsim/venv/lib64/python3.6/site-packages/google/cloud/bigtable/row_data.py", line 485, in __iter__
    response = self._read_next_response()
  File "/home/bdc34/docsim/venv/lib64/python3.6/site-packages/google/cloud/bigtable/row_data.py", line 474, in _read_next_response
    return self.retry(self._read_next, on_error=self._on_error)()
  File "/home/bdc34/docsim/venv/lib64/python3.6/site-packages/google/api_core/retry.py", line 288, in retry_wrapped_func
    on_error=on_error,
  File "/home/bdc34/docsim/venv/lib64/python3.6/site-packages/google/api_core/retry.py", line 190, in retry_target
    return target()
  File "/home/bdc34/docsim/venv/lib64/python3.6/site-packages/google/cloud/bigtable/row_data.py", line 470, in _read_next
    return six.next(self.response_iterator)
  File "/home/bdc34/docsim/venv/lib64/python3.6/site-packages/google/api_core/grpc_helpers.py", line 109, in __next__
    raise exceptions.from_grpc_error(exc) from exc
google.api_core.exceptions.Aborted: 409 Error while reading table 'projects/testproject/instances/testinstance/tables/testtable' : 
Response was not consumed in time; terminating connection.(Possible causes: slow client data read or network problems)

【问题讨论】:

【参考方案1】:

这个错误可能有不同的原因。您可能需要确保这里没有遇到hotspotting 场景。

此外,您可以检查您是否正在读取表中的许多不同行,以及您是否正在创建尽可能少的客户端。如果您正在读取仅包含少量行的大量行键,则性能也会受到影响。你会发现更多关于解决性能问题的一般建议here。

【讨论】:

我没有使用应该热点的时间序列数据或行键。我正在创建很多客户,因为我想并行处理。我的行空间非常稀疏。我也在读取样本前缀返回的范围。【参考方案2】:

我通过调用范围小得多的 read_rows 来解决这个问题。 table.sample_row_keys() 的前缀跨越了大约 1.5B 行。将每个范围平分 5 次以产生更小的范围。

我通过将开始和结束的 row_keys 填充到相同的长度来一分为二,将它们转换为整数并找到中点。

【讨论】:

以上是关于使用 bigtable 和 python,像 google.api_core.exceptions.Aborted: 409 Error while reading table 这样的异常的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Hbase 或 BigTable 像海量的 Matrix Store 吗?

在 python 中使用谷歌数据流从 Bigquery 到 Bigtable 数据传输

像python操作attr一样在go里用reflect 操作field (标题与内容弱相关)

Go 和命名空间:是不是有可能实现类似于 Python 的东西?

大表数据建模和python查询

Bigtable python客户端:如何检索大于给定值的最小行键