是否可以从Scalding作业访问底层的org.apache.hadoop.mapreduce.Job?

时间:2016-05-05 10:36:55

标签: hadoop amazon-web-services elastic-map-reduce cascading scalding

在我的Scalding工作中,我有这样的代码:

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat

class MyJob(args: Args) extends Job(args) {
  FileInputFormat.setInputPathFilter(???, classOf[MyFilter])
  // ... rest of job ...
}

class MyFilter extends PathFilter {
  def accept(path:Path): Boolean = true
}

我的问题是FileInputFormat.setInputPathFilter方法的第一个参数需要是org.apache.hadoop.mapreduce.Job类型。如何在我的Scalding作业中访问Hadoop作业对象?

1 个答案:

答案 0 :(得分:0)

声明

无法提取Job课程。但你可以(但绝不应该这样做!)提取JobConf。之后,您将能够使用mapreduce.v1 API(FileInputFormat.setInputPathFilter)中的org.apache.hadoop.mapred.JobConf,这将允许存档过滤。

但我建议你不要这样做。阅读答案的结尾,

你怎么能这样做?

覆盖stepStrategy的{​​{1}}方法以实施scalding.Job。例如,此实现允许更改mapreduce作业的名称

FlowStepStrategy

为什么不应该这样做?

访问JobConf以添加路径过滤仅在您使用特定源时才有效,如果您正在使用其他源,则会中断。您还将混合不同级别的抽象。而且我还没开始你怎么想知道你实际需要修改什么JobConf(我看到的大多数烫伤工作是多步骤的)

如何解决这个问题?

我建议您仔细查看您正在使用的override def stepStrategy: Option[FlowStepStrategy[_]] = Some(new FlowStepStrategy[AnyRef]{ override def apply(flow: Flow[AnyRef], predecessorSteps: util.List[FlowStep[AnyRef]], step: FlowStep[AnyRef]): Unit = step.getConfig match { case conf: JobConf => # here you can modify the JobConf of each job. conf.setJobName(...) case _ => } }) 类型。我非常确定在Source(或Pipe)构建期间或之前有一个函数可以应用路径过滤。