【问题标题】:Reducer task is not being invoked in my MapReduce job在我的 MapReduce 作业中没有调用 Reducer 任务
【发布时间】:2017-07-28 17:26:33
【问题描述】:

这是一个字数地图减少工作。我有自己的 InputFormat。

作业执行者:

val job = new Job(new Configuration())

job.setMapperClass(classOf[CountMapper])
job.setReducerClass(classOf[CountReducer])

job.setJobName("tarun-test-1")
job.setInputFormatClass(classOf[MyInputFormat])
FileInputFormat.setInputPaths(job, new Path(args(0)))
FileOutputFormat.setOutputPath(job, new Path(args(1)))

job.setOutputKeyClass(classOf[Text])
job.setOutputValueClass(classOf[LongWritable])

job.setNumReduceTasks(1)

println("status: " + job.waitForCompletion(true))

映射器:

class CountMapper extends Mapper[LongWritable, Text, Text, LongWritable] {

    private val valueOut = new LongWritable(1L)

    override def map(k: LongWritable, v: Text, context: Mapper[LongWritable, Text, Text, LongWritable]#Context): Unit = {
        val str = v.toString
        str.split(",").foreach(word => {
            val keyOut = new Text(word.toLowerCase.trim)
            context.write(keyOut, valueOut)
        })
    }
}

减速机:

class CountReducer extends Reducer[Text, LongWritable, Text, LongWritable] {

    override def reduce(k: Text, values: Iterable[LongWritable], context: Reducer[Text, LongWritable, Text, LongWritable]#Context): Unit = {
        println("Inside reduce method..")
        val valItr = values.iterator()
        var sum = 0L
        while (valItr.hasNext) {
            sum = sum + valItr.next().get()
        }

        context.write(k, new LongWritable(sum))
        println("done reducing.")
    }
}

正在调用 Mapper,并且 RecordReader 正在根据日志正确读取拆分。但是,reducer 没有被调用。

【问题讨论】:

  • 你有自己的 InputFormat 是什么意思?它在哪里?你是什​​么意思减少没有被调用?你怎么知道?任何输入/输出?计数器?错误?日志?
  • MyInputFormat 是我自己的 InputFormat。 InputFormat 按预期工作,我看到 RecordReader 正在正确读取映射器的输入(键、值)。我在 Map 任务中添加了日志记录,它正在按预期记录事情。但是,reduce 日志不打印,最终状态为 false。

标签: scala hadoop mapreduce


【解决方案1】:

尝试设置: job.mapOutputKeyClass 和 job.MapOutputValueClass 。

【讨论】:

  • 如果 OutputKeyClass 和 OutputValueClass 相同,则 MapOutputKeyClass 和 MapOutputValueClass 不是必需的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多