programing

스파크 작업에 JAR 파일 추가 - 스파크 제출

prostudy 2022. 5. 1. 20:13
반응형

스파크 작업에 JAR 파일 추가 - 스파크 제출

사실... 그건 꽤 많이 논의되었어.

하지만, 항아리/실행자/운전자 구성 또는 옵션에서 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. 잊지 말아야 할 것은 스파크 트랩의 마지막 매개 변수 또한 .jar 파일이라는 것이다.

주요 Apache Spark 문서, 특히 제출 방법, 사용 가능한 옵션JavaDoc 문서를 어디서 찾을 수 있는지 알고 있다.그러나 그것은 부분적으로 대답되었지만 여전히 나에게 꽤 많은 구멍들을 남겼다.

나는 그것이 그렇게 복잡하지 않고, 누군가가 나에게 분명하고 간결한 대답을 해줄 수 있기를 바란다.

로또로 보이는 것 .--jars, 그리고SparkContext addJar그리고addFile메소드는 자동으로 파일을 배포하는 반면, 다른 옵션은 ClassPath만 수정한다.

단순성을 위해 세 가지 주요 옵션을 사용하여 애플리케이션 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을 마스터 플래그와 작업자 모두에 적용하려면 이러한 JAR을 BOY 플래그에 별도로 지정해야 한다.

구분 문자:

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 서버를 실행한다.스파크 작업을 시작하면 다음과 같은 것을 알 수 있다.

    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. 클러스터 모드 - 클러스터 모드에서 스파크는 드라이버 프로세스를 실행할 리더 작업자 노드를 선택했다.이것은 작업이 마스터 노드에서 직접 실행되지 않음을 의미한다.여기서 스파크는 HTTP 서버를 설정하지 않을 이다.모든 노드에서 사용할 수 있는 HDFS, S3 또는 기타 소스를 통해 모든 작업자 노드에서 JAR 파일을 수동으로 제공해야 한다.

파일에 대해 승인된 URI

"응용 프로그램 제출"에서 스파크 설명서는 파일에 대해 허용되는 접두사를 잘 설명한다.

스파크 제출을 사용할 때 --jars 옵션에 포함된 모든 병과 함께 응용 프로그램 병과 함께 자동으로 클러스터로 전송된다.스파크는 다음과 같은 URL 체계를 사용하여 병 확산을 위한 다른 전략을 허용한다.

  • 파일: - 절대 경로 및 파일:/ URI는 드라이버의 HTTP 파일 서버에서 제공되며, 모든 실행자는 드라이버 HTTP 서버에서 파일을 꺼낸다.
  • hdfs:, http:, https:, ftp: - 예상대로 URI에서 파일 및 JAR 풀다운
  • local: - local:/로 시작하는 URI는 각 작업자 노드에 로컬 파일로 존재할 것으로 예상된다.즉, 네트워크 IO가 발생하지 않으며, 대용량 파일/J에도 잘 작동한다.각 작업자에게 푸시되거나 NFS, Gluster를 통해 공유되는 ARFS 등

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스파크 설명서에 언급된 내용은 다음과 같다.

플래그 또는 속성 파일에 지정된 값은 응용 프로그램에 전달되고 스파크콘프를 통해 지정된 값과 병합된다.SparkConf에 직접 설정된 속성이 가장 높은 우선 순위를 차지한 다음 플래그가 스파크 제출 또는 스파크 쉘에 전달된 다음 스파크-defaults.conf 파일의 옵션

그러므로 반드시 적절한 장소에 그 값을 설정하여, 한 사람이 다른 사람보다 우선할 때 놀라지 않도록 하라.

질문의 각 옵션을 분석해보자.

  • --jarsSparkContext.addJar: 이것들은 동일하다.스파크 제출을 통한 설정과 코드를 통한 설정만 있다.너에게 더 잘 어울리는 것을 골라라.한 가지 중요한 점은 이러한 옵션 중 하나를 사용해도 드라이버/실행자 클래스 경로에 JAR 파일이 추가되지 않는다는 점이다.다음을 사용하여 명시적으로 추가해야 함extraClassPath둘 다에 대한 구성.
  • SparkContext.addJarSparkContext.addFile: 코드와 함께 사용해야 하는 종속성이 있는 경우 전자를 사용하십시오.코드에서 런타임 종속성이 아닌 작업자 노드로 임의 파일을 전달하려면 후자를 사용하십시오.
  • --conf spark.driver.extraClassPath=...또는--driver-class-path: 이것들은 별칭이고, 어느 것을 선택하든 상관없다.
  • --conf spark.driver.extraLibraryPath=..., or --driver-library-path ...위와 같은 별칭이다.
  • --conf spark.executor.extraClassPath=...: über JAR에 포함될 수 없는 종속성(예: 라이브러리 버전 간에 컴파일 시간 충돌이 있기 때문에)이 있고 런타임에 로드해야 하는 경우 이 옵션을 사용하십시오.
  • --conf spark.executor.extraLibraryPath=...이것은 다음과 같이 전달된다.java.library.pathJVM에 대한 옵션.JVM에 표시되는 라이브러리 경로가 필요한 경우 이 옵션을 사용하십시오.

단순성을 위해 다음 3가지 주요 옵션을 사용하여 응용 프로그램 jar 파일을 동시에 추가할 수 있다고 가정해도 괜찮으십니까?

클러스터 모드가 아닌 클라이언트 모드에 대해서만 안전하게 가정할 수 있다.아까도 말씀드렸지만.또한, 당신이 준 예에는 몇 가지 중복되는 주장이 있다.예를 들어 JAR 파일 전달--driver-library-path쓸모가 없다.에 넘겨야 한다.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

아파치 스파크 2.1.0의 또 다른 접근법은--conf spark.driver.userClassPathFirst=true사용자가 JAR 파일에 우선 순위를 부여함으로써 종속성 로드의 우선 순위 및 그에 따라 스파크 작업의 동작을 변경하는 spark-submit 동안--jars옵션의

JAR 파일 및 클래스 경로와 관련된 기타 구성 가능한 스파크 옵션(예:yarn전개 모드는 다음과 같다.

스파크 설명서에서

불꽃.야간.jars

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

불꽃.야간.archive

YARN 캐시에 배포하기 위해 필요한 스파크 항아리가 들어 있는 보관소.설정된 경우, 이 구성은 spark.yarn.jars를 대체하고 보관은 애플리케이션의 모든 용기에 사용된다.아카이브는 루트 디렉터리에 jar 파일을 포함해야 한다.이전 옵션과 마찬가지로 아카이브도 HDFS에서 호스팅하여 파일 배포 속도를 높일 수 있다.

사용자는 JAR 파일을 지정하도록 이 매개 변수를 구성할 수 있으며, JAR 파일은 스파크 드라이버의 클래스 경로에 포함된다.

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

지정하면--driver-class-path실 클러스터 모드에서 실행하면 드라이버 클래스가 업데이트되지 않음탭 환경 아래의 스파크 UI 또는 스파크 히스토리 서버에서 클래스 경로가 업데이트되었는지 확인할 수 있다.

하고 실 은 JAR을 사용하는 이었습니다.--conf옵션의드라이버 및 실행자 클래스 경로를 다음으로 전달하는 것이 좋다.--conf스파크 세션 객체 자체에 추가되며, 그러한 경로는 스파크 구성에 반영된다.그러나 JAR 파일을 클러스터 전체의 동일한 경로에 배치하십시오.

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

--master yarn-cluster와 함께 spark-submit을 사용하면 --jars 옵션에 포함된 JAR 파일과 함께 애플리케이션 JAR 파일이 클러스터로 자동 전송된다.--jars 다음에 제공된 URL은 쉼표로 구분해야 한다.드라이버 및 실행자 클래스 경로에 포함된 목록

예:

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

참조

응용 프로그램 제출 중

스파크 제출 유틸리티를 사용하여 Apache Spark 작업을 제출하는 동안 옵션도 있지만,--jars이 옵션을 사용하면 JAR 파일을 스파크 애플리케이션에 전달할 수 있다.

내가 알고 있는 것은 병 하나를 더하는 것이다.--jars옵션은 자동으로 클래스 경로에도 추가한다.

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

그 목록은 드라이버와 실행자 클래스 경로에 포함되어 있다.

참조URL: https://stackoverflow.com/questions/37132559/add-jar-files-to-a-spark-job-spark-submit

반응형