从代码

时间:2017-02-09 14:56:56

标签: akka apache-flink

我处于我想要从代码中停止/取消flink作业的情况。这是在我的集成测试中,我正在向flink工作提交任务并检查结果。当作业以异步方式运行时,即使测试失败/通过也不会停止。我想在测试结束后停止工作。

我尝试了一些我在下面列出的内容:

  1. 获得职位经理
  2. 获得正在运行的工作
  3. 对于每个正在运行的作业,向作业管理员发送取消请求
  4. 这当然没有运行,但我不确定jobmanager actorref是错还是缺少其他东西。

    我得到的错误是:[flink-akka.actor.default-dispatcher-5] [akka:// flink / user / jobmanager_1]消息[org.apache.flink.runtime.messages.JobManagerMessages $ RequestRunningJobsStatus $]从演员[akka:// flink / temp / $ a]到演员[akka:// flink / user / jobmanager_1]未送达。 [1]遇到死信。可以使用配置设置关闭或调整此日志记录' akka.log-dead-letters'和' akka.log-dead-letters-during-shutdown'

    表示作业管理器actor ref错误或发送给它的消息不正确。

    代码如下所示:

    val system = ActorSystem("flink", ConfigFactory.load.getConfig("akka")) //I debugged to get this path
     val jobManager = system.actorSelection("/user/jobmanager_1") //also got this akka path by debugging and getting the jobmanager akka url
    val responseRunningJobs = Patterns.ask(jobManager, JobManagerMessages.getRequestRunningJobsStatus, new FiniteDuration(10000, TimeUnit.MILLISECONDS))
        try {
          val result = Await.result(responseRunningJobs, new FiniteDuration(5000, TimeUnit.MILLISECONDS))
          if(result.isInstanceOf[RunningJobsStatus]){
            val runningJobs = result.asInstanceOf[RunningJobsStatus].getStatusMessages()
            val itr = runningJobs.iterator()
            while(itr.hasNext){
              val jobId = itr.next().getJobId
              val killResponse = Patterns.ask(jobManager, new CancelJob(jobId), new Timeout(new FiniteDuration(2000, TimeUnit.MILLISECONDS)));
              try {
                Await.result(killResponse, new FiniteDuration(2000, TimeUnit.MILLISECONDS))
              }
              catch {
                case e : Exception =>"Canceling the job with ID " + jobId + " failed." + e
              }
    
            }
          }
        }
        catch{
          case e : Exception => "Could not retrieve running jobs from the JobManager." + e
        }
    
      }
    

    有人可以检查这是否是正确的方法?

    编辑: 要完全停止作业,必须先按TaskManager的顺序停止TaskManager和JobManager,然后再按JobManager停止。

1 个答案:

答案 0 :(得分:3)

您正在创建新的ActorSystem,然后尝试在同一个actor系统中找到名为/user/jobmanager_1的actor。这不会奏效,因为实际的职位经理将以不同的ActorSystem运行。

如果您想获得真正的职业经理ActorRef,您必须使用相同的ActorSystem进行选择(然后您可以使用本地地址)或者您已找到作业管理员演员的远程地址。远程地址的格式为akka.tcp://flink@[address_of_actor_system]/user/jobmanager_[instance_number]。如果您有权访问FlinkMiniCluster,则可以使用leaderGateway承诺获取当前领导者ActorGateway