스파크 작업에 항아리 추가-스파크 제출


158

사실 ... 그것은 꽤 많이 논의되었습니다.

그러나 jar / executor / driver 구성 또는 옵션에서 jar 참조 복제를 포함하여 많은 모호성과 일부 답변이 제공됩니다.

모호하거나 생략 된 세부 사항

다음의 모호성, 불분명하거나 생략 된 세부 사항은 각 옵션에 대해 명확해야합니다.

  • ClassPath가 영향을받는 방법
    • 운전사
    • 집행자 (작업 실행)
    • 양자 모두
    • 전혀
  • 분리 문자 : 쉼표, 콜론, 세미콜론
  • 제공된 파일이 자동으로 배포되는 경우
    • 작업 (각 실행자에게)
    • 원격 드라이버 용 (클러스터 모드에서 실행 된 경우)
  • 허용되는 URI 유형 : 로컬 파일, hdfs, http 등
  • 복사 한 경우 그 위치는 일반적인 위치 (HDFS, 지역?)

영향을주는 옵션 :

  1. --jars
  2. SparkContext.addJar(...) 방법
  3. SparkContext.addFile(...) 방법
  4. --conf spark.driver.extraClassPath=... 또는 --driver-class-path ...
  5. --conf spark.driver.extraLibraryPath=...또는 --driver-library-path ...
  6. --conf spark.executor.extraClassPath=...
  7. --conf spark.executor.extraLibraryPath=...
  8. spark-submit의 마지막 매개 변수는 .jar 파일이기도합니다.

주 스파크 문서를 어디에서 찾을 수 있는지, 특히 제출 방법 , 사용 가능한 옵션JavaDoc에 대해 알고 있습니다 . 그러나 부분적으로도 응답했지만 여전히 약간의 구멍이 남아 있습니다.

나는 그것이 그렇게 복잡한 것이 아니며 누군가가 명확하고 간결한 대답을 줄 수 있기를 바랍니다.

문서에서 짐작하면 --jars, 및 SparkContext addJaraddFile메소드는 파일을 자동으로 배포 하는 것으로 보이며 다른 옵션은 ClassPath를 수정하는 것입니다.

간단하게하기 위해 동시에 3 가지 기본 옵션을 사용하여 추가 응용 프로그램 jar 파일을 추가 할 수 있다고 가정해도 안전합니까?

spark-submit --jar additional1.jar,additional2.jar \
  --driver-library-path additional1.jar:additional2.jar \
  --conf spark.executor.extraLibraryPath=additional1.jar:additional2.jar \
  --class MyClass main-application.jar

다른 게시물대한 답변 에서 멋진 기사를 찾았습니다 . 그러나 새로 배운 것은 없습니다. 포스터는 로컬 드라이버 (원사 클라이언트)와 원격 드라이버 (원사 클러스터)의 차이점에 대해 잘 설명합니다. 명심해야합니다.


1
어떤 클러스터 관리자를 사용하고 있습니까? 독립형 / YARN / 메소?
유발 Itzchakov

어떤. 나는 이것을 원본 문서에 대한 설명으로 의도합니다. 나는 주로 독립형 클러스터, 단일 인스턴스, 원사 클라이언트, 원사 클러스터를 사용하고 있습니다. 다른 사람들은 Mesos를 사용하고있을 수 있습니다. 이것에 대해 블로그 에서 좋은 독창적 인 조사를 한 같습니다. 필자는 배포 프로세스를 단순화하기 위해 셰이더를 사용하여 Uber jar을 만드는 대부분의 경우와 거의 동일한 결과를 얻었습니다.
YoYo

1
Spark Standalone을 배포하는 방법에 대한 답변을 게시하겠습니다.
유발 Itzchakov

6
귀하의 모든 질문에 대한 답변을 드리겠습니다. 도움이
되길 바랍니다

@Yuval Itzchakov는 Yoyo가 언급 한 것처럼 음영 처리 된 항아리를 사용하여 모든 종속성 (예 : 케이스 클래스 및 사용중인 다른 항아리)을 묶습니다. 여러 항아리가 필요한 상황이 언제 발생하는지 이해하려고합니다. 나는 항상 여러 항아리를 1 uber 항아리에 묶을 수 있음을 의미합니다. 모든 의존성을 묶은 음영 처리 된 항아리로 계속 살 수없는 이유는 무엇입니까?
Sheel Pancholi

답변:


177

클래스 패스 :

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"

파일 배포 :

이것은 작업을 수행하는 모드에 따라 다릅니다.

  1. 클라이언트 모드-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
  2. 클러스터 모드-클러스터 모드 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 파일의 옵션

따라서 적절한 값으로 해당 값을 설정해야합니다. 따라서 다른 값보다 우선 순위가 높아도 놀라지 않습니다.

문제의 각 옵션을 분석 할 수 있습니다.

  • --jarsvs SparkContext.addJar: 이들은 동일하며, 하나는 Spark 제출을 통해 설정되고 하나는 코드를 통해 설정됩니다. 더 잘 어울리는 것을 선택하십시오. 주목해야 할 한 가지 중요한 사항은 이러한 옵션 중 하나를 사용해도 JAR이 드라이버 / 실행자 클래스 경로에 추가되지 않으므로extraClassPath 두 구성 모두 에서 구성을 사용하여 명시 적으로 추가해야한다는 것 입니다.
  • SparkContext.addJarvs 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.pathJVM 의 옵션 으로 전달됩니다 . 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

4
위대하고 포괄적 인 답변. 감사합니다. 당신은 또한에 배포 더 모범 사례에 대해 말할 수있는 동네 짱 JAR의 비교는 외부 JAR 종속성 (외부 폴더에 libs와 및에 나열된 MANIFEST.MF파일)?
jsosnowski

2
@jsosnowski 일반적으로 uber JAR로 해결하기가 매우 복잡한 충돌이있을 때만 외부 항아리를 사용하는 것을 연기합니다. 보통 SBT를 사용 assemblyMergeStrategy하고 충돌이있을 경우 필요한 클래스를 선택하면됩니다. 나는 일반적으로 같은 것을 추천합니다.
Yuval Itzchakov

9
@ yuval-itzchakov 대단히 유용한 답변에 감사드립니다. 한 가지 점은 내가했던 것과 같은 실수를 저지른 다른 사람들을 돕기 위해 강조하고 싶습니다. --jars 인수는 jar을 클러스터의 각 시스템으로 만 전송합니다. 클래스 경로 검색에 사용하도록 spark에 지시하지 않습니다. --driver-class-path (또는 유사한 인수 또는 구성 매개 변수)도 필요합니다. 나는 처음에 그들이 같은 일을하는 다른 방법이라고 생각했다.
Tim Ryan

1
@TimRyan 확실히. 답의 마지막 부분을 보면 jar --jars 플래그 드라이버 / 실행자 클래스 경로에 모두 전달 합니다.
Yuval Itzchakov

1
결국 환경 변수 를 주입zeppelin-env.sh 하고에 추가 하는 방법을 찾았 --jars습니다 SPARK_SUBMIT_OPTIONS. 효과가있었습니다. 내가 사용하는 URI 형식은 --jars=local:///mnt/dir/file.jar입니다.
Mike

4

또 다른 방법은 spark 2.1.0사용하는 --conf spark.driver.userClassPathFirst=true사용자가 가지는 클래스 경로에 추가 된 항아리에 우선 순위를 부여하여, 스파크 - 작업의 동작을 종속 부하의 우선 순위를 변경하고, 따라서 어떤 제출 스파크 동안 --jars옵션을 선택합니다.


2
스파크를 차단할 수 있으므로주의해야합니다. 이것이 마지막 옵션 솔루션이어야합니다. 확실하지는 않지만 원사 클라이언트 모드에서 사용할 때 원사와 인터페이스하는 레이어를 방해 할 수 있습니다.
YoYo April

충고 고맙습니다. 이전 버전의 서버에 분명히 존재하는 1 개의 jar의 우선 순위를 지정하는 방법이 있습니까?하지만 물리적으로 바꿀 수 없으며 사용하고 싶지 않다는 것을 알고 있습니까?
Stanislav

1
이 경우 제안한대로 정확하게 시도 할 수 있습니다. 그것이 절대 아니오라고 말하지 않았습니다. 또한 옵션은 '실험적'으로 표시됩니다.주의해야 할 경고입니다! 한 버전의 라이브러리를 다른 버전보다 우선 순위를 지정하는 안전한 방법은 없습니다. 일부 구현에서는 라이브러리 중 하나를 다른 네임 스페이스로 이동하여이 문제를 해결하므로 두 버전을 동시에 사용할 수 있습니다.
YoYo

1

yarn배치 모드 인 경우 jar 및 클래스 경로와 관련된 기타 구성 가능한 Spark 옵션 은 다음과 같습니다
. spark 설명서에서

spark.yarn.jars

YARN 컨테이너에 배포 할 Spark 코드가 포함 된 라이브러리 목록입니다. 기본적으로 Spark on YARN은 로컬로 설치된 Spark jar을 사용하지만 Spark jar은 HDFS에서 세계가 읽을 수있는 위치에있을 수도 있습니다. 이를 통해 YARN은 노드에 캐시하여 애플리케이션을 실행할 때마다 배포 할 필요가 없습니다. 예를 들어 HDFS의 jar을 가리 키려면이 구성을 hdfs : /// some / path로 설정하십시오. 글로브가 허용됩니다.

spark.yarn.archive

YARN 캐시로 배포하기 위해 필요한 Spark jar을 포함하는 아카이브. 설정된 경우이 구성은 spark.yarn.jars를 대체하며 아카이브는 모든 응용 프로그램의 컨테이너에서 사용됩니다. 아카이브는 루트 디렉토리에 jar 파일을 포함해야합니다. 이전 옵션과 마찬가지로 아카이브를 HDFS에서 호스팅하여 파일 배포 속도를 높일 수도 있습니다.

사용자는 jar를 지정하여이 매개 변수를 구성하여 스파크 드라이버의 클래스 경로에 포함되도록 할 수 있습니다.


1

--master yarn-cluster와 함께 spark-submit을 사용하는 경우 --jars 옵션에 포함 된 jar과 함께 응용 프로그램 jar이 클러스터로 자동 전송됩니다. --jar 다음에 제공된 URL은 쉼표로 구분해야합니다. 이 목록은 드라이버 및 실행기 클래스 경로에 포함됩니다.

예 :

spark-submit --master yarn-cluster --jars ../lib/misc.jar, ../lib/test.jar --class MainClass MainApp.jar

https://spark.apache.org/docs/latest/submitting-applications.html


0

사용에 대한 제한이 있습니다 --jars:의 위치에 디렉토리를 지정하려면jar/xml 파일 디렉토리 확장을 허용하지 않습니다. 이는 각 jar에 대한 절대 경로를 지정해야하는 경우를 의미합니다.

--driver-class-path원사 클러스터 모드에서 지정 하고 실행중인 경우 드라이버 클래스가 업데이트되지 않습니다. 탭 환경에서 spark ui 또는 spark history 서버에서 클래스 경로가 업데이트되었는지 여부를 확인할 수 있습니다.

디렉토리 확장을 포함하고 원사 클러스터 모드에서 작동하는 jar를 전달하는 데 도움이되는 --conf옵션 이 옵션 이었습니다 . 드라이버 및 실행기 클래스 경로를로 전달하는 것이 좋습니다.이 경로는 --conf스파크 세션 객체 자체에 추가되고 해당 경로는 스파크 구성에 반영됩니다. 그러나 항아리를 클러스터의 동일한 경로에 배치하십시오.

spark-submit \
  --master yarn \
  --queue spark_queue \
  --deploy-mode cluster    \
  --num-executors 12 \
  --executor-memory 4g \
  --driver-memory 8g \
  --executor-cores 4 \
  --conf spark.ui.enabled=False \
  --conf spark.driver.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
  --conf spark.hadoop.mapred.output.dir=/tmp \
  --conf spark.executor.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
  --conf spark.hadoop.mapreduce.output.fileoutputformat.outputdir=/tmp

새해 복 많이 받으세요!
YoYo

새해 복 많이 받으세요 YoYo
Tanveer

0

spark-submit 유틸리티를 사용하여 spark 작업을 제출하는 동안 옵션이 --jars있습니다. 이 옵션을 사용하여 jar 파일을 spark 응용 프로그램으로 전달할 수 있습니다.


—jar옵션은 원래 포스터에서 언급되었으며 둘 이상의 답변으로 훨씬 자세하게 논의되었습니다. 새로운 것을 제공하고있는 것 같지 않습니까?
YoYo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.