2017-12-17 12 views
0

spark-submit과 내부 REST API를 모두 사용하여 Spark 어플리케이션을 실행하는 데 문제가 있습니다. 필자가 시연하고자하는 배포 시나리오는 로컬 랩톱에서 클러스터로 실행되는 Spark입니다.컨테이너 클러스터에 Apache Spark 어플리케이션을 제출하는 중 문제가 발생했습니다.

이 목적을 위해 필자는 spark-master 및 spark-worker 용 Docker 컨테이너를 두 개 만들었습니다. 그 끝의 모든 것이 작동하고있는 것으로 보이며 작업자는 마스터에 등록 할 수 있으며 두 웹 콘솔을 모두 사용할 수 있으며 내부 REST (포트 6066) API가 응답합니다.

내 응용 프로그램에 대한 uber 항아리를 만들었지 만, 두 경우 모두 동일한 오류가 발생합니다.

$SPARK_HOME/bin/spark-submit \ 
    --class com.reynoldsm88.jobs.SparkApp \ 
    --master spark://localhost:7077 \ 
    --deploy-mode cluster \ 
    --supervise \ 
    /Users/reynoldsm88/workspace/spark-app/spark-app/target/scala-2.11/spark-app-assembly-0.0.1-SNAPSHOT.jar 

나머지 API를 사용하여, 내 요청은 다음과 같습니다 :

curl -X POST http://localhost:6066/v1/submissions/create --header "Content-Type:application/json;charset=UTF-8" --data '{ 
    "action" : "CreateSubmissionRequest", 
    "appArgs" : [ "myAppArgument1" ], 
    "appResource" : "/Users/reynoldsm88/workspace/spark-app/spark-app/target/scala-2.11/spark-app-assembly-0.0.1-SNAPSHOT.jar", 
    "clientSparkVersion" : "2.2.0", 
     "environmentVariables" : { 
     "SPARK_ENV_LOADED" : "1" 
    }, 
    "mainClass" : "com.reynoldsm88.jobs.SparkApp", 
    "sparkProperties" : { 
     "spark.master" : "spark://localhost:7077", 
     "spark.jars" : "/Users/reynoldsm88/workspace/spark-app/spark-app/target/scala-2.11/spark-app-assembly-0.0.1-SNAPSHOT.jar", 
     "spark.driver.supervise" : "false", 
     "spark.app.name" : "MyJob", 
     "spark.eventLog.enabled": "true", 
     "spark.submit.deployMode" : "client" 
    } 
}' 

불꽃 제출하여, 나는 컨테이너에 제출 내 로컬에서 로컬 스파크 설치를 사용

,617 (도커 용기 내부)

스파크 마스터 :

모두에 대한 결과는 동일하다 (별도의 부두 노동자 컨테이너 내부)

17/12/17 16:08:23 INFO Master: Driver submitted org.apache.spark.deploy.worker.DriverWrapper 17/12/17 16:08:23 INFO Master: Launching driver driver-20171217160823-0001 on worker worker-20171217155536-172.17.0.5-7078 17/12/17 16:08:24 INFO Master: Removing driver: driver-20171217160823-0001 

스파크 근무

17/12/17 16:08:24 INFO Worker: Asked to launch driver driver-20171217160823-0001 
17/12/17 16:08:24 INFO DriverRunner: Copying user jar file:///Users/reynoldsm88/workspace/spark-app/spark-app/target/scala-2.11/spark-app-assembly-0.0.1-SNAPSHOT.jar to /spark-2.2.0-bin-hadoop2.7/work/driver-20171217160823-0001/spark-app-assembly-0.0.1-SNAPSHOT.jar 
17/12/17 16:08:24 INFO Utils: Copying /Users/reynoldsm88/workspace/spark-app/spark-app/target/scala-2.11/spark-app-assembly-0.0.1-SNAPSHOT.jar to /spark-2.2.0-bin-hadoop2.7/work/driver-20171217160823-0001/spark-app-assembly-0.0.1-SNAPSHOT.jar 
17/12/17 16:08:24 INFO DriverRunner: Killing driver process! 
17/12/17 16:08:24 WARN Worker: Driver driver-20171217160823-0001 failed with unrecoverable exception: java.nio.file.NoSuchFileException: /Users/reynoldsm88/workspace/spark-app/spark-app/target/scala-2.11/spark-app-assembly-0.0.1-SNAPSHOT.jar 

내가 오해 할 수도 있지만, 나는이 두 경우 모두에서 로컬 JAR 파일에 순서대로 마스터 스파크에 제출 될 것이라고 생각 작업자 노드에 분배 될 수 있습니다. 그러나 작업자 노드가 로컬 파일 시스템에서로드하려고하는 것처럼 보이는 이유는 Spark Worker가 실행중인 Docker 컨테이너가이 파일을 인식하지 못하기 때문에 문제가됩니다.

아마 어떻게 작동합니까? 내 랩톱에서 컨테이너 화 된 클러스터로 응용 프로그램을 제출하고 싶다면 Worker가 다운로드 할 수 있도록 해당 디렉토리를 볼륨이나 호스트 JAR로 마운트해야합니까?

도움이나 의견이 있으면 크게 감사하겠습니다.

답변

0

이 게시물을 게시 한 직후 나는 내 문제에 대한 해결책을 생각해 냈지만 이상적인지 또는 더 좋은 방법이 있는지 궁금해하고 있습니다.

Dockerfile

... 
VOLUME /etc/spark/apps 
... 

시작 스크립트

docker run -v /Users/reynoldsm88/spark/apps/:/etc/spark/apps --name spark-master -p 8080:8080 -p 7077:7077 -p 6066:6066 -t reynoldsm88/spark-master 

: 작업 스크립트의 일환으로 나는 도커의 호스트 볼륨으로 라를 마운트되는 디렉토리로 항아리를 복사 이것은 현재 작동하고있는 것처럼 보입니다. Spark에 API를 통해 JAR을 배포하는 방법이 있었으면 좋겠다.하지만 내 연구에서이를 놓칠 수도있다.