spark streaming submit하다가 다음과 같은 에러가 발생할 때가 있었다. 


The main method in the given main class must be static



https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala#L723



  val mainMethod = mainClass.getMethod("main", new Array[String](0).getClass)

   if (!Modifier.isStatic(mainMethod.getModifiers)) {

      throw new IllegalStateException("The main method in the given main class must be static")

   }



분명 spark은 scala여서 static이 없는데, 왜 이게 발생한 걸까?


내가 만든 코드에는 문제가 없어 보였다. 


http://docs.scala-lang.org/ko/tutorials/scala-for-java-programmers.html



  1. object HelloWorld {
  2. def main(args: Array[String]) {
  3. println("Hello, world!")
  4. }
  5. }

똑똑한 독자들은 이미 눈치챘겠지만 위의 예제에서 main 함수는 static이 아니다. Scala에는 정적 멤버(함수든 필드든)라는 개념이 아얘 존재하지 않는다. 클래스의 일부로 정적 멤버를 정의하는 대신에 Scala 프로그래머들은 정적이기 원하는 멤버들을 싱글턴 객체안에 선언한다.




아....


결국은 class로 정의한 클래스를 spark submit하다가 발생한 문제였다. 스칼라에서는 static 이라는 reserved word가 없지만, object는 내부적으로 생성한다.그래서 scala 코드에서 확인한 것이었다. 



class 를 object로 변경하니 제대로 동작한다. 


Posted by '김용환'
,