使用bigtable.scan()函数时出现“ StatusCode.DEADLINE_EXCEEDED”错误

时间:2018-08-19 18:20:32

标签: python google-cloud-platform google-cloud-bigtable

我在bigtable中有数以百万计的文章,要扫描50,000篇文章,我将其用作:

for key, data in mytable.scan(limit=50000):
         print (key,data)

它对上限为10000的行之有效,但是当我超过10000的限制时,我会收到此错误

  

_Rendezvous:<_以(StatusCode.DEADLINE_EXCEEDED)终止的RPC集合

2 个答案:

答案 0 :(得分:1)

有一个针对此问题的修复程序,其中客户端会自动重试此类临时故障。该修补程序尚未发布,但有望很快发布。

答案 1 :(得分:0)

我有一个类似的问题,我必须同时从许多行中检索数据。您正在使用的看起来像hbase客户端,我的解决方案使用的是本机客户端,因此我将尝试同时发布-我测试过的一个和可能有效的一个。

我从来没有找到一个示例,该示例演示如何使用hereconsume_next()方法对行进行简单的迭代,并且我没有设法在我的计算机上弄清楚它拥有。过多地调用consume_all()会产生相同的DEADLINE EXCEEDED错误。

LIMIT = 10000
previous_start_key = None
while start_key != previous_start_key:
    previous_start_key = start_key
    row_iterator = bt_table.read_rows(start_key=start_key, end_key=end_key, 
        filter_=filter_, limit=LIMIT)
    row_iterator.consume_all()
    for _row_key, row in row_iterator.rows.items():
        row_key = _row_key.decode()
        if row_key == previous_start_key:  # Avoid repeated processing
            continue
        # do stuff 
        print(row)  
        start_key = row_key

因此,基本上,您可以从任何start_key开始,检索10k结果,执行consume_all(),然后从您上次中断的位置开始检索下一个批次,依此类推,直到适用某种合理条件为止。

对于您来说,它可能类似于:

row_start = None
for i in range(5):
    for key, data in mytable.scan(row_start=row_start, limit=10000):
        if key == row_start:  # Avoid repeated processing
            continue
        print (key,data)
        row_start = key

可能有一个更好的解决方案,我真的很想知道它是什么,但这暂时对我有用。