在我的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作业对象?
答案 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
)构建期间或之前有一个函数可以应用路径过滤。