【问题标题】:"StatusCode.DEADLINE_EXCEEDED" error while using bigtable.scan() function使用 bigtable.scan() 函数时出现“StatusCode.DEADLINE_EXCEEDED”错误
【发布时间】:2018-08-19 18:20:32
【问题描述】:

我在 bigtable 中有数百万篇文章,要扫描 50,000 篇文章,我使用了一些东西:

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

它适用于最高 10000 的限制,但当我超过 10000 的限制时,我收到此错误

_Rendezvous:<_rendezvous rpc>

【问题讨论】:

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


【解决方案1】:

对此问题进行了修复,客户端会自动重试类似这样的临时故障。该修复程序尚未发布,但有望很快发布。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,我必须同时从多行中检索数据。您使用的看起来像 hbase 客户端,我的解决方案是使用本机客户端,所以我将尝试发布两者 - 我测试过的一个和可能工作的一个。

    我从来没有找到一个示例来演示如何使用consume_next() 方法简单地迭代行,这是在here 中提到的,我自己也没有弄清楚。为太多行调用 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
    

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

    【讨论】:

    • 那么,在第二个中,您设置了 10000 的限制。当涉及到第 10001 篇文章时,它是如何迭代的?处理 10000 篇文章后,处理文章的下一个限制是多少?
    • 您可以将其视为批量大小。它在row_start 之后处理 10,000 篇文章。所以一开始,你从无开始,这将是第一行。在第二次迭代中,您的开始键将是上一次迭代的最后一个键,它将返回第二个 10k 项,第 10,000-20,000 行,依此类推。实际上,这指出了一个错误,那些行(第 10,000 行、第 20,000 行等)将被处理两次。让我解决这个问题。
    • 在第一个代码中,它给出的错误为NameError: name 'start_key' is not defined
    • 当然不是,它是一个 sn-p 并且这些变量是特定于应用程序的,对吗?就像end_keyfilter_ 以及您对row 所做的任何事情。
    • 所以我需要为start_key 提供任何值吗? while start_key != previous_start_key: 为此它给出了一个错误
    猜你喜欢
    • 1970-01-01
    • 2020-04-20
    • 2013-05-20
    • 2019-10-05
    • 2022-01-14
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    相关资源
    最近更新 更多