2016-08-01 2 views
0

저는 함수형 프로그래밍에 익숙하지 않으며 명령형 프로그래밍 배경이 없습니다. 기본적인 스칼라/스파크 튜토리얼을 온라인으로 실행하고 스파크 제출을 통해 스칼라 애플리케이션을 제출하는 데 어려움이 있습니다.스칼라로 spark-submit에 응용 프로그램 인수를 전달하는 데 문제가 있습니다.

특히 java.lang.ArrayIndexOutOfBounds 0 예외가 발생했습니다.이 예외는 내가 조사한 결과 0 위치의 배열 요소가 범인이라는 것을 알았습니다. 더 자세히 살펴보면, 기본 애플리케이션이 런타임에 인수를 실제로 포착했는지 여부를 알 수있는 기본 디버깅이 있음을 알았습니다. 여기에 코드입니다 :

import org.apache.spark.{SparkConf, SparkContext} 

object SparkMeApp { 
    def main(args: Array[String]) { 

    try { 
     //program works fine if path to file is hardcoded 
     //val logfile = "C:\\Users\\garveyj\\Desktop\\NetSetup.log" 
     val logfile = args(0) 
     val conf = new SparkConf().setAppName("SparkMe Application").setMaster("local[*]") 
     val sc = new SparkContext(conf) 
     val logdata = sc.textFile(logfile, 2).cache() 
     val numFound = logdata.filter(line => line.contains("found")).count() 
     val numData = logdata.filter(line => line.contains("data")).count() 
     println("") 
     println("Lines with found: %s, Lines with data: %s".format(numFound, numData)) 
     println("") 
    } 
    catch { 
     case aoub: ArrayIndexOutOfBoundsException => println(args.length) 
    } 
    } 
} 

를 사용하여 응용 프로그램을 제출하려면 내가 사용하는 불꽃을 제출 : NetSetup.log 내가 신청서를 제출하고있어 곳과 같은 디렉토리에

spark-submit --class SparkMeApp --master "local[*]" --jars target\scala-2.10\firstsparkapplication_2.10-1.0.jar NetSetup.log 

... . 응용 프로그램의 출력은 단순히 : 0 나는 시도/캐치를 제거하는 경우, 출력은 다음과 같습니다

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 
     at SparkMeApp$.main(SparkMeApp.scala:12) 
     at SparkMeApp.main(SparkMeApp.scala) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731) 
     at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181) 
     at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206) 
     at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121) 
     at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 

그것은 내가 인수 및 하드 코드의 경로를 제거하면 응용 프로그램이 잘 실행 지적 가치 로그 파일. 내가 여기서 뭘 놓치고 있는지 모르겠다. 어떤 방향으로도 감사하겠습니다. 미리 감사드립니다!

+0

각주 : 명령 줄에서 파일 이름을 큰 따옴표로 묶어 보았습니다. 아무 소용이 없었습니다. – Jonathan

답변

0

텍스트 파일은 HDFS (HADOOP를 사용하는 경우) 또는 응용 프로그램이 데이터를 읽는 상대 경로를 전달하기 위해 SPARK를 지원하는 데 사용하는 다른 DFS에 있어야합니다. 따라서 응용 프로그램이 작동하도록 DFS에 파일을 저장해야합니다. 그렇지 않으면 OS 파일 시스템의 절대 경로 만 지정하면됩니다.

파일을 HDFS에 추가하는 방법에 대한 지침은 here, 도움이 될만한 내용은 this 관련 토론을 참조하십시오. 또한

, 당신은 두 번 응용 프로그램에서 사용하는 클러스터를 설정하는 :

val conf = new SparkConf().setAppName("SparkMe Application").setMaster("local[*]") 

와의

이 ( --master "local[*]"를) 제출 : 스파크의 conf ( setMaster("local[*]"))에

spark-submit --class SparkMeApp --master "local[*]" --jars target\scala-2.10\firstsparkapplication_2.10-1.0.jar NetSetup.log 

당신 한 번만 해보고 그 중 하나를 선택하십시오.

+1

--jars 플래그는 여러 개의 .jar 파일이나 디렉토리가 쉼표로 구분되어 있다고 생각합니다. 그리고 나서 spark-submit 스크립트는이 경우 NetSetup.log라고 생각하는 응용 프로그램의 jar 파일을 기다리고 있습니다. 따라서 "--jars"플래그를 제거해야합니다. – Marco

+0

spark-submit 작동은 단일 jar가 --jars 매개 변수에 전달되어 벌금이 부과되고 그 인수가 바로 뒤에옵니다. 따라서 spark-submit은 위에서 언급 한 중복 클러스터 설정을 제외하고는 ok입니다. – andriosr

+1

- jars 플래그는 app jar와 함께 클러스터에 전송 될 추가 jar를 추가하는 데 사용됩니다. 이 경우 문제는 "target \ scala-2.10 \ firstsparkapplication_2.10-1.0.jar"이 추가 jar로 사용되고 "NetSetup.log"가 응용 프로그램 jar가됩니다. 응용 프로그램에 대한 인수가 없습니다 – Marco

1

스파크 제출을 잘못하고 있습니다. 실제 명령은 외부 의존성이있는 경우에만 --jars을 통과해야하고 모든 집행에 그 항아리를 배포 할

./spark-submit --class SparkMeApp --master "local[*]" \ 
example.jar examplefile.txt 

입니다.

log4j.properties를 INFO/WARN으로 설정 한 경우 쉽게 포착 할 수 있습니다.

Warning: Local jar /home/user/Downloads/spark-1.4.0/bin/NetSetup.log does not exist, skipping. 
+0

팁 주셔서 감사. 결국 나는 명령에서 '- jars'를 제거하고 치료를했습니다. – Jonathan

+0

호기심에서 - 내가이 모든 것을 처음 접했을 때, 어떻게하면 log4j.properties를 정보/경고 할 수 있습니까? log4j가이를 프로그램 적으로 처리하는 패키지가 있음을 알 수 있습니다 - 더 쉬운 방법이 있습니까? – Jonathan

0

- 문제 해결 - spark-submit 명령을 잘못 사용하고있었습니다. 명령에서 '--jars'를 제거하면 스칼라 응용 프로그램 인수가 spark-submit에 의해 선택되었습니다.

관련 문제