我在bigtable中有数以百万计的文章,要扫描50,000篇文章,我将其用作:
for key, data in mytable.scan(limit=50000):
print (key,data)
它对上限为10000
的行之有效,但是当我超过10000
的限制时,我会收到此错误
_Rendezvous:<_以(StatusCode.DEADLINE_EXCEEDED)终止的RPC集合
答案 0 :(得分:1)
有一个针对此问题的修复程序,其中客户端会自动重试此类临时故障。该修补程序尚未发布,但有望很快发布。
答案 1 :(得分:0)
我有一个类似的问题,我必须同时从许多行中检索数据。您正在使用的看起来像hbase客户端,我的解决方案使用的是本机客户端,因此我将尝试同时发布-我测试过的一个和可能有效的一个。
我从来没有找到一个示例,该示例演示如何使用here来consume_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
可能有一个更好的解决方案,我真的很想知道它是什么,但这暂时对我有用。