【问题标题】:RuntimeValueProviderError when Running Dataflow Template Job运行数据流模板作业时出现 RuntimeValueProviderError
【发布时间】:2021-05-08 06:24:26
【问题描述】:

试图找出我收到这些错误的原因。快速搜索仅导致提到损坏版本的答案,但这里似乎并非如此。创建模板工作正常,但是当我运行它(并且当我通过限制 arg 时)我得到下面的错误。这个想法是根据模板中提供的参数构建查询。如果有更好的替代方法,我愿意接受。

代码:

class Options(PipelineOptions):
    @classmethod
    def _add_argparse_args(cls, parser):
        parser.add_value_provider_argument(
            '--limit',
            default=0,
            type=int,
            help='Limit the amount of rows retrieved'
        )

...
    
def from_bq(options):
    with beam.Pipeline(options=options) as p:
        (p 
            | 'Read From BQ' >> beam.io.ReadFromBigQuery(query=NestedValueProvider(options.limit, create_query), use_standard_sql=True)
        ) 
    
def create_query(limit):
    query = """
        SELECT * FROM ...
    """

    if limit > 0:
        query = query + " LIMIT {limit}".format(limit=limit)

    return query

错误:

raise error.RuntimeValueProviderError('%s not accessible' % obj)
apache_beam.error.RuntimeValueProviderError: NestedValueProvider(value: RuntimeValueProvider(option: limit, type: int, default_value: 0), translator: create_query) not accessible [while running 'Read From BQ/Read/Split-ptransform-324']

运行 apache-beam 版本 2.27.0。

【问题讨论】:

  • 澄清一下,我也尝试过使用 StaticValueProvider,只是为了进行实验。虽然它在 2.27.0 中不起作用,但在 2.26.0 中确实起作用,因此在以后的版本中 ValueProviders 似乎是半损坏的。不过,没有设法让常规的 ValueProvider 在任何版本中工作。

标签: python apache-beam dataflow apache-beam-io


【解决方案1】:

我认为标准模板无法做到这一点。您应该考虑使用Flex Templates,它具有非模板管道的完全灵活性。

【讨论】:

  • 什么是不可能的?他们在这里谈论官方文档中的ValueProvider:cloud.google.com/dataflow/docs/guides/templates/…
  • 必须通过每个 Transform 手动连接对 ValueProviders 的支持(并且实际上不能在图形构建时检查,例如影响构建本身,甚至是“意外”,这可能是由于其他一些变化)。这种脆弱性是我们远离它的原因之一。如果旧的 SDK 可以工作,你可以坚持下去,但我会转向未来的 flex 模板。
  • 如果在使用 Flex 模板时启动时间不接近 10 分钟,我会使用它们。有什么解决办法吗?
  • 关于启动时间的要点。我只知道它正在开发中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 2020-12-21
  • 1970-01-01
相关资源
最近更新 更多