如何从 Cloud Function 运行创建 Dataproc 集群、运行作业、删除集群

Posted

技术标签:

【中文标题】如何从 Cloud Function 运行创建 Dataproc 集群、运行作业、删除集群【英文标题】:How can I run create Dataproc cluster, run job, delete cluster from Cloud Function 【发布时间】:2018-05-15 21:14:48 【问题描述】:

我想启动 Dataproc 作业以响应到达 GCS 存储桶的日志文件。我也不想让持久集群保持运行,因为新的日志文件每天只到达几次,而且大部分时间都是空闲的。

【问题讨论】:

【参考方案1】:

此处提供本教程的更新版本:https://cloud.google.com/dataproc/docs/tutorials/workflow-function

我可以使用WorkflowTemplate API 为我管理集群生命周期。使用 Dataproc 工作流,我不必轮询要创建的集群、创建的作业或执行任何错误处理。

这是我的云函数。设置为Cloud Storage bucket 以触发Finalize/Create 事件:

index.js:

exports.startWorkflow = (event, callback) => 

  const 
    google
   = require('googleapis');

  const region = 'global'
  const zone = 'us-central1-a'
  const clusterName = 'my-cluster'

  const file = event.data;
  console.log("Event: ", file);

  if (!file.name) 
    throw "Skipped processing file!";
  

  const queryFileUri = "gs://" + file.bucket + "/" + file.name

  console.log("Creating auth client: ");
  google.auth.getApplicationDefault(
    (err, authClient, projectId) => 
      if (authClient.createScopedRequired && authClient.createScopedRequired()) 
        authClient = authClient.createScoped([
          'https://www.googleapis.com/auth/cloud-platform',
          'https://www.googleapis.com/auth/userinfo.email'
        ]);
      

      const request = 
        parent: "projects/" + projectId + "/regions/" + region,
        resource: 
          "placement": 
            "managedCluster": 
              "clusterName": clusterName,
              "config": 
                "gceClusterConfig": 
                  "zoneUri": zone, // Can be omitted if using regional endpoint (like us-central1-a, not global)
                
              
            
          ,
          "jobs": [
            "stepId": "step1",
            "pigJob": 
              "queryFileUri": queryFileUri,
            ,
            "prerequisiteStepIds": [],
          ]
        
      ;

      const dataproc = google.dataproc(
        version: 'v1beta2',
        auth: authClient
      );
      dataproc.projects.regions.workflowTemplates.instantiateInline(
        request, (err, result) => 
          if (err) 
            throw err;
          
          console.log(result);
          callback();
        );
    );
;

确保将 Function to Execute 设置为 startWorkflow

package.json:


  "name": "dataproc-workflow",
  "version": "1.0.0",
  "dependencies": "googleapis": "30.0.0"

【讨论】:

【参考方案2】:

您可以将来自 shell 脚本或 Docker RUN 命令的 GCLOUD 命令放在下面:

    预配 Dataproc 集群 执行 Spark 作业

    删除 Dataproc 集群(注意要删除的 --quite 或 -q 选项)

    Provision Dataproc 集群:(需要 5 分钟以上)

    gcloud dataproc 集群创建 devops-poc-dataproc-cluster --subnet 默认 --zone us-central1-a --master-machine-type n1-standard-1 --master-boot-disk-size 200 -- num-workers 2 --worker-machine-type n1-standard-2 --worker-boot-disk-size 200 --image-version 1.3-deb9 --project gcp-project-212501 --service-account=service- id1@gcp-project-212501.iam.gserviceaccount.com

    提交 Spark 作业:

    sleep 60 && gcloud dataproc 作业提交 pyspark /dev_app/spark_poc/wordCountSpark.py --cluster=devops-poc-dataproc-cluster -- gs://gcp-project-212501-docker_bucket/input/ gs:// gcp-project-212501-docker_bucket/输出/

    删除 Dataproc 集群:

    gcloud dataproc 集群删除 -q devops-poc-dataproc-cluster

【讨论】:

以上是关于如何从 Cloud Function 运行创建 Dataproc 集群、运行作业、删除集群的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 Cloud Function node.js10 中的 Secret Manager?

从 App Engine 运行时 Python 3.7 调用 Cloud Function [重复]

如何从 Cloud Function 调用其他 Cloud Firebase Functions

从 Cloud Function 本身获取 Cloud Function 名称

如何在 Python 中运行 Google Cloud Function 中的子进程

如何从 Cloud Function 获取 Firebase 项目名称或 ID