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

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

그러나 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

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



답변

클래스 패스 :

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


답변

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


답변

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를 지정하여이 매개 변수를 구성하여 스파크 드라이버의 클래스 경로에 포함되도록 할 수 있습니다.


답변

–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


답변

사용에 대한 제한이 있습니다 --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


답변

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


답변