Невозможно передать параметры задания с помощью Dataflow REST API - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь вызвать шаблон потока данных через REST API , однако, когда в теле указаны параметры , выдается ошибка INVALID_ARGUMENT.После удаления поля параметров все работает нормально.Я пробовал и Javascript, и Python, но получаю точно такую ​​же ошибку.

from googleapiclient.discovery import build
from oauth2client.client import GoogleCredentials

def invoke_dataflow_job():
    credentials = GoogleCredentials.get_application_default()
    service = build('dataflow', 'v1b3', credentials=credentials)

    TEMPLATE_LOCATION = 'gs://xxx';
    PROJECT_ID = 'xxx';
    JOB_NAME = 'xxx';
    LOCATION = 'europe-west1';
    ZONE = 'europe-west1-b';
    TEMP_LOCATION = 'xxx';

    BODY = {
        'jobName': JOB_NAME,
        'gcsPath': TEMPLATE_LOCATION,
        'parameters': {
           'messageToPrint': 'Blue sky'
        },
        'environment': {
           'tempLocation': TEMP_LOCATION,
           'zone': ZONE,
        }
    }

    request = service.projects().locations().templates().create(projectId=PROJECT_ID, location=LOCATION, body=BODY)
    response = request.execute()
    return response

Поддерживает ли REST API передачу параметров?Глядя на пример кода, я думаю, что так и должно быть.

Есть предложения?

Сообщение об ошибке:

The workflow could not be created. Causes: (4adc3dbfd180d8a2): Found unexpected parameters: ['messageToPrint' (perhaps you meant 'userAgent')]

Обновление 1:

Пример DoFn:

public static class BuildPathFn extends DoFn<String, Void> {
    private static final long serialVersionUID = -2815123956194177539L;
    private final ValueProvider<String> baseDir; 
    private final ValueProvider<String> year; 
    private final ValueProvider<String> month; 
    private final ValueProvider<String> day; 
    private final ValueProvider<String> hour; 
    private final ValueProvider<String> filePattern; 

    public BuildPathFn (ValueProvider<String> baseDir, ValueProvider<String> year, 
                            ValueProvider<String> month, ValueProvider<String> day, 
                            ValueProvider<String> hour, ValueProvider<String> filePattern) {
        this.baseDir = baseDir;
        this.year = year;
        this.month = month;
        this.day = day;
        this.hour = hour;
        this.filePattern = filePattern;
    }

    @ProcessElement
    public void processElement(@Element String element, OutputReceiver<Void> receiver) {
        try {
            String path = baseDir.get() + "/" + year.get() + "/" + month.get() + "/" + day.get() + "/" + hour.get() + "/" + filePattern.get();
            LOG.info("BuildPathFn >> Path: {}", path);
        } catch (Exception e) {
            LOG.error("BuildPathFn >> Exception: {}", e.getMessage()); 

        }
    }
}

Вывод времени выполнения:

BuildPathFn >> Path: true/true/true/true/true/true

Часть команды mvn, используемая для построения шаблона:

 ".... --baseDir --year --month --day --hour --filePattern"

1 Ответ

0 голосов
/ 12 февраля 2019

Код в порядке, и это правильный способ передачи параметров.Имейте в виду, что параметр должен быть определен в шаблоне как ValueProvider .Когда staging , шаблон не передает параметры, которые вы хотите разрешить во время выполнения.Затем значения параметров должны оцениваться, когда вызывает шаблон с кодом, уже приведенным в описании (т. Е. С использованием parameters внутри тела запроса).

...