Google Cloud Dataflow:使用argparse

时间:2017-08-18 03:37:36

标签: argparse google-cloud-dataflow

我正在构建一个谷歌云数据流管道来处理视频。我很难调试管道,因为DirectRunner与DataflowRunner的环境行为似乎不同。

我的视频处理工具(下面称为DeepMeerkat)从argparse接收参数。我打电话给管道:

python run_clouddataflow.py \
    --runner DataFlowRunner \
    --project $PROJECT \
    --staging_location $BUCKET/staging \
    --temp_location $BUCKET/temp \
    --job_name $PROJECT-deepmeerkat \
    --setup_file ./setup.py \
    --maxNumWorkers 3 \
    --tensorflow \
    --training

最后两个参数,tensorflow和training都适用于我的管道,其余的都是clouddataflow所必需的。

我解析args并将argv传递给管道

beam.Pipeline(argv=pipeline_args)

然后在DeepMeerkat的argparse中解析已知的args。

args,_=parser.parse_known_args()

这在本地完美运行,关闭张量流(默认打开)并开启训练(默认打开)。打印args确认了这种行为。但后来它无法解析云数据流,张量流保持不变,培训也没有。

DirectRunner:

DeepMeerkat args: Namespace(tensorflow=False, training=True)

从DataFlowRunner的日志记录:

DeepMeerkat args: Namespace(tensorflow=True, training=False)

关于这里发生了什么的任何想法?相同的命令,相同的代码,只需将DirectRunner更改为DataFlowRunner。

我宁愿不走passing custom arguments to pipeline options的道路,因为我需要以某种方式在下游分配它们,如果已经有一个解析参数的工具,这似乎是一个更直接的解决方案,提供数据流工作者没有什么特别之处。

1 个答案:

答案 0 :(得分:1)

我有错误的概念模型。在本地,每个“工作者”仍然可以访问sys args,因此并不是跑步者的行为不同,而是“工人”绕过云管道并抓住新的args进行解析。在DataFlowRunner中执行此操作的方法是使用

将管道参数显式传递给DoFN函数
__init__(self,args)

。然后在梁管道内部解析这些args,就像它们来自一个字符串一样。