通过 dataproc 工作流模板传递参数

passing parameters via dataproc workflow-templates

我知道 dataproc workflow-templates 仍处于测试阶段,但如何通过添加作业将参数传递到可执行文件 sql?这是一个基本示例:

#/bin/bash

DATE_PARTITION=

echo DatePartition: $DATE_PARTITION


# sample job
gcloud beta dataproc workflow-templates add-job hive \
--step-id=0_first-job \
--workflow-template=my-template \
--file='gs://mybucket/first-job.sql' \
--params="DATE_PARTITION=$DATE_PARTITION"


gcloud beta dataproc workflow-templates run $WORK_FLOW 

gcloud beta dataproc workflow-templates remove-job $WORK_FLOW --step-
id=0_first-job

echo `date`

这是我从 shell:

调用的第一个 job.sql 文件
SET hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
SET mapred.output.compress=true;
SET hive.exec.compress.output=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
SET io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;

USE mydb;

CREATE EXTERNAL TABLE if not exists data_raw (
      field1 string,
      field2 string
    )
    PARTITIONED BY (dt String)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION 'gs://data/first-job/';

ALTER TABLE data_raw ADD IF NOT EXISTS PARTITION(dt="${hivevar:DATE_PARTITION}");

在 ALTER TABLE 语句中,正确的语法是什么?我已经尝试了 15 种以上的变体,但没有任何效果。如果我像这样硬编码(ALTER TABLE data_raw ADD IF NOT EXISTS PARTITION(dt="2017-10-31");)分区被创建,但不幸的是它需要被参数化。

顺便说一句——我收到的错误一直是这样的: 错误:编译语句时出错:失败:ParseException 行 1:48 无法识别常量 [=12 中 '${DATE_PARTITION}' ')' '' 附近的输入=]

我可能很接近但不确定我错过了什么。

TIA, 梅丽莎

感谢您试用 Workflows! First-class 对参数化的支持是我们路线图的一部分。但是现在你的 remove-job/add-job 技巧是最好的方法。

关于您的具体问题:

  • 通过参数传递的值被访问为 ${hivevar:PARAM}(参见 [1])。或者,您可以设置 --properties 访问为 ${PARAM}

  • params 不需要括号。如果要处理参数值中的 spaces,请使用引号,例如:--params="FOO=a b c,BAR=X"

  • 最后,我注意到 space 这里有一个错误 DATE_PARTITION =,这可能会导致空 DATE_PARTITION

希望对您有所帮助!

[1]

更新:Dataproc 现在具有工作流模板参数化,这是一项 Beta 功能:

https://cloud.google.com/dataproc/docs/concepts/workflows/workflow-parameters

针对您的具体情况,您可以执行以下操作:

创建空模板

gcloud beta dataproc workflow-templates create my-template

为要参数化的值添加占位符的作业

gcloud beta dataproc workflow-templates add-job hive \
--step-id=0_first-job \
--workflow-template=my-template \
--file='gs://mybucket/first-job.sql' \
--params="DATE_PARTITION=PLACEHOLDER"

将模板配置导出到文件

gcloud beta dataproc workflow-templates export my-template \
--destination=hive-template.yaml

编辑文件添加参数

jobs:
- hiveJob:
    queryFileUri: gs://mybucket/first-job.sql
    scriptVariables:
      DATE_PARTITION: PLACEHOLDER
  stepId: 0_first-job
parameters:
- name: DATE_PARTITION
  fields:
  - jobs['0_first-job'].hiveJob.scriptVariables['DATE_PARTITION']

导入更改

gcloud beta dataproc workflow-templates import my-template \
--source=hive-template.yaml

添加托管集群或集群选择器

gcloud beta dataproc workflow-templates set-managed-cluster my-template \
--cluster-name=my-cluster \
--zone=us-central1-a

运行 带参数的模板

gcloud beta dataproc workflow-templates instantiate my-template \
--parameters="DATE_PARTITION=${DATE_PARTITION}"