web-dev-qa-db-ja.com

Google CloudDataflowジョブをスケジュールする最も簡単な方法

毎日データフローパイプラインを実行する必要がありますが、Webアプリ全体を構築する必要があるApp Engine CronServiceのような提案されたソリューションは少し多すぎるように思われます。 Compute Engine Linux VMでcronジョブからパイプラインを実行することを考えていましたが、それは単純すぎるかもしれません:)。そのようにすることの問題は何ですか、なぜ誰も(私が推測する以外に)それを提案しないのですか?

13
CCC

Cronジョブを使用してDataflowパイプラインを開始することに何の問題もありません。 JavaまたはPython開発されたパイプラインであるかどうかにかかわらず、本番システムでは常にそれを行います。

ただし、私たちはcronジョブから離れ、AWS Lambdas(マルチクラウドを実行)またはCloudFunctionsのいずれかを使用する方向に進んでいます。残念ながら、Cloud Functions まだスケジュールはありません 。 AWS Lambdas do

4
Graham Polley

FAQその質問への回答: https://cloud.google.com/dataflow/docs/resources/faq#is_there_a_built-in_scheduling_mechanism_to_execute_pipelines_at_given_time_or_interval

  • Google App Engine(Flexible Environmentのみ)またはCloud Functionsを使用して、パイプラインの実行を自動化できます。
  • クラウド内のいくつかのGoogleCloudPlatformオペレーターの1つであるApacheAirflowのDataflowオペレーターを使用できますComposerワークフロー。
  • Compute Engineでカスタム(cron)ジョブプロセスを使用できます。

クラウド関数のアプローチは「アルファ」と呼ばれ、スケジューリングがなく(AWSクラウドウォッチのスケジューリングイベントに相当するものはありません)、Pub/Subメッセージ、クラウドストレージの変更、HTTP呼び出しのみが含まれていることは事実です。

クラウドcomposerは良いオプションのように見えます。事実上、バッジを付け直したApache Airflowは、それ自体が優れたオーケストレーションツールです。cronのように「単純すぎる」わけではありません:)

4
Davos

これは、Cloud Functions、PubSub、およびCloud Schedulerを使用して行った方法です(これは、Dataflowテンプレートが既に作成されており、GCSバケットのどこかに存在することを前提としています)

  1. PubSubで新しいトピックを作成します。これは、クラウド機能をトリガーするために使用されます

  2. テンプレートからDataflowジョブを起動するクラウド関数を作成します。 CFコンソールからこれを作成するのが最も簡単だと思います。選択したサービスアカウントに、データフロージョブを作成する権限があることを確認してください。関数のindex.jsは次のようになります。

const google = require('googleapis');

exports.triggerTemplate = (event, context) => {
  // in this case the PubSub message payload and attributes are not used
  // but can be used to pass parameters needed by the Dataflow template
  const pubsubMessage = event.data;
  console.log(Buffer.from(pubsubMessage, 'base64').toString());
  console.log(event.attributes);

  google.google.auth.getApplicationDefault(function (err, authClient, projectId) {
  if (err) {
    console.error('Error occurred: ' + err.toString());
    throw new Error(err);
  }

  const dataflow = google.google.dataflow({ version: 'v1b3', auth: authClient });

  dataflow.projects.templates.create({
        projectId: projectId,
        resource: {
          parameters: {},
          jobName: 'SOME-DATAFLOW-JOB-NAME',
          gcsPath: 'gs://PATH-TO-YOUR-TEMPLATE'
        }
      }, function(err, response) {
        if (err) {
          console.error("Problem running dataflow template, error was: ", err);
        }
        console.log("Dataflow template response: ", response);
      });
  });
};

Package.jsonは次のようになります

{
  "name": "pubsub-trigger-template",
  "version": "0.0.1",
  "dependencies": {
    "googleapis": "37.1.0",
    "@google-cloud/pubsub": "^0.18.0"
  }
}
  1. PubSubと作成したトピックに移動し、手動でメッセージをパブリッシュします。これにより、Cloud Functionがトリガーされ、Dataflowジョブが開始されます。

  2. Cloud Schedulerを使用してスケジュールどおりにPubSubメッセージを公開します https://cloud.google.com/scheduler/docs/tut-pub-sub

3
twang

クラウドスケジューラを使用して、ジョブをスケジュールすることもできます。私の投稿を見る

https://medium.com/@zhongchen/schedule-your-dataflow-batch-jobs-with-cloud-scheduler-8390e0e958eb

Terraformスクリプト

data "google_project" "project" {}
resource "google_cloud_scheduler_job" "scheduler" {
  name = "scheduler-demo"
  schedule = "0 0 * * *"
  # This needs to be us-central1 even if the app engine is in us-central.
  # You will get a resource not found error if just using us-central.
  region = "us-central1"

  http_target {
    http_method = "POST"
    uri = "https://dataflow.googleapis.com/v1b3/projects/${var.project_id}/locations/${var.region}/templates:launch?gcsPath=gs://zhong-gcp/templates/dataflow-demo-template"
    oauth_token {
      service_account_email = google_service_account.cloud-scheduler-demo.email
    }

    # need to encode the string
    body = base64encode(<<-EOT
    {
      "jobName": "test-cloud-scheduler",
      "parameters": {
        "region": "${var.region}",
        "autoscalingAlgorithm": "THROUGHPUT_BASED",
      },
      "environment": {
        "maxWorkers": "10",
        "tempLocation": "gs://zhong-gcp/temp",
        "zone": "us-west1-a"
      }
    }
EOT
    )
  }
}
0
Zhong Chen