Java 如何以编程方式从workers中终止Beam数据流作业

Java 如何以编程方式从workers中终止Beam数据流作业,java,google-cloud-dataflow,apache-beam,Java,Google Cloud Dataflow,Apache Beam,我想使用JavaBeamSDK从工作节点以编程方式终止ApacheBeam作业。 理想情况下,我希望此解决方案独立于运行程序,但即使是特定于DataflowRunner的解决方案也可以 我不想使用关机挂钩,我正在寻找beam API支持的东西 我找到的最接近我想要的是org.apache.beam.runners.dataflow.util.MonitoringUtil::getGcloudCancelCommand。但是,这只是返回一个字符串,其中包含取消作业所需运行的命令。它不会从JVM中取

我想使用JavaBeamSDK从工作节点以编程方式终止ApacheBeam作业。 理想情况下,我希望此解决方案独立于运行程序,但即使是特定于DataflowRunner的解决方案也可以

我不想使用关机挂钩,我正在寻找beam API支持的东西


我找到的最接近我想要的是
org.apache.beam.runners.dataflow.util.MonitoringUtil::getGcloudCancelCommand
。但是,这只是返回一个字符串,其中包含取消作业所需运行的命令。它不会从JVM中取消作业。

有两个可能的命令可用于停止数据流作业:
Cancel
Drain
。您可以通过使用Dataflow监视接口或Dataflow命令行接口发出命令来执行此操作。请参阅

此外,您还可以检查
projects.locations.jobs.update
以更新现有数据流作业的状态

使用Rest更新方法,通过此正文,可以在以下内容中找到更多信息:


此外,我真的建议你寻找线程。我希望它有帮助。

有两个可能的命令可以用来停止数据流作业:
取消
排放
。您可以通过使用Dataflow监视接口或Dataflow命令行接口发出命令来执行此操作。请参阅

此外,您还可以检查
projects.locations.jobs.update
以更新现有数据流作业的状态

使用Rest更新方法,通过此正文,可以在以下内容中找到更多信息:

此外,我真的建议你寻找线程。我希望这会有所帮助。

从DoFn.ProcessElement中终止(排空)作业:

import java.io.IOException;

import com.google.api.services.dataflow.model.Job;

import org.apache.beam.runners.dataflow.DataflowClient;
import org.apache.beam.runners.dataflow.options.DataflowPipelineOptions;
import org.apache.beam.runners.dataflow.options.DataflowWorkerHarnessOptions;
import org.apache.beam.sdk.options.PipelineOptions;
import org.apache.beam.sdk.transforms.DoFn;

class DrainDoFn<S, T> extends DoFn<S, T> {
    private static final long serialVersionUID = 1L;

    @ProcessElement
    public void processElement(ProcessContext pc) throws IOException {
        PipelineOptions options = pc.getPipelineOptions();
        DataflowPipelineOptions dpOptions =
            options.as(DataflowPipelineOptions.class);

        DataflowWorkerHarnessOptions dwhOptions =
            options.as(DataflowWorkerHarnessOptions.class);

        String jobId = dwhOptions.getJobId();
        DataflowClient dataflowClient = DataflowClient.create(dpOptions);
        Job jobDescription = dataflowClient.getJob(jobId);
        jobDescription.setRequestedState("JOB_STATE_DRAINING");
        dataflowClient.updateJob(jobId, jobDescription);
    }
}
import java.io.IOException;
导入com.google.api.services.dataflow.model.Job;
导入org.apache.beam.runners.dataflow.DataflowClient;
导入org.apache.beam.runners.dataflow.options.DataflowPipelineOptions;
导入org.apache.beam.runners.dataflow.options.dataflowworkerharnesspoptions;
导入org.apache.beam.sdk.options.PipelineOptions;
导入org.apache.beam.sdk.transforms.DoFn;
类DrainDoFn扩展了DoFn{
私有静态最终长serialVersionUID=1L;
@过程元素
public void processElement(ProcessContext pc)引发IOException{
PipelineOptions=pc.getPipelineOptions();
数据流管线选项dpOptions=
options.as(DataflowPipelineOptions.class);
DataflowWorkerHarnessOptions数据流=
options.as(dataflowworkerharnesspoptions.class);
字符串jobId=dwhOptions.getJobId();
DataflowClient DataflowClient=DataflowClient.create(dpOptions);
Job jobDescription=dataflowClient.getJob(jobId);
jobDescription.setRequestedState(“作业状态”);
dataflowClient.updateJob(作业ID、作业描述);
}
}
从DoFn.ProcessElement中终止(排空)作业:

import java.io.IOException;

import com.google.api.services.dataflow.model.Job;

import org.apache.beam.runners.dataflow.DataflowClient;
import org.apache.beam.runners.dataflow.options.DataflowPipelineOptions;
import org.apache.beam.runners.dataflow.options.DataflowWorkerHarnessOptions;
import org.apache.beam.sdk.options.PipelineOptions;
import org.apache.beam.sdk.transforms.DoFn;

class DrainDoFn<S, T> extends DoFn<S, T> {
    private static final long serialVersionUID = 1L;

    @ProcessElement
    public void processElement(ProcessContext pc) throws IOException {
        PipelineOptions options = pc.getPipelineOptions();
        DataflowPipelineOptions dpOptions =
            options.as(DataflowPipelineOptions.class);

        DataflowWorkerHarnessOptions dwhOptions =
            options.as(DataflowWorkerHarnessOptions.class);

        String jobId = dwhOptions.getJobId();
        DataflowClient dataflowClient = DataflowClient.create(dpOptions);
        Job jobDescription = dataflowClient.getJob(jobId);
        jobDescription.setRequestedState("JOB_STATE_DRAINING");
        dataflowClient.updateJob(jobId, jobDescription);
    }
}
import java.io.IOException;
导入com.google.api.services.dataflow.model.Job;
导入org.apache.beam.runners.dataflow.DataflowClient;
导入org.apache.beam.runners.dataflow.options.DataflowPipelineOptions;
导入org.apache.beam.runners.dataflow.options.dataflowworkerharnesspoptions;
导入org.apache.beam.sdk.options.PipelineOptions;
导入org.apache.beam.sdk.transforms.DoFn;
类DrainDoFn扩展了DoFn{
私有静态最终长serialVersionUID=1L;
@过程元素
public void processElement(ProcessContext pc)引发IOException{
PipelineOptions=pc.getPipelineOptions();
数据流管线选项dpOptions=
options.as(DataflowPipelineOptions.class);
DataflowWorkerHarnessOptions数据流=
options.as(dataflowworkerharnesspoptions.class);
字符串jobId=dwhOptions.getJobId();
DataflowClient DataflowClient=DataflowClient.create(dpOptions);
Job jobDescription=dataflowClient.getJob(jobId);
jobDescription.setRequestedState(“作业状态”);
dataflowClient.updateJob(作业ID、作业描述);
}
}

Muscat,谢谢您的回答。这封信给我指明了正确的方向。但它没有回答我的问题,所以我投了赞成票,但我不能接受它作为答案。马斯喀特,谢谢你的回答。这封信给我指明了正确的方向。虽然它没有回答我的问题,所以我投了赞成票,但我不能接受它作为答案。谢谢分享。我用了这个,它的工作正如预期。谢谢分享这个。我用了这个,它的工作如预期。