복붙노트

[HADOOP] Scala 2.9.0에서 Hadoop Mapper를 어떻게 구현합니까?

HADOOP

Scala 2.9.0에서 Hadoop Mapper를 어떻게 구현합니까?

2.8.1에서 Scala 2.9.0으로 마이그레이션 할 때 Hadoop 매퍼를 제외한 모든 코드가 작동했습니다. 그 동안 래퍼 객체가 있었기 때문에 다음 예제로 넘어갔습니다.

import org.apache.hadoop.mapreduce.{Mapper, Job}


object MyJob {
  def main(args:Array[String]) {
    val job = new Job(new Configuration())
    job.setMapperClass(classOf[MyMapper])

  }
}

class MyMapper extends Mapper[LongWritable,Text,Text,Text] {
  override def map(key: LongWritable, value: Text, context: Mapper[LongWritable,Text,Text,Text]#Context) {

  }
}

2.8.1에서이 코드를 실행하면 매우 잘 돌아갑니다 (2.8.1에서는 많은 프로덕션 코드가 있고 2.9.0에서는 다음과 같은 컴파일 오류가 발생합니다 :

error: type mismatch;
found   : java.lang.Class[MyMapper](classOf[MyMapper])
required: java.lang.Class[_ <: org.apache.hadoop.mapreduce.Mapper]
job.setMapperClass(classOf[MyMapper])

실패한 호출은 작업 객체에서 setMapperClass를 호출 할 때 발생합니다. 이 메소드의 정의는 다음과 같습니다.

public void setMapperClass(java.lang.Class<? extends org.apache.hadoop.mapreduce.Mapper> cls) throws java.lang.IllegalStateException { /* compiled code */ }

Mapper 클래스 자체의 정의는 다음과 같습니다.

public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>

누구든지 내가 뭘 잘못하고 있는지 감각이 있습니까? MyMapper는 Mapper를 확장하고 메서드는 Mapper를 확장하는 무언가를 원합니다. 그리고 그것은 2.8.1에서 훌륭하게 작동합니다 ...

해결법

  1. ==============================

    1.어리석은 것처럼 보이기 전에 작업 전에 매퍼를 정의하여 문제를 해결할 수 있습니다. 다음 컴파일 :

    어리석은 것처럼 보이기 전에 작업 전에 매퍼를 정의하여 문제를 해결할 수 있습니다. 다음 컴파일 :

    import org.apache.hadoop._
    import org.apache.hadoop.io._
    import org.apache.hadoop.conf._
    import org.apache.hadoop.mapreduce._
    
    class MyMapper extends Mapper[LongWritable,Text,Text,Text] {
      override def map(key: LongWritable, value: Text, context: Mapper[LongWritable,Text,Text,Text]#Context) {
      }
    }
    
    object MyJob {
      def main(args:Array[String]) {
        val job = new Job(new Configuration())
        job.setMapperClass(classOf[MyMapper])
      }
    }
    
  2. from https://stackoverflow.com/questions/6028221/how-does-one-implement-a-hadoop-mapper-in-scala-2-9-0 by cc-by-sa and MIT license