클래스 패스 :
ClassPath는 제공 한 내용에 따라 영향을받습니다. 클래스 경로에 무언가를 설정하는 방법에는 두 가지가 있습니다.
spark.driver.extraClassPath
또는 --driver-class-path
드라이버를 실행하는 노드에서 추가 클래스 경로를 설정하는 별칭 입니다.
spark.executor.extraClassPath
작업자 노드에서 추가 클래스 경로를 설정합니다.
마스터와 워커 모두에 특정 JAR을 적용하려면 BOTH 플래그로 개별 JAR을 지정해야합니다.
분리 문자 :
JVM과 동일한 규칙을 따릅니다 .
- 리눅스 : 콜론
:
- 예 :
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
- Windows : 세미콜론
;
- 예 :
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"
파일 배포 :
이것은 작업을 수행하는 모드에 따라 다릅니다.
클라이언트 모드-Spark는 시작시 각 작업자 노드에 대해 파일을 배포하는 Netty HTTP 서버를 시작합니다. Spark 작업을 시작할 때 다음을 확인할 수 있습니다.
16/05/08 17:29:12 INFO HttpFileServer: HTTP File server directory is /tmp/spark-48911afa-db63-4ffc-a298-015e8b96bc55/httpd-84ae312b-5863-4f4c-a1ea-537bfca2bc2b
16/05/08 17:29:12 INFO HttpServer: Starting HTTP Server
16/05/08 17:29:12 INFO Utils: Successfully started service 'HTTP file server' on port 58922.
16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/foo.jar at http://***:58922/jars/com.mycode.jar with timestamp 1462728552732
16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/aws-java-sdk-1.10.50.jar at http://***:58922/jars/aws-java-sdk-1.10.50.jar with timestamp 1462728552767
클러스터 모드-클러스터 모드 spark에서 드라이버 프로세스를 실행할 리더 작업자 노드를 선택했습니다. 이는 작업이 마스터 노드에서 직접 실행되고 있지 않음을 의미합니다. 여기서 Spark 는 HTTP 서버를 설정 하지 않습니다 . 모든 노드에서 사용 가능한 HDFS / S3 / 기타 소스를 통해 모든 작업자 노드에서 JAR을 수동으로 사용 가능하게해야합니다.
파일에 허용되는 URI
에서 "제출 응용 프로그램" , 스파크 문서 파일에 대한 허용 접두사를 설명의 좋은 작업을 수행합니다
spark-submit을 사용하면 --jars 옵션에 포함 된 jar과 함께 응용 프로그램 jar이 자동으로 클러스터로 전송됩니다. Spark는 다음 URL 체계를 사용하여 항아리를 배포하기위한 다양한 전략을 허용합니다.
- file :-절대 경로 및 file : / URI는 드라이버의 HTTP 파일 서버에서 제공되며 모든 실행 프로그램은 드라이버 HTTP 서버에서 파일을 가져옵니다.
- hdfs :, http :, https :, ftp :-예상대로 URI에서 파일과 JAR을 풀다운합니다.
- local :-local : /로 시작하는 URI는 각 작업자 노드에 로컬 파일로 존재할 것으로 예상됩니다. 이는 네트워크 IO가 발생하지 않으며 각 작업자에게 푸시되거나 NFS, GlusterFS 등을 통해 공유되는 대용량 파일 / JAR에 적합합니다.
JAR 및 파일은 실행기 노드의 각 SparkContext에 대한 작업 디렉토리로 복사됩니다.
언급 한대로 JAR은 각 작업자 노드 의 작업 디렉토리 에 복사됩니다 . 정확히 어디입니까? 그것은이다 일반적 에서 /var/run/spark/work
이처럼 그들을 볼 수 있습니다 :
drwxr-xr-x 3 spark spark 4096 May 15 06:16 app-20160515061614-0027
drwxr-xr-x 3 spark spark 4096 May 15 07:04 app-20160515070442-0028
drwxr-xr-x 3 spark spark 4096 May 15 07:18 app-20160515071819-0029
drwxr-xr-x 3 spark spark 4096 May 15 07:38 app-20160515073852-0030
drwxr-xr-x 3 spark spark 4096 May 15 08:13 app-20160515081350-0031
drwxr-xr-x 3 spark spark 4096 May 18 17:20 app-20160518172020-0032
drwxr-xr-x 3 spark spark 4096 May 18 17:20 app-20160518172045-0033
내부를 살펴보면 배포 한 모든 JAR이 다음과 같이 표시됩니다.
[*@*]$ cd /var/run/spark/work/app-20160508173423-0014/1/
[*@*]$ ll
total 89988
-rwxr-xr-x 1 spark spark 801117 May 8 17:34 awscala_2.10-0.5.5.jar
-rwxr-xr-x 1 spark spark 29558264 May 8 17:34 aws-java-sdk-1.10.50.jar
-rwxr-xr-x 1 spark spark 59466931 May 8 17:34 com.mycode.code.jar
-rwxr-xr-x 1 spark spark 2308517 May 8 17:34 guava-19.0.jar
-rw-r--r-- 1 spark spark 457 May 8 17:34 stderr
-rw-r--r-- 1 spark spark 0 May 8 17:34 stdout
영향을받는 옵션 :
가장 중요한 것은 우선 순위 입니다. 코드를 통해 속성을 전달하면를 통해 지정하는 옵션보다 우선합니다 spark-submit
. 이것은 Spark 설명서에 언급되어 있습니다.
플래그 또는 속성 파일에 지정된 값은 응용 프로그램으로 전달되어 SparkConf를 통해 지정된 값과 병합됩니다. SparkConf에 직접 설정된 속성이 가장 높은 우선 순위를 갖는 다음 spark-submit 또는 spark-shell에 전달 된 플래그, spark-defaults.conf 파일의 옵션
따라서 적절한 값으로 해당 값을 설정해야합니다. 따라서 다른 값보다 우선 순위가 높아도 놀라지 않습니다.
문제의 각 옵션을 분석 할 수 있습니다.
--jars
vs SparkContext.addJar
: 이들은 동일하며, 하나는 Spark 제출을 통해 설정되고 하나는 코드를 통해 설정됩니다. 더 잘 어울리는 것을 선택하십시오. 주목해야 할 한 가지 중요한 사항은 이러한 옵션 중 하나를 사용해도 JAR이 드라이버 / 실행자 클래스 경로에 추가되지 않으므로extraClassPath
두 구성 모두 에서 구성을 사용하여 명시 적으로 추가해야한다는 것 입니다.
SparkContext.addJar
vs SparkContext.addFile
: 코드와 함께 사용해야 하는 종속성 이있는 경우 전자를 사용하십시오 . 코드에서 런타임 종속성이 아닌 임의의 파일을 작업자 노드로 단순히 전달하려는 경우 후자를 사용하십시오.
--conf spark.driver.extraClassPath=...
또는 --driver-class-path
: 별명입니다. 어떤 것을 선택하든 상관 없습니다.
--conf spark.driver.extraLibraryPath=..., or --driver-library-path ...
위와 동일, 별명.
--conf spark.executor.extraClassPath=...
: uber JAR에 포함될 수없는 종속성 (예 : 라이브러리 버전간에 컴파일 시간 충돌이 있기 때문에)이 있고 런타임시로드해야하는 종속성이있는 경우이를 사용하십시오.
--conf spark.executor.extraLibraryPath=...
이것은 java.library.path
JVM 의 옵션 으로 전달됩니다 . JVM에 보이는 라이브러리 경로가 필요할 때 이것을 사용하십시오.
간단하게하기 위해 동시에 3 가지 기본 옵션을 사용하여 추가 응용 프로그램 jar 파일을 추가 할 수 있다고 가정해도 안전합니까?
클러스터 모드가 아닌 클라이언트 모드에 대해서만 안전하게 가정 할 수 있습니다. 내가 말했듯이 또한 당신이 제시 한 예에는 약간의 중복 된 주장이 있습니다. 예를 들어, JAR을 전달하는 --driver-library-path
것은 쓸모가 없습니다. JAR을 extraClassPath
클래스 경로에 넣으려면 전달해야합니다 . 궁극적으로 드라이버와 작업자 모두에 외부 JAR을 배포 할 때 수행하려는 작업은 다음과 같습니다.
spark-submit --jars additional1.jar,additional2.jar \
--driver-class-path additional1.jar:additional2.jar \
--conf spark.executor.extraClassPath=additional1.jar:additional2.jar \
--class MyClass main-application.jar