毎日データフローパイプラインを実行する必要がありますが、Webアプリ全体を構築する必要があるApp Engine CronServiceのような提案されたソリューションは少し多すぎるように思われます。 Compute Engine Linux VMでcronジョブからパイプラインを実行することを考えていましたが、それは単純すぎるかもしれません:)。そのようにすることの問題は何ですか、なぜ誰も(私が推測する以外に)それを提案しないのですか?
Cronジョブを使用してDataflowパイプラインを開始することに何の問題もありません。 JavaまたはPython開発されたパイプラインであるかどうかにかかわらず、本番システムでは常にそれを行います。
ただし、私たちはcronジョブから離れ、AWS Lambdas(マルチクラウドを実行)またはCloudFunctionsのいずれかを使用する方向に進んでいます。残念ながら、Cloud Functions まだスケジュールはありません 。 AWS Lambdas do 。
- Google App Engine(Flexible Environmentのみ)またはCloud Functionsを使用して、パイプラインの実行を自動化できます。
- クラウド内のいくつかのGoogleCloudPlatformオペレーターの1つであるApacheAirflowのDataflowオペレーターを使用できますComposerワークフロー。
- Compute Engineでカスタム(cron)ジョブプロセスを使用できます。
クラウド関数のアプローチは「アルファ」と呼ばれ、スケジューリングがなく(AWSクラウドウォッチのスケジューリングイベントに相当するものはありません)、Pub/Subメッセージ、クラウドストレージの変更、HTTP呼び出しのみが含まれていることは事実です。
クラウドcomposerは良いオプションのように見えます。事実上、バッジを付け直したApache Airflowは、それ自体が優れたオーケストレーションツールです。cronのように「単純すぎる」わけではありません:)
これは、Cloud Functions、PubSub、およびCloud Schedulerを使用して行った方法です(これは、Dataflowテンプレートが既に作成されており、GCSバケットのどこかに存在することを前提としています)
PubSubで新しいトピックを作成します。これは、クラウド機能をトリガーするために使用されます
テンプレートから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"
}
}
PubSubと作成したトピックに移動し、手動でメッセージをパブリッシュします。これにより、Cloud Functionがトリガーされ、Dataflowジョブが開始されます。
Cloud Schedulerを使用してスケジュールどおりにPubSubメッセージを公開します https://cloud.google.com/scheduler/docs/tut-pub-sub
クラウドスケジューラを使用して、ジョブをスケジュールすることもできます。私の投稿を見る
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
)
}
}