【问题标题】:Executing a Dataflow job with multiple inputs/outputs using gcloud cli使用 gcloud cli 执行具有多个输入/输出的 Dataflow 作业
【发布时间】:2019-01-16 00:26:39
【问题描述】:

我在 Dataprep 中设计了一个数据转换,现在正尝试使用 Dataflow 中的模板来运行它。我的流程有几个输入和输出 - 数据流模板将它们作为 json 对象提供,每个输入和位置都有键/值对。它们看起来像这样(为便于阅读添加了换行符):

{
    "location1": "project:bq_dataset.bq_table1",
    #...
    "location10": "project:bq_dataset.bq_table10",
    "location17": "project:bq_dataset.bq_table17"
}

我有 17 个输入(主要是查找)和 2 个输出(一个 csv,一个 bigquery)。我将这些传递给gcloud CLI,如下所示:

gcloud dataflow jobs run job-201807301630 /
    --gcs-location=gs://bucketname/dataprep/dataprep_template /
    --parameters inputLocations={"location1":"project..."},outputLocations={"location1":"gs://bucketname/output.csv"}

但我收到一个错误:

ERROR: (gcloud.dataflow.jobs.run) unrecognized arguments:
inputLocations=location1:project:bq_dataset.bq_table1,outputLocations=location2:project:bq_dataset.bq_output1
inputLocations=location10:project:bq_dataset.bq_table10,outputLocations=location1:gs://bucketname/output.csv

从错误消息来看,它看起来正在合并输入和输出,因此由于我有两个输出,因此每两个输入都与两个输出配对:

input1:output1
input2:output2
input3:output1
input4:output2
input5:output1
input6:output2
...

我尝试引用输入/输出对象(单和双,加上删除对象中的引号),将它们包装在[] 中,使用波浪号但没有乐趣。有没有人设法执行具有多个输入的数据流作业?

【问题讨论】:

    标签: google-cloud-platform google-cloud-dataflow gcloud google-cloud-dataprep


    【解决方案1】:

    经过大量的反复试验,我终于找到了解决方案。涉及多个步骤。

    --parameters的格式

    --parameters 参数是字典类型的参数。您可以通过在 CLI 中键入 gcloud topic escaping 来阅读文档中有关这些的详细信息,但简而言之,这意味着您需要在 --parameters 和参数之间添加一个 =,然后格式为 key=value 对用引号括起来的值 ("):

    --parameters=inputLocations="object",outputLocations="object"
    

    转义对象

    然后,对象需要引号转义以避免过早结束值,所以

    {"location1":"gcs://bucket/whatever"...
    

    变成

    {\"location1\":\"gcs://bucket/whatever\"...
    

    选择不同的分隔符

    接下来,CLI 会变得混乱,因为虽然 key=value 对由逗号分隔,但值在对象中也有逗号。因此,您可以通过将其放在参数开头的克拉 (^) 之间以及 key=value 对之间来定义不同的分隔符:

    --parameters=^*^inputLocations="{"\location1\":\"...\"}"*outputLocations="{"\location1\":\"...\"}"
    

    我使用 * 是因为 ; 不起作用 - 可能是因为它标志着 CLI 命令的结束?谁知道呢。

    还要注意gcloud topic escaping 信息说:

    在 Windows 上的 cmd.exe 和 PowerShell 中,^ 是一个特殊字符,并且 你必须通过重复它来逃避它。在以下示例中,每次 你看到了^,把它换成^^^^。

    别忘了customGcsTempLocation

    毕竟,我忘记了 customGcsTempLocation 需要添加到 --parameters 参数中的 key=value 对。不要忘记用* 将其与其他人分开并再次用引号将其括起来:

    ...}*customGcsTempLocation="gs://bucket/whatever"
    

    在线文档中几乎没有任何解释,所以这是我生命中的几天我不会回来 - 希望我已经帮助了其他人。

    【讨论】:

    • 你好亚当,感谢这篇文章。它帮助我部署了我的管道。另一方面,您是否通过 java 脚本执行所有 ETL 操作。有没有我可以参考的参考文章,以帮助在 Dataflow 上开发复杂的 ETL 操作。任何指针都会有很大帮助。
    • @akashsharma 不,我们正在使用 Cloud Dataprep,它会生成数据流模板
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2015-03-28
    • 1970-01-01
    • 2015-11-21
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多