你如何在Python中测试Beam管道(Google Dataflow)?

时间:2017-11-21 17:03:40

标签: python-2.7 google-cloud-dataflow apache-beam

我正在理解我们应该如何使用Google DataFlow(基于Apache Beam)Python SDK来测试我们的管道。

https://beam.apache.org/documentation/pipelines/test-your-pipeline/ https://cloud.google.com/dataflow/pipelines/creating-a-pipeline-beam

以上链接仅适用于Java。我很困惑谷歌为什么会指向Java Apache测试。

我希望能够在两个p集合上查看CoGroupByKey连接的结果。我来自Python背景,我几乎没有使用Beam / Dataflow的经验。

真的可以使用任何帮助。我知道这在一定程度上是开放式的。基本上我需要能够在我的管道中查看结果,这使我无法看到我的CoGroupByKey Join的结果。

以下代码

    #dwsku, product are PCollections coming from BigQuery. Nested Values as 
    #well in Product, but not dwsku
    d1 = {'dwsku': dwsku, 'product': product}
    results = d1 | beam.CoGroupByKey()
    print results

印刷什么:

    PCollection[CoGroupByKey/Map(_merge_tagged_vals_under_key).None]

1 个答案:

答案 0 :(得分:3)

如果要在计算机上进行本地测试,则应首先使用DirectRunner然后通过打印日志或停止在调试器中执行来调试它。

要在本地查看整个PCollection,您可以执行以下操作:

d1 = {'dwsku': dwsku, 'product': product}
results = d1 | beam.CoGroupByKey()

def my_debug_function(pcollection_as_list):
    # add a breakpoint in this function or just print
    print pcollection_as_list

debug = (results | beam.combiners.ToList() | beam.Map(my_debug_function))

这里有几点需要记住:

  • ToList()转换可能会分配大量内存
  • 在使用DirectRunner时,您应该使用管道的.wait_until_finish()方法,这样您的脚本就不会在管道完成执行之前结束
  • 如果您的管道从BigQuery下载数据,则应在本地运行时将LIMIT放入查询中