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

时间:2017-10-18 23:49:28

标签: google-cloud-dataproc

据我所知,dataproc workflow-templates仍然处于测试阶段,但是如何通过add-job将参数传递给可执行文件sql?这是一个基本的例子:

#/bin/bash

DATE_PARTITION=$1

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 NOT EXISTS PARTITION(dt =" 2017-10-31");)分区被创建,但不幸的是它需要参数化。

BTW - 我收到的错误一直是这样的: 错误:编译语句时出错:FAILED:ParseException行1:48无法识别' $ {DATE_PARTITION}'附近的输入')' ''常数

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

TIA, 梅丽莎

2 个答案:

答案 0 :(得分: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}"

答案 1 :(得分:0)

感谢您尝试使用Workflows!对参数化的一流支持是我们路线图的一部分。但是现在你的删除工作/添加工作技巧是最好的方法。

关于您的具体问题:

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

  • 不需要params周围的括号。如果它打算处理参数值中的空格,请使用以下引用:--params="FOO=a b c,BAR=X"

  • 最后,我注意到DATE_PARTITION =$1的空格错误,可能会导致空DATE_PARTITION

希望这有帮助!

[1] How to use params/properties flag values when executing hive job on google dataproc