我正在构建一个谷歌云数据流管道来处理视频。我很难调试管道,因为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的道路,因为我需要以某种方式在下游分配它们,如果已经有一个解析参数的工具,这似乎是一个更直接的解决方案,提供数据流工作者没有什么特别之处。
答案 0 :(得分:1)
我有错误的概念模型。在本地,每个“工作者”仍然可以访问sys args,因此并不是跑步者的行为不同,而是“工人”绕过云管道并抓住新的args进行解析。在DataFlowRunner中执行此操作的方法是使用
将管道参数显式传递给DoFN函数__init__(self,args)
。然后在梁管道内部解析这些args,就像它们来自一个字符串一样。