【问题标题】:passing parameters via dataproc workflow-templates通过 dataproc 工作流模板传递参数
【发布时间】:2018-03-30 23:03:03
【问题描述】:

我知道 dataproc 工作流模板仍处于测试阶段,但是如何通过 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 调用的 first-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");)分区就会创建,但不幸的是它需要参数化。

顺便说一句——我收到的错误始终是这样的: 错误:编译语句时出错:FAILED:ParseException line 1:48 cannot identify input near '${DATE_PARTITION}' ')' '' in constant

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

TIA, 梅丽莎

【问题讨论】:

    标签: google-cloud-dataproc


    【解决方案1】:

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

    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}"
    

    【讨论】:

      【解决方案2】:

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

      关于您的具体问题:

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

      • 参数周围的括号不需要。如果要处理参数值中的空格,请使用以下引号:--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

      【讨论】:

      • 呃……谢谢,那行得通。我将原始帖子中的代码示例更正为工作版本,以防它可以帮助其他人。 :)
      猜你喜欢
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多