【问题标题】:How to validate Apache Beam command line arguments如何验证 Apache Beam 命令行参数
【发布时间】:2018-06-08 16:48:44
【问题描述】:

我使用 apache beam Python SDK 创建了一个命令行程序来在 Google Cloud 上启动 Dataflow 作业。然后在使用它时,我搞砸了其中一个选项。我把它搞砸了像这样--otiopn value,而不是像这样--option laevu。当指定无效选项时,我希望程序死掉或至少警告用户。相反,我的程序使用 --option 的默认值启动了一个 Dataflow 作业,直到完成我才注意到。

如何使用 apache beam 来验证我的命令行参数并避免此类情况?

【问题讨论】:

  • 这真的不是 Apache Beam 问题。对于您的代码来说,这更像是一个参数/参数处理问题。如果您愿意,可以使用 python 的 argparse 模块并为其创建检查。你可以找到很多关于如何做到这一点的教程。但为了让您开始,这里是link
  • 我已经查看了relevant code 一些。 Apache Beam 已经使用argparse 来解析命令行。为了允许用户提供命令行参数而不将它们包含在PipelineOptions 对象中,他们会忽略所有意外选项,我想假设您将自己处理这些选项。我一直在寻找一个关闭它的选项,但看起来没有办法。
  • 遗憾的是,据我所知,目前还没有办法做到这一点。抱歉,我无法提供有用的方法来解决您的问题。但是您可以做的事情是:记录系统中发生的所有活动和进程并测试通过的参数。两者对于安全和企业级编码以及您绝对应该发展的技能都至关重要。

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


【解决方案1】:

如果还有人有这个问题,现在确实可以让 Beam 验证参数。

创建您自己的扩展 PipelineOptions 或其实现之一的自定义选项,并将 @Required 注释用于所需参数。

public interface MyCustomOptions extends PipelineOptions {

@Description("Pub/Sub subscription name")
@Validation.Required
String getSubscriptionName();
void setSubscriptionName(String value);

}

然后在您的 Beam 管道中,按如下方式创建您的选项:

PipelineOptionsFactory.register(MyCustomOptions.class);
MyCustomOptions options = PipelineOptionsFactory.fromArgs(args).withValidation().as(MyCustomOptions.class);
Pipeline p = Pipeline.create(options);
...
p.run();

如果在运行时未定义选项 subscriptionName,Beam 将抛出 IllegalArgumentException,并显示如下消息:

缺少 [--subscriptionName, "Pub/Sub 订阅名称"] 的必需值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 2014-05-30
    相关资源
    最近更新 更多