【问题标题】:Managed Dataproc cluster terminates all the jobs if one job fails如果一项作业失败,托管 Dataproc 集群将终止所有作业
【发布时间】:2020-03-04 00:51:29
【问题描述】:

我正在尝试在托管 DataProc 集群上运行猪作业。我有几个并行运行的独立猪作业。我已将每个作业的 continueOnFailure 设置为 true。现在,如果其中一项作业失败,则所有其他作业都将停止并终止集群。我不希望这样,我希望终止失败的作业并让其他作业按预期运行。

我实例化的yaml文件如下:

jobs:
- pigJob:
    continueOnFailure: true
    queryList:
      queries:
      - sh pqr.sh
  stepId: run-pig-pqr
- pigJob:
    continueOnFailure: true
    queryList:
      queries:
      - sh abc.sh
  stepId: run-pig-abc

placement:
  managedCluster:
    clusterName: batch-job
    config:
      gceClusterConfig:
        zoneUri: asia-south1-a
      masterConfig:
        machineTypeUri: n1-standard-8
        diskConfig:
          bootDiskSizeGb: 50
      workerConfig:
        machineTypeUri: n2-highcpu-64
        numInstances: 2
        diskConfig:
          bootDiskSizeGb: 50
      softwareConfig:
        imageVersion: 1.4-ubuntu18

我正在使用命令创建集群

gcloud dataproc workflow-templates instantiate-from-file --file $file-name.yaml

我在我的 yaml 中提供了任何错误的配置?

【问题讨论】:

    标签: google-cloud-dataproc


    【解决方案1】:

    continueOnFailure 标志似乎在 Pig 中按预期工作:对于某些类型的故障,解释器将忽略故障并继续运行。但是,pig 驱动程序仍然以非零错误代码退出,导致 Dataproc 作业失败,然后 Workflow 将取消所有作业并删除集群。

    由于您使用的是 shell 命令,因此您可以捕获 exit 并将其替换为代码 0:

    function finish {
        exit 0
    }
    trap finish ERR
    

    我还鼓励您提交功能请求,以添加更好的切换来处理错误,作为工作流程的一部分: https://issuetracker.google.com/issues/new?component=187133&template=0

    【讨论】:

    • 如果我手动创建集群而不是托管集群并添加失败的相同脚本,那么 continueOnFailure 工作正常。我不认为这个错误与猪驱动程序有关。此外,如果我捕获退出并将其替换为 0,那么我将如何知道脚本是否有效。我必须经常去检查所有工作的日志。
    • 当我直接提交一个使用失败脚本的猪作业时,我仍然得到一个失败的作业。 --continue-on-failure 标志仅对某些 pig 加载/存储命令有效;它不会影响sh 命令。
    • 澄清一下,continueOnFailure 仅适用于单个 Pig 脚本中的行——它不适用于在 Dataproc 工作流中失败时其他 Pig 脚本的延续。提交作为独立作业集合的工作流的能力,即使某些作业失败,工作流的其余部分也会继续,这听起来像是一个很好的功能请求——公共 Dataproc 问题跟踪器可以在 cloud.google.com/support/docs/issue-trackers 找到
    • 同时,所需的行为可以通过Dataproc Cluster Scheduled Deletion 使用--max-idle 最接近地近似,并且只需使用CreateCluster API 创建集群并将作业直接独立地提交到该集群。
    【解决方案2】:

    在这种情况下可能不明显的澄清点是continueOnFailure 参数具体是 PigJob 参数,而不是 Dataproc Workflow 参数;例如,您也会在 HiveJob 上看到它,但在工作流中的其他 Dataproc 作业类型上看不到。因此,在这种情况下,continueOnFailure1 仅适用于在单个 PigJob 中运行的单独命令的行为,而不是设置多个 PigJobs 在共享 Dataproc 工作流中的行为方式。

    目前,很遗憾,Dataproc Workflows 不支持用于指定当工作流中的单个作业失败时是否继续工作流的其余部分的控件;相反,当前行为假定所有作业都有望成功,否则工作流将中止。

    正如您所指出的,这显然不是支持所有工作流用例的完整故事。正如 cmets 中提到的,这将是一个很好的功能请求,可以在 https://cloud.google.com/support/docs/issue-trackers 下提交

    与此同时,如果您不想手动管理多个作业以知道在最后一个作业完成时何时拆除集群,那么使用 Dataproc Cluster Scheduled Deletion 可能是最接近您想要的。虽然您必须在提交作业之前同步等待集群创建完成,但您可以在作业上使用--async,而不必在提交所有作业之前轮询每个作业:

    gcloud dataproc clusters create --max-idle=10m ${CLUSTER_NAME}
    gcloud dataproc jobs submit pig --async --cluster ${CLUSTER_NAME} -e 'sh pqr.sh' 
    gcloud dataproc jobs submit pig --async --cluster ${CLUSTER_NAME} -e 'sh abc.sh'
    

    只有当您的作业运行时间比 10 分钟的最小空闲 TTL 长得多时,这才会真正有效。

    【讨论】:

      猜你喜欢
      • 2017-10-06
      • 2017-11-22
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多