如何仅在烫伤工作结束时执行一次操作?

时间:2015-03-24 10:02:51

标签: scala hadoop cascading scalding

我在scalding groupAll个文档中读到了

   /**
    * Group all tuples down to one reducer.
    * (due to cascading limitation).
    * This is probably only useful just before setting a tail such as Database
    * tail, so that only one reducer talks to the DB.  Kind of a hack.
    */
    def groupAll: Pipe = groupAll { _.pass }

这让我有充分的理由相信,如果我pipe我的结束write导致statusUpdater管道刚刚更新某个数据库,我的工作成功完成,那么它将被执行一次工作完成后,我在

中尝试了

以下代码示例:

import Dsl._
somepipe
  .addCount
  .toPipe(outputSchema)
  .write(Tsv(outputPath, outputSchema, writeHeader = true))(flowDef, mode)
  .groupAll.updateResultStatus

  implicit class StatusResultsUpdater(pipe: Pipe) {
    def updateResultStatus: Pipe = {
      println("DO THIS ONCE AFTER JOB COMPLETES!") // was printed even before the job ended! how to have it print only when job ends!?
      pipe
    }
  }

根据我使用groupAll的文档,然后updateResultStatus应该只在作业结束后运行一次,为什么我会看到它在作业结束前已经打印了语句?我错过了什么吗?我该怎么办呢?

1 个答案:

答案 0 :(得分:4)

Scalding作业中的执行顺序有点棘手:

  1. 执行Job类中的初始化程序语句并构建操作树(连接管道,分接头等)。
  2. 树被移交给优化器。执行计划已创建
  3. 作业开始执行。 Hadoop工作'根据计划启动Map和Reduce步骤
  4. 主程序等待所有内容完成并退出。
  5. 根据您的代码,println语句将在步骤1执行。